Bài 31/31: Đo Nhiệt Độ và Độ Ẩm qua Wi-Fi sử dụng DHT11 và ESP01 SunFounder Kit
Hướng dẫn dự án này sẽ đưa bạn qua quá trình xây dựng một hệ thống giám sát nhiệt độ và độ ẩm không dây sử dụng mô-đun ESP8266 (ESP-01) và cảm biến DHT11. Khi hoàn thành, bạn sẽ có một thiết bị tự tạo máy chủ web riêng, cho phép bạn xem số liệu cảm biến theo thời gian thực trên bất kỳ thiết bị nào kết nối với mạng cục bộ của mình, chẳng hạn như điện thoại thông minh, máy tính bảng hoặc máy tính. Đây là một dự án IoT nền tảng minh họa cách kết nối thế giới vật lý của cảm biến với thế giới kỹ thuật số của giao diện web.
Những kỹ năng bạn học được ở đây có tính ứng dụng cao. Thiết lập chính xác này có thể được điều chỉnh cho nhiều ứng dụng thực tế, bao gồm:
- Xây dựng trạm giám sát từ xa cho nhà kính hoặc khu vườn để đảm bảo điều kiện sinh trưởng tối ưu.
- Tạo hệ thống tự động hóa gia đình đơn giản để theo dõi khí hậu trong một phòng cụ thể, như hầm rượu hoặc phòng trẻ sơ sinh.
- Thiết lập thiết bị ghi dữ liệu môi trường chi phí thấp cho dự án khoa học ở trường.
- Phát triển hệ thống cảnh báo hoặc an ninh cơ bản có thể thông báo cho bạn về sự thay đổi nhiệt độ đột ngột.
Phần cứng và Linh kiện
Để thực hiện theo dự án này, bạn sẽ cần các linh kiện sau. Các thành phần chính là mô-đun ESP8266 và cảm biến DHT11, nhưng phần còn lại rất cần thiết để lập trình và cấp nguồn cho mô-đun.
- Mô-đun ESP8266 (ESP-01S): Bộ vi điều khiển lõi với khả năng Wi-Fi tích hợp.
- Cảm biến nhiệt độ và độ ẩm DHT11: Cảm biến đo dữ liệu môi trường.
- Bo mạch Arduino Uno (dùng để chuyển đổi USB sang Serial): Trong dự án này, bo mạch Arduino chính không được dùng cho khả năng xử lý của nó. Thay vào đó, chip chuyển đổi USB sang serial của nó được dùng để lập trình cho mô-đun ESP8266.
- Điện trở 330 ohm: Dùng cho bài kiểm tra LED nhấp nháy ban đầu để giới hạn dòng điện.
- Điện trở 1k ohm đến 10k ohm: Điện trở kéo lên cho đường dữ liệu của cảm biến DHT11.
- LED và dây nhảy: Dùng cho giai đoạn thử nghiệm và thực hiện tất cả các kết nối cần thiết.
- Breadboard: Dùng để tạo các kết nối mạch.
Hướng dẫn Đấu dây
Quá trình đấu dây được thực hiện theo từng giai đoạn. Đầu tiên, chúng ta sẽ thiết lập mạch cơ bản để lập trình cho ESP-01. Việc này bao gồm sử dụng Arduino Uno như một bộ nạp chương trình. Video trình bày rõ ràng thiết lập này. Các kết nối chính như sau:
Để vào chế độ lập trình, bạn phải kết nối chân IO1 (GPIO1) với Ground (GND). Điều này báo cho ESP8266 chờ firmware mới. Các kết nối còn lại để lập trình là:
- VCC (3.3V) đến EN (Enable): Điều này kích hoạt mô-đun.
- GND đến GND: Nối đất chung cho mạch.
- VCC (5V) đến VCC (5V): Để cấp nguồn cho bo mạch nạp chương trình.
- RX (ESP) đến TX (Arduino): Để giao tiếp nối tiếp từ bộ nạp chương trình đến mô-đun.
- TX (ESP) đến RX (Arduino): Để giao tiếp nối tiếp từ mô-đun đến bộ nạp chương trình.
- RST (Reset) đến GND: Đây là kết nối tạm thời dùng để đặt lại mô-đun sau khi lập trình.
Sau khi ESP-01 được lập trình, việc đấu dây cho cảm biến rất đơn giản. Cảm biến DHT11 yêu cầu một điện trở kéo lên trên đường dữ liệu của nó để đảm bảo giao tiếp ổn định.
Đối với thiết lập cảm biến, cách đấu dây như sau:
- DHT11 VCC (Chân 1) đến 3.3V: Nguồn cho cảm biến.
- DHT11 DATA (Chân 2) đến GPIO2 (IO2) trên ESP-01: Đường dữ liệu để đọc cảm biến. Một điện trở kéo lên từ 1k ohm đến 10k ohm nên được kết nối giữa đường dữ liệu này và đường nguồn 3.3V.
- DHT11 GND (Chân 4) đến GND: Nối đất chung cho cảm biến.
Chuẩn bị Arduino IDE
Để lập trình ESP8266, trước tiên bạn phải thêm hỗ trợ bo mạch của nó vào Arduino IDE. Việc này được thực hiện qua hai bước:
- Thêm URL Trình quản lý Bo mạch: Vào
File > Preferences. Trong trường "Additional Boards Manager URLs", dán URL sau:http://arduino.esp8266.com/stable/package_esp8266com_index.jsonvà nhấp "OK". - Cài đặt Gói Bo mạch ESP8266: Điều hướng đến
Tools > Board > Boards Manager.... Tìm kiếm "esp8266", tìm "esp8266 by ESP8266 Community", và nhấp "Install". Sau khi cài đặt, bạn có thể chọn bo mạch bằng cách vàoTools > Board > ESP8266 Boards > Generic ESP8266 Module.
Cài đặt Thư viện Cảm biến DHT
Mã code phụ thuộc vào một thư viện để giao tiếp với cảm biến DHT11. Thư viện này phải được cài đặt trong Arduino IDE của bạn.
- Vào
Tools > Manage Libraries.... - Tìm kiếm "DHT sensor library".
- Tìm thư viện của Adafruit và nhấp "Install". Thư viện này đơn giản hóa quá trình đọc dữ liệu từ cảm biến.
Dự án 1: Kiểm tra LED Nhấp nháy
Trước khi đi sâu vào cảm biến, điều quan trọng là phải xác minh rằng bạn có thể lập trình ESP-01 thành công. Việc này được thực hiện với ví dụ "Blink" kinh điển. Video cho thấy quy trình xuất tệp nhị phân đã biên dịch và sử dụng một tệp batch riêng để nạp, đây là một giải pháp thay thế cho thiết lập USB-to-serial cụ thể. Mục tiêu là thấy đèn LED trên bo mạch nhấp nháy, xác nhận chuỗi lập trình đang hoạt động. Để chạy mô-đun sau khi lập trình, bạn phải ngắt kết nối dây nối IO1 với GND và sau đó kết nối tạm thời chân RST với GND để đặt lại mô-đun.
Dự án 2: Đọc DHT11 trên Serial Monitor
Khi đã xác nhận việc lập trình, bước tiếp theo là kết nối cảm biến DHT11 và đọc dữ liệu của nó. Dự án này sử dụng ví dụ DHTtester từ thư viện cảm biến Adafruit DHT. Mã được cấu hình để sử dụng đúng chân và loại cảm biến. Sau khi nạp chương trình này, bạn có thể mở Serial Monitor (đặt ở 9600 baud) để xem các chỉ số nhiệt độ và độ ẩm.
Dự án 3: Thiết lập Máy chủ Web
Dự án cuối cùng kết hợp mọi thứ. ESP8266 được lập trình để kết nối với mạng Wi-Fi cục bộ của bạn và lưu trữ một trang web đơn giản. Trang này hiển thị các chỉ số nhiệt độ và độ ẩm trực tiếp. Mã là một phiên bản sửa đổi của ví dụ "HelloServer" của ESP8266. Video trình bày cách truy cập dữ liệu này bằng cách nhập địa chỉ IP của thiết bị hoặc tên mDNS của nó (ví dụ: robojaxDHT.local) vào trình duyệt web trên bất kỳ thiết bị nào kết nối cùng mạng.
Giải thích Mã
Vì chương trình đầy đủ có sẵn để tải xuống, phần này tập trung vào các biến chính mà người dùng có thể cấu hình và bạn sẽ cần điều chỉnh cho mạng và sở thích của riêng mình. Mã là một phiên bản sửa đổi của ví dụ "HelloServer" của ESP8266. Logic cốt lõi liên quan đến việc đọc cảm biến và định dạng một trang HTML để hiển thị dữ liệu.
Dưới đây là các phần quan trọng của mã mà bạn sẽ cần sửa đổi:
// Thông tin đăng nhập Wi-Fi - BẠN PHẢI THAY ĐỔI NHỮNG DÒNG NÀY
const char* ssid = "YourWiFiSSID"; // Thay bằng tên mạng Wi-Fi của bạn
const char* password = "YourWiFiPassword"; // Thay bằng mật khẩu Wi-Fi của bạn
Đây là phần quan trọng nhất cần thay đổi. Các biến ssid và password phải khớp chính xác với mạng Wi-Fi cục bộ của bạn. Tên Wi-Fi phân biệt chữ hoa chữ thường, vì vậy hãy đảm bảo bạn nhập chính xác.
// Cấu hình cảm biến DHT11
#define DHTPIN 2 // Chân kỹ thuật số kết nối với cảm biến DHT (GPIO2)
#define DHTTYPE DHT11 // Loại cảm biến DHT 11
Các định nghĩa này thiết lập cảm biến. DHTPIN là chân GPIO trên ESP8266 mà dây dữ liệu của cảm biến được kết nối (là GPIO2 trong hướng dẫn này). DHTTYPE xác định mẫu cảm biến cụ thể. Nếu bạn sử dụng cảm biến DHT22, bạn sẽ bỏ ghi chú dòng cho DHT22 và ghi chú dòng cho DHT11.
// Các biến có thể cấu hình
const long interval = 3000; // mili giây giữa các lần đọc cảm biến
char temperature[] = "00.0";
char humidity[] = "00.0";
Biến interval kiểm soát tần suất đọc cảm biến và cập nhật trang web. Mặc định là 3000 mili giây (3 giây). Bạn có thể tăng giá trị này lên cao hơn như 5000 hoặc 10000 để giảm tần suất cập nhật.
Mã cũng bao gồm một hàm định dạng chỉ số nhiệt độ. Bạn có thể chọn hiển thị nhiệt độ theo độ C hoặc độ F bằng cách sửa đổi logic trong hàm sendTemperature(). Video giải thích rằng biến Tvalue được đặt để giữ chỉ số độ C, nhưng bạn có thể thay đổi nó để sử dụng biến độ F F thay thế.
Trình diễn Dự án Trực tiếp
Trong video, dự án hoàn chỉnh được trình diễn. Sau khi mã được nạp và mô-đun được đặt lại, nó kết nối với mạng Wi-Fi. Serial Monitor hiển thị trạng thái kết nối và địa chỉ IP của thiết bị. Bằng cách điều hướng đến địa chỉ IP này trong trình duyệt web, bạn có thể thấy một trang đơn giản hiển thị nhiệt độ và độ ẩm hiện tại. Trình diễn cho thấy các chỉ số cập nhật theo thời gian thực. Khi cảm biến DHT11 được làm nóng bằng súng nhiệt, chỉ số nhiệt độ trên trang web tăng tương ứng. Nếu dây dữ liệu của cảm biến bị ngắt kết nối, trang sẽ hiển thị "None" cho các giá trị cảm biến, đây là một tính năng hữu ích để khắc phục sự cố.
Các Chương
- [00:00] Giới thiệu về Dự án
- [01:33] Hiểu về ESP8266 và Máy chủ Web
- [05:47] Đấu dây ESP-01 để Lập trình
- [08:51] Cài đặt Hỗ trợ Bo mạch ESP8266 trong Arduino IDE
- [11:47] Dự án 1: Nhấp nháy LED với ESP8266
- [20:28] Đấu dây Cảm biến DHT11
- [22:34] Cài đặt Thư viện Cảm biến DHT
- [23:13] Dự án 2: Đọc DHT11 trên Serial Monitor
- [30:10] Giải thích Mã cho Dự án Máy chủ Web
- [36:14] Dự án 3: Nạp Mã Máy chủ Web
- [38:42] Trình diễn: Xem Nhiệt độ qua Wi-Fi
- [41:43] Kết luận và Khắc phục Sự cố
/*
* 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
Tài nguyên & tài liệu tham khảo
Chưa có tài nguyên nào.
Tập tin📁
Mã Arduino (.ino)
-
ESP8266_ESP1_DHT111 codes for Lesson 31 of Sunfounder's 3-in-1
ESP8266_ESP1_DHT111_all.zip9.31 MB
Tập tin Fritzing
-
DHT11 Humitidy and Temperature Sensor (3 pins)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB
Hướng dẫn Sử dụng
-
Hướng dẫn sử dụng DHT11
robojax-DHT11_manual.pdf0.82 MB