บทเรียน 31/31: วัดอุณหภูมิและความชื้นผ่าน Wi-Fi โดยใช้ DHT11 และ ESP01 ชุด SunFounder
คู่มือโปรเจกต์นี้จะพาคุณไปเรียนรู้การสร้างระบบตรวจวัดอุณหภูมิและความชื้นแบบไร้สายโดยใช้โมดูล ESP8266 (ESP-01) และเซนเซอร์ DHT11 เมื่อเสร็จสิ้น คุณจะได้อุปกรณ์ที่สร้างเว็บเซิร์ฟเวอร์ของตัวเอง ทำให้คุณสามารถดูค่าการวัดแบบเรียลไทม์จากอุปกรณ์ใดก็ได้ที่เชื่อมต่อกับเครือข่ายท้องถิ่นของคุณ เช่น สมาร์ทโฟน แท็บเล็ต หรือคอมพิวเตอร์ นี่คือโปรเจกต์ IoT พื้นฐานที่แสดงให้เห็นถึงการเชื่อมโยงโลกทางกายภาพของเซนเซอร์เข้ากับโลกดิจิทัลของอินเทอร์เฟซเว็บ
ทักษะที่คุณเรียนรู้ที่นี่สามารถนำไปประยุกต์ใช้ได้อย่างกว้างขวาง การตั้งค่านี้สามารถปรับใช้สำหรับการใช้งานจริงได้หลากหลายรูปแบบ เช่น:
- สร้างสถานีตรวจสอบระยะไกลสำหรับเรือนกระจกหรือสวน เพื่อให้แน่ใจว่าสภาพการเจริญเติบโตเหมาะสมที่สุด
- สร้างระบบสมาร์ทโฮมอย่างง่ายเพื่อตรวจสอบสภาพอากาศในห้องเฉพาะ เช่น ห้องเก็บไวน์หรือห้องเด็กอ่อน
- ตั้งค่าระบบบันทึกข้อมูลสิ่งแวดล้อมต้นทุนต่ำสำหรับโปรเจกต์วิทยาศาสตร์ของโรงเรียน
- พัฒนาระบบแจ้งเตือนหรือระบบรักษาความปลอดภัยพื้นฐานที่สามารถแจ้งให้คุณทราบเมื่ออุณหภูมิเปลี่ยนแปลงอย่างกะทันหัน
ฮาร์ดแวร์และอุปกรณ์ประกอบ
เพื่อทำตามโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้ อุปกรณ์หลักคือโมดูล ESP8266 และเซนเซอร์ DHT11 แต่อุปกรณ์อื่นๆ ก็จำเป็นสำหรับการเขียนโปรแกรมและการจ่ายไฟให้โมดูล
- โมดูล ESP8266 (ESP-01S): ไมโครคอนโทรลเลอร์หลักที่มีความสามารถ Wi-Fi ในตัว
- เซนเซอร์อุณหภูมิและความชื้น DHT11: เซนเซอร์ที่ใช้วัดข้อมูลสภาพแวดล้อม
- บอร์ด Arduino Uno (สำหรับแปลง USB เป็น Serial): ในโปรเจกต์นี้ บอร์ด Arduino หลักไม่ได้ใช้เพื่อการประมวลผล แต่ใช้ชิปแปลง USB เป็น Serial เพื่อเขียนโปรแกรมให้โมดูล ESP8266
- ตัวต้านทาน 330 โอห์ม: ใช้สำหรับการทดสอบไฟกระพริบ LED ครั้งแรกเพื่อจำกัดกระแส
- ตัวต้านทาน 1k โอห์มถึง 10k โอห์ม: ตัวต้านทานแบบ Pull-up สำหรับสายข้อมูลของเซนเซอร์ DHT11
- LED และสายจัมเปอร์: สำหรับขั้นตอนการทดสอบและการเชื่อมต่อที่จำเป็นทั้งหมด
- เบรดบอร์ด: สำหรับสร้างการเชื่อมต่อวงจร
คู่มือการเดินสายไฟ
กระบวนการเดินสายไฟจะทำเป็นขั้นตอน ขั้นแรก เราจะตั้งวงจรพื้นฐานเพื่อเขียนโปรแกรมให้ ESP-01 ซึ่งเกี่ยวข้องกับการใช้ Arduino Uno เป็นตัวเขียนโปรแกรม วิดีโอสาธิตการตั้งค่านี้อย่างชัดเจน การเชื่อมต่อหลักมีดังนี้:
เพื่อเข้าสู่โหมดการเขียนโปรแกรม คุณต้องเชื่อมต่อพิน IO1 (GPIO1) เข้ากับกราวด์ (GND) ซึ่งจะบอกให้ ESP8266 รอรับเฟิร์มแวร์ใหม่ การเชื่อมต่ออื่นๆ สำหรับการเขียนโปรแกรมมีดังนี้:
- VCC (3.3V) ไปยัง EN (Enable): เพื่อเปิดใช้งานโมดูล
- GND ไปยัง GND: กราวด์ร่วมสำหรับวงจร
- VCC (5V) ไปยัง VCC (5V): เพื่อจ่ายไฟให้บอร์ดเขียนโปรแกรม
- RX (ESP) ไปยัง TX (Arduino): สำหรับการสื่อสารแบบ Serial จากตัวเขียนโปรแกรมไปยังโมดูล
- TX (ESP) ไปยัง RX (Arduino): สำหรับการสื่อสารแบบ Serial จากโมดูลไปยังตัวเขียนโปรแกรม
- RST (Reset) ไปยัง GND: นี่คือการเชื่อมต่อชั่วคราวที่ใช้เพื่อรีเซ็ตโมดูลหลังจากการเขียนโปรแกรม
เมื่อเขียนโปรแกรมให้ ESP-01 เสร็จแล้ว การเดินสายไฟสำหรับเซนเซอร์ก็ทำได้ง่าย เซนเซอร์ DHT11 ต้องใช้ตัวต้านทานแบบ Pull-up บนสายข้อมูลเพื่อให้การสื่อสารมีเสถียรภาพ
สำหรับการตั้งค่าเซนเซอร์ การเดินสายไฟมีดังนี้:
- DHT11 VCC (พิน 1) ไปยัง 3.3V: จ่ายไฟให้เซนเซอร์
- DHT11 DATA (พิน 2) ไปยัง GPIO2 (IO2) บน ESP-01: สายข้อมูลสำหรับการอ่านค่าจากเซนเซอร์ ควรเชื่อมต่อตัวต้านทานแบบ Pull-up ขนาด 1k โอห์มถึง 10k โอห์มระหว่างสายข้อมูลนี้กับสายไฟ 3.3V
- DHT11 GND (พิน 4) ไปยัง GND: กราวด์ร่วมสำหรับเซนเซอร์
การเตรียม Arduino IDE
เพื่อเขียนโปรแกรมให้ ESP8266 คุณต้องเพิ่มการรองรับบอร์ดลงใน Arduino IDE ก่อน ซึ่งทำได้สองขั้นตอน:
- เพิ่ม URL ของ Board Manager: ไปที่
File > Preferencesในช่อง "Additional Boards Manager URLs" วาง URL ต่อไปนี้:http://arduino.esp8266.com/stable/package_esp8266com_index.jsonแล้วคลิก "OK" - ติดตั้งแพ็คเกจบอร์ด ESP8266: ไปที่
Tools > Board > Boards Manager...ค้นหา "esp8266" หา "esp8266 by ESP8266 Community" แล้วคลิก "Install" หลังจากการติดตั้งเสร็จสิ้น คุณสามารถเลือกบอร์ดได้โดยไปที่Tools > Board > ESP8266 Boards > Generic ESP8266 Module
การติดตั้งไลบรารีเซนเซอร์ DHT
โค้ดนี้ต้องอาศัยไลบรารีเพื่อเชื่อมต่อกับเซนเซอร์ DHT11 ไลบรารีนี้ต้องติดตั้งใน Arduino IDE ของคุณ
- ไปที่
Tools > Manage Libraries... - ค้นหา "DHT sensor library"
- หาไลบรารีโดย Adafruit แล้วคลิก "Install" ไลบรารีนี้ช่วยให้การอ่านข้อมูลจากเซนเซอร์ง่ายขึ้น
โปรเจกต์ 1: การทดสอบไฟ LED กระพริบ
ก่อนที่จะลงลึกไปในเซนเซอร์ สิ่งสำคัญคือต้องตรวจสอบว่าคุณสามารถเขียนโปรแกรม ESP-01 ได้สำเร็จ ซึ่งทำได้ด้วยตัวอย่าง "Blink" แบบคลาสสิก วิดีโอแสดงขั้นตอนการส่งออกไบนารีที่คอมไพล์แล้วและการใช้ไฟล์แบตช์แยกต่างหากเพื่อแฟลช ซึ่งเป็นวิธีแก้ปัญหาสำหรับการตั้งค่า USB-to-serial ที่เฉพาะเจาะจง เป้าหมายคือการเห็น LED บนบอร์ดกระพริบ เพื่อยืนยันว่าสายการเขียนโปรแกรมทำงานได้ ในการรันโมดูลหลังจากการเขียนโปรแกรม คุณต้องถอดสายไฟที่เชื่อมต่อ IO1 กับ GND ออก แล้วจึงเชื่อมต่อพิน RST กับ GND ชั่วครู่เพื่อรีเซ็ตโมดูล
โปรเจกต์ 2: การอ่าน DHT11 บน Serial Monitor
เมื่อยืนยันการเขียนโปรแกรมแล้ว ขั้นตอนถัดไปคือการเชื่อมต่อเซนเซอร์ DHT11 และอ่านข้อมูล โปรเจกต์นี้ใช้ตัวอย่าง DHTtester จากไลบรารี Adafruit DHT sensor โค้ดถูกกำหนดค่าให้ใช้พินและประเภทเซนเซอร์ที่ถูกต้อง หลังจากแฟลชโปรแกรมนี้แล้ว คุณสามารถเปิด Serial Monitor (ตั้งค่าเป็น 9600 baud) เพื่อดูค่าอุณหภูมิและความชื้น
โปรเจกต์ 3: การตั้งค่าเว็บเซิร์ฟเวอร์
โปรเจกต์สุดท้ายรวมทุกอย่างเข้าด้วยกัน ESP8266 ถูกเขียนโปรแกรมให้เชื่อมต่อกับเครือข่าย Wi-Fi ในพื้นที่ของคุณและโฮสต์หน้าเว็บง่ายๆ หน้านี้แสดงค่าอุณหภูมิและความชื้นแบบเรียลไทม์ โค้ดนี้เป็นเวอร์ชันที่ดัดแปลงจากตัวอย่าง "HelloServer" ของ ESP8266 วิดีโอสาธิตวิธีการเข้าถึงข้อมูลนี้โดยการป้อนที่อยู่ IP ของอุปกรณ์หรือชื่อ mDNS (เช่น robojaxDHT.local) ลงในเว็บเบราว์เซอร์บนอุปกรณ์ใดๆ ที่เชื่อมต่อกับเครือข่ายเดียวกัน
คำอธิบายโค้ด
เนื่องจากโปรแกรมเต็มมีให้ดาวน์โหลด ส่วนนี้จึงเน้นที่ตัวแปรหลักที่ผู้ใช้สามารถกำหนดค่าได้ ซึ่งคุณจะต้องปรับเปลี่ยนสำหรับเครือข่ายและความต้องการของคุณเอง โค้ดนี้เป็นเวอร์ชันที่ดัดแปลงจากตัวอย่าง "HelloServer" ของ ESP8266 ตรรกะหลักเกี่ยวข้องกับการอ่านเซนเซอร์และการจัดรูปแบบหน้า HTML เพื่อแสดงข้อมูล
นี่คือส่วนสำคัญของโค้ดที่คุณจะต้องแก้ไข:
// ข้อมูลรับรอง Wi-Fi - คุณต้องเปลี่ยนสิ่งเหล่านี้
const char* ssid = "YourWiFiSSID"; // แทนที่ด้วยชื่อเครือข่าย Wi-Fi ของคุณ
const char* password = "YourWiFiPassword"; // แทนที่ด้วยรหัสผ่าน Wi-Fi ของคุณ
นี่คือส่วนที่สำคัญที่สุดที่ต้องเปลี่ยน ตัวแปร ssid และ password ต้องตรงกับเครือข่าย Wi-Fi ในพื้นที่ของคุณอย่างแน่นอน ชื่อ Wi-Fi คำนึงถึงตัวพิมพ์เล็กใหญ่ ดังนั้นโปรดตรวจสอบให้ถูกต้อง
// การกำหนดค่าเซนเซอร์ DHT11
#define DHTPIN 2 // พินดิจิทัลที่เชื่อมต่อกับเซนเซอร์ DHT (GPIO2)
#define DHTTYPE DHT11 // ประเภทเซนเซอร์ DHT 11
คำนิยามเหล่านี้ตั้งค่าเซนเซอร์ DHTPIN คือพิน GPIO บน ESP8266 ที่เชื่อมต่อสายข้อมูลของเซนเซอร์ (ซึ่งคือ GPIO2 ในคู่มือนี้) DHTTYPE กำหนดรุ่นเซนเซอร์เฉพาะ หากคุณใช้เซนเซอร์ DHT22 คุณจะต้องเอาเครื่องหมายคอมเมนต์ออกจากบรรทัดสำหรับ DHT22 และใส่เครื่องหมายคอมเมนต์ที่บรรทัดสำหรับ DHT11
// ตัวแปรที่กำหนดค่าได้
const long interval = 3000; // มิลลิวินาทีระหว่างการอ่านเซนเซอร์
char temperature[] = "00.0";
char humidity[] = "00.0";
ตัวแปร interval ควบคุมความถี่ในการอ่านเซนเซอร์และการอัปเดตหน้าเว็บ ค่าเริ่มต้นคือ 3000 มิลลิวินาที (3 วินาที) คุณสามารถเพิ่มเป็นค่าที่สูงขึ้นเช่น 5000 หรือ 10000 เพื่อลดความถี่ในการอัปเดต
โค้ดยังรวมฟังก์ชันที่จัดรูปแบบการอ่านอุณหภูมิ คุณสามารถเลือกแสดงอุณหภูมิเป็นเซลเซียสหรือฟาเรนไฮต์โดยการแก้ไขตรรกะในฟังก์ชัน sendTemperature() วิดีโออธิบายว่าตัวแปร Tvalue ถูกตั้งค่าให้เก็บค่าอ่านเป็นเซลเซียส แต่คุณสามารถเปลี่ยนให้ใช้ตัวแปรฟาเรนไฮต์ F แทนได้
การสาธิตโปรเจกต์สด
ในวิดีโอ มีการสาธิตโปรเจกต์ที่เสร็จสมบูรณ์ หลังจากแฟลชโค้ดและรีเซ็ตโมดูลแล้ว มันจะเชื่อมต่อกับเครือข่าย Wi-Fi Serial Monitor แสดงสถานะการเชื่อมต่อและที่อยู่ IP ของอุปกรณ์ โดยการนำทางไปยังที่อยู่ IP นี้ในเว็บเบราว์เซอร์ คุณจะเห็นหน้าเว็บง่ายๆ ที่แสดงอุณหภูมิและความชื้นปัจจุบัน การสาธิตแสดงค่าที่อัปเดตแบบเรียลไทม์ เมื่อเซนเซอร์ DHT11 ถูกให้ความร้อนด้วยปืนความร้อน ค่าอุณหภูมิบนหน้าเว็บจะเพิ่มขึ้นตามไปด้วย หากสายข้อมูลของเซนเซอร์ถูกถอดออก หน้าจะแสดง "None" สำหรับค่าเซนเซอร์ ซึ่งเป็นคุณสมบัติที่มีประโยชน์สำหรับการแก้ไขปัญหา
บทต่างๆ
- [00:00] แนะนำโปรเจกต์
- [01:33] ทำความเข้าใจ ESP8266 และเว็บเซิร์ฟเวอร์
- [05:47] การเดินสาย ESP-01 สำหรับการเขียนโปรแกรม
- [08:51] การติดตั้งการรองรับบอร์ด ESP8266 ใน Arduino IDE
- [11:47] โปรเจกต์ 1: การกระพริบ LED ด้วย ESP8266
- [20:28] การเดินสายเซนเซอร์ DHT11
- [22:34] การติดตั้งไลบรารี DHT Sensor
- [23:13] โปรเจกต์ 2: การอ่าน DHT11 บน Serial Monitor
- [30:10] คำอธิบายโค้ดสำหรับโปรเจกต์เว็บเซิร์ฟเวอร์
- [36:14] โปรเจกต์ 3: การแฟลชโค้ดเว็บเซิร์ฟเวอร์
- [38:42] การสาธิต: การดูอุณหภูมิผ่าน Wi-Fi
- [41:43] บทสรุปและการแก้ไขปัญหา
/*
* Display temperature using DHT11, DHT22 with NodeMCU ESP8266
* over WiFi in local network on computer o mobile devices
*
* Written by Ahmad Shamshiri on Sep 27, 2019
* in Ajax, Ontario, Canada
* Watch video instruciton for this video: https://youtu.be/1A4-6hDARQc
*
* I have combined DHT library of Adafruit with ESP8266 WebServer both links
* Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
* and
* ESP8266 on GitHub : https://github.com/esp8266/Arduino
* Download and resource page https://robojax.com/RJT614
*
Get this code and other Arduono codes from Robojax.com
* Code is available at https://robojax.com/RJT614
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
const int refresh=3;//3 seconds
// DHT settings starts
#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
float tValue, hValue;//
char *simipleName="robojaxDHT";//android
// ****** DHT settings end (Robojax.com )
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#ifndef STASSID
#define STASSID "Robojax" // Your WiFi SSID
#define STAPSK "100%Right" //Your WiFi password
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
ESP8266WebServer server(80);
void sendTemp() {
String page = "<!DOCTYPE html>";
page +=" <meta http-equiv='refresh' content='";
page += String(refresh);// how often temperature is read
page +="'/>";
page +="<html dir=\"rtl\">";
page +="<body>";
page +="<h1>رطوبت و حرارت توسط دی اچ تی</h1>";
page +="<p style=\"font-size:150px;\">حرارت<br/>";
page +="<span style=\"color:red; font-size:150px;\">";
page += String(tValue, 2);
page +="°C</p>";
page +="<p style=\"font-size:150px;\">رطوبت<br/>";
page +="<span style=\"color:red; font-size:150px;\">";
page += String(hValue, 2);
page +="%</p>";
page +="</body>";
page +="</html>";
server.send(200, "text/html",page);
}
void handleNotFound() {
String message = "File Not Found";
message += "URI: ";
message += server.uri();
message += "Method: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "Arguments: ";
message += server.args();
message += "";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "";
}
server.send(404, "text/plain", message);
}
void setup(void) {
// Robojax.com code for ESP8266 and DHT11 DHT22
dht.begin();
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED)
{
uint8_t macAddr[6];
WiFi.macAddress(macAddr);
Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin(simipleName)) {
Serial.print("or view http://");
Serial.println(simipleName);
}
server.on("/", sendTemp);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
// Robojax.com code for ESP8266 and DHT11 DHT22
server.handleClient();
MDNS.update();//multicast DNS
float c = dht.readTemperature();// Read temperature as Celsius (the default)
float h = dht.readHumidity();// Reading humidity
float f = dht.readTemperature(true);// Read temperature as Fahrenheit (isFahrenheit = true)
Serial.print(c);
Serial.println(F("°C "));
tValue =c;//save temperature for display
hValue =h;//save humidity for display
delay(300);// change this to larger value (1000 or more) if you don't need very often reading
// Robojax.com code for ESP8266 and DHT11 DHT22
}
Common Course Links
Common Course Files
แหล่งข้อมูลและเอกสารอ้างอิง
ยังไม่มีทรัพยากรเลย
ไฟล์📁
โค้ด Arduino (.ino)
-
ESP8266_ESP1_DHT111 codes for Lesson 31 of Sunfounder's 3-in-1
ESP8266_ESP1_DHT111_all.zip9.31 MB
ไฟล์ Fritzing
-
DHT11 Humitidy and Temperature Sensor (3 pins)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB
คู่มือผู้ใช้
-
คู่มือผู้ใช้ DHT11
robojax-DHT11_manual.pdf0.82 MB