第31/31课:使用DHT11和ESP01 SunFounder套件通过Wi-Fi测量温度和湿度
本项目指南将引导您使用ESP8266(ESP-01)模块和DHT11传感器构建一个无线温湿度监测系统。完成后,您将拥有一个创建自己的Web服务器的设备,使您能够在连接到本地网络的任何设备(如智能手机、平板电脑或计算机)上查看实时传感器读数。这是一个基础物联网项目,演示了如何将传感器的物理世界与Web界面的数字世界连接起来。
您在此学到的技能具有高度可移植性。这种精确的设置可以适用于各种实际应用,包括:
- 为温室或花园构建远程监测站,以确保最佳生长条件。
- 创建简单的家庭自动化系统,以监测特定房间(如酒窖或婴儿房)的气候。
- 为学校科学项目设置低成本环境数据记录器。
- 开发基本的安全或警报系统,可在温度突然变化时通知您。
硬件和组件
要跟随本项目进行操作,您需要以下组件。主要组件是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(使能):这用于启用模块。
- 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: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:设置Web服务器
最终项目整合了所有内容。ESP8266被编程为连接到您的本地Wi-Fi网络并托管一个简单的网页。该页面显示实时的温度和湿度读数。代码是ESP8266“HelloServer”示例的修改版本。视频演示了如何通过输入设备的IP地址或其mDNS名称(例如robojaxDHT.local)在连接到同一网络的任何设备上的Web浏览器中访问此数据。
代码说明
由于完整程序可供下载,本节重点介绍您需要根据自己的网络和偏好进行调整的关键用户可配置变量。代码是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地址。通过在Web浏览器中导航到此IP地址,您可以看到一个显示当前温度和湿度的简单页面。演示显示读数实时更新。当用热风枪加热DHT11传感器时,网页上的温度读数相应增加。如果传感器的数据线断开,页面会显示“None”作为传感器值,这是一个有用的故障排除功能。
章节
- [00:00] 项目介绍
- [01:33] 了解ESP8266和Web服务器
- [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] Web服务器项目的代码说明
- [36:14] 项目3:烧录Web服务器代码
- [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