第31/31课:使用DHT11和ESP01 SunFounder套件通过Wi-Fi测量温度和湿度
呢個項目指南會帶你逐步建立一個無線溫度同濕度監測系統,用ESP8266(ESP-01)模組同DHT11感測器。完成之後,你會有一個裝置,佢會建立自己嘅網頁伺服器,令你可以喺任何連接到本地網絡嘅裝置(例如智能手機、平板電腦或電腦)上睇到即時感測器讀數。呢個係一個基礎嘅物聯網項目,示範點樣將感測器嘅物理世界同網頁介面嘅數碼世界連接埋一齊。
你喺度學到嘅技能好容易應用喺其他方面。呢個設定可以改造成好多實際用途,包括:
- 為溫室或花園建立一個遠程監測站,確保植物生長條件理想。
- 建立一個簡單嘅家居自動化系統,監測特定房間(例如酒窖或嬰兒房)嘅氣候。
- 為學校科學項目設置一個低成本嘅環境數據記錄器。
- 開發一個基本嘅保安或警報系統,可以喺溫度突然變化時通知你。
硬件同零件
要跟住呢個項目做,你需要以下零件。主要零件係ESP8266模組同DHT11感測器,但其餘零件對編程同供電嚟講都係必不可少。
- ESP8266(ESP-01S)模組:核心微控制器,內置Wi-Fi功能。
- DHT11溫度同濕度感測器:負責量度環境數據嘅感測器。
- Arduino Uno板(用嚟做USB轉串口):喺呢個項目入面,主Arduino板唔係用嚟做運算。反而係用佢嘅USB轉串口晶片嚟編程ESP8266模組。
- 330歐姆電阻:用喺最初嘅LED閃爍測試,用嚟限制電流。
- 1k歐姆至10k歐姆電阻:用嚟做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):用嚟做編程器到模組嘅串口通訊。
- TX(ESP)連到RX(Arduino):用嚟做模組到編程器嘅串口通訊。
- RST(重置)連到GND:呢個係臨時連接,用嚟喺編程之後重置模組。
一旦ESP-01編程完成,感測器嘅接線就好簡單。DHT11感測器需要喺數據線上加上拉電阻,以確保通訊穩定。
感測器設定方面,接線如下:
- DHT11 VCC(引腳1)連到3.3V:感測器嘅電源。
- DHT11 DATA(引腳2)連到ESP-01嘅GPIO2(IO2):用嚟讀取感測器數據嘅數據線。應該喺呢條數據線同3.3V電源線之間連接一個1k歐姆至10k歐姆嘅上拉電阻。
- DHT11 GND(引腳4)連到GND:感測器嘅共同接地。
準備Arduino IDE
要編程ESP8266,你首先需要喺Arduino IDE入面加入佢嘅板支援。呢個分兩步做:
- 加入板管理員URL:去
檔案 > 偏好設定。喺「其他板管理員URL」欄位入面,貼上以下URL:http://arduino.esp8266.com/stable/package_esp8266com_index.json,然後撳「確定」。 - 安裝ESP8266板套件:去
工具 > 開發板 > 板管理員...。搜尋「esp8266」,搵到「esp8266 by ESP8266 Community」,然後撳「安裝」。安裝之後,你可以去工具 > 開發板 > ESP8266 Boards > Generic ESP8266 Module選擇呢塊板。
安裝DHT感測器程式庫
程式碼依賴一個程式庫嚟同DHT11感測器介面。呢個程式庫必須安裝喺你嘅Arduino IDE入面。
- 去
工具 > 管理程式庫...。 - 搜尋「DHT sensor library」。
- 搵到Adafruit嘅程式庫,然後撳「安裝」。呢個程式庫會簡化讀取感測器數據嘅過程。
項目1:LED閃爍測試
喺開始搞個感應器之前,好重要嘅係要確認你可以成功咁為ESP-01寫入程式。呢個係用經典嘅「Blink」例子嚟做。條片展示咗一個過程,就係匯出編譯好嘅二進制檔案,再用一個獨立嘅批次檔去燒錄,呢個係為咗應付特定嘅USB轉串口設定嘅變通方法。目標係要睇到板上嘅LED閃爍,確認寫入程式嘅鏈路係正常運作。寫完程式之後要運行個模組,你一定要甩開連接IO1去GND嘅線,然後短暫咁將RST腳連接去GND嚟重置個模組。
項目2:喺序列監視器度讀取DHT11
一旦確認咗寫入程式冇問題,下一步就係連接DHT11感應器同讀取佢嘅數據。呢個項目用咗Adafruit DHT感應器庫入面嘅DHTtester例子。啲程式碼設定咗用正確嘅引腳同感應器類型。燒錄咗呢個程式之後,你可以打開序列監視器(設定做9600波特率)嚟睇溫度同濕度嘅讀數。
項目3:設定網頁伺服器
最後一個項目會將所有嘢結合埋一齊。ESP8266被寫入程式去連接你嘅本地Wi-Fi網絡,並且托管一個簡單嘅網頁。呢個頁面會顯示即時嘅溫度同濕度讀數。啲程式碼係ESP8266「HelloServer」例子嘅修改版本。條片示範咗點樣透過輸入裝置嘅IP地址或者佢嘅mDNS名稱(例如robojaxDHT.local)去任何一部連接咗同一網絡嘅裝置嘅網頁瀏覽器度,嚟存取呢啲數據。
程式碼解釋
因為成個程式都可以下載,呢個部分會集中講解你需要為自己嘅網絡同偏好去調整嘅主要用戶可設定變數。啲程式碼係ESP8266「HelloServer」例子嘅修改版本。核心邏輯包括讀取感應器同格式化一個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係ESP8266上面連接感應器數據線嘅GPIO引腳(喺呢個指南入面係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網絡。序列監視器會顯示連接狀態同裝置嘅IP地址。喺網頁瀏覽器度去呢個IP地址,你就可以睇到一個簡單頁面,顯示當前嘅溫度同濕度。示範顯示讀數係即時更新嘅。當DHT11感應器用熱風槍加熱嘅時候,網頁上面嘅溫度讀數會相應咁上升。如果感應器嘅數據線斷開咗,頁面會顯示「None」作為感應器數值,呢個係一個有助於排查問題嘅功能。
章節
- [00:00] 項目介紹
- [01:33] 了解ESP8266同網頁伺服器
- [05:47] 接線ESP-01用嚟寫入程式
- [08:51] 喺Arduino IDE度安裝ESP8266開發板支援
- [11:47] 項目1:用ESP8266閃爍LED
- [20:28] 接線DHT11感應器
- [22:34] 安裝DHT感應器庫
- [23:13] 項目2:喺序列監視器度讀取DHT11
- [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