风筝
发表于: 2022-11-4 20:33:34 | 显示全部楼层

您是否曾经希望您可以随时使用手机、平板电脑或电脑监视房屋或酒窖中的温度和湿度?那这个物联网项目可能是一个不错的起点!


本文将使用ESP8266 NodeMCU开发板作为控制设备,该设备连接到现有的WiFi网络并创建Web服务器。当设备连接到该网页服务器时,ESP8266将读取DHT11/DHT22传感器的温度和相对湿度,并将其发送到设备的网页浏览器中。


将DHT11/DHT22传感器接线到ESP8266

将DHT11/DHT22传感器连接到ESP8266非常容易。首先将ESP8266放在面包板上,确保开发板的每一侧都位于面包板的另一侧。


将传感器放在ESP8266旁边的面包板上。将传感器的VCC引脚连接到ESP8266的3.3V引脚,然后接地。将传感器的Data引脚连接到ESP8266的D8引脚。最后,在VCC和数据线之间添加10kΩ上拉电阻,以使其保持高电平,以在传感器和ESP8266之间进行正确的通信。


下图显示了接线。

Wiring-Fritzing-Connecting-DHT11-Temperature-Humidity-Sensor-with-ESP8266-NodeMCU.jpg


安装DHT传感器库

要开始读取传感器数据,您需要安装DHT传感器库。它可从Arduino库管理器获得。


要安装库,请导航到Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装的库列表。

Arduino-Library-Installation-Selecting-Manage-Libraries-in-Arduino-IDE.jpg


输入DHT sensor筛选搜索结果。查找Adafruit的DHT传感器库。单击该条目,然后选择Install。

Adafruit-DHT-library-Installation.jpg

DHT传感器库利用Adafruit传感器支持后端。因此,在库管理器中查找Adafruit Unified Sensor,并安装。

Adafruit-Unified-Sensor-Library-Installation.jpg


使用WiFi站模式STA创建ESP8266网页服务器

如标题所示,我们将在站模式(STA)下配置ESP8266网页服务器,以将网页服务于现有网络上的任何连接的客户端。


在开始上传草图之前,必须用网络凭据替换以下两个变量,以便ESP8266可以连接到现有网络。

  1. const char* ssid = "YourNetworkName";  // Enter SSID here
  2. const char* password = "YourPassword";  //Enter Password here
复制代码

完成后,尝试草图,然后我们将详细介绍。

  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3. #include "DHT.h"

  4. // Uncomment one of the lines below for whatever DHT sensor type you're using!
  5. //#define DHTTYPE DHT11   // DHT 11
  6. //#define DHTTYPE DHT21   // DHT 21 (AM2301)
  7. #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

  8. /*Put your SSID & Password*/
  9. const char* ssid = "YourNetworkName";  // Enter SSID here
  10. const char* password = "YourPassword";  //Enter Password here

  11. ESP8266WebServer server(80);

  12. // DHT Sensor
  13. uint8_t DHTPin = D8;
  14.                
  15. // Initialize DHT sensor.
  16. DHT dht(DHTPin, DHTTYPE);               

  17. float Temperature;
  18. float Humidity;

  19. void setup() {
  20.   Serial.begin(115200);
  21.   delay(100);
  22.   
  23.   pinMode(DHTPin, INPUT);

  24.   dht.begin();              

  25.   Serial.println("Connecting to ");
  26.   Serial.println(ssid);

  27.   //connect to your local wi-fi network
  28.   WiFi.begin(ssid, password);

  29.   //check wi-fi is connected to wi-fi network
  30.   while (WiFi.status() != WL_CONNECTED) {
  31.   delay(1000);
  32.   Serial.print(".");
  33.   }
  34.   Serial.println("");
  35.   Serial.println("WiFi connected..!");
  36.   Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  37.   server.on("/", handle_OnConnect);
  38.   server.onNotFound(handle_NotFound);

  39.   server.begin();
  40.   Serial.println("HTTP server started");

  41. }
  42. void loop() {
  43.   
  44.   server.handleClient();
  45.   
  46. }

  47. void handle_OnConnect() {

  48. Temperature = dht.readTemperature(); // Gets the values of the temperature
  49.   Humidity = dht.readHumidity(); // Gets the values of the humidity
  50.   server.send(200, "text/html", SendHTML(Temperature,Humidity));
  51. }

  52. void handle_NotFound(){
  53.   server.send(404, "text/plain", "Not found");
  54. }

  55. String SendHTML(float Temperaturestat,float Humiditystat){
  56.   String ptr = "<!DOCTYPE html> <html>\n";
  57.   ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
  58.   ptr +="<title>ESP8266 Weather Report</title>\n";
  59.   ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  60.   ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  61.   ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  62.   ptr +="</style>\n";
  63.   ptr +="</head>\n";
  64.   ptr +="<body>\n";
  65.   ptr +="<div id="webpage">\n";
  66.   ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";
  67.   
  68.   ptr +="<p>Temperature: ";
  69.   ptr +=(int)Temperaturestat;
  70.   ptr +="°C</p>";
  71.   ptr +="<p>Humidity: ";
  72.   ptr +=(int)Humiditystat;
  73.   ptr +="%</p>";
  74.   
  75.   ptr +="</div>\n";
  76.   ptr +="</body>\n";
  77.   ptr +="</html>\n";
  78.   return ptr;
  79. }
复制代码

访问Web服务器

上传草图后,打开串口显示器,然后按NodeMCU上的复位按钮。如果一切正常,它将显示从路由器获得的动态IP地址以及HTTP server started消息。

ESP8266-NodeMCU-Web-Server-Station-Mode-Serial-Monitor-Output-Server-Started.jpg


接下来,启动浏览器并导航到串口显示器上显示的IP地址。 ESP8266应提供当前温度和相对湿度的网页。

Display-DHT11-DHT22-AM2302-Temperature-Humidity-on-ESP8266-Web-Server-Profession.jpg


详细的代码说明

草图首先包括ESP8266WIFI.H库。该库包含我们用来连接到网络的ESP8266特定方法。之后,我们包括ESP8266Weberver.h库,其中包含一些方法,这些方法将有助于我们配置服务器并处理传入的HTTP请求,而不必担心低级实现详细信息。最后,我们包括DHT.H库。

  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3. #include "DHT.h"
复制代码

接下来,我们指定正在使用的DHT传感器的类型。

  1. //#define DHTTYPE DHT11   // DHT 11
  2. //#define DHTTYPE DHT21   // DHT 21 (AM2301)
  3. #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
复制代码

因为我们正在将ESP8266网页服务器配置为STA模式,因此它将加入现有的WiFi网络。因此,我们需要指定SSID和密码。

  1. /*Put your SSID & Password*/
  2. const char* ssid = "YourNetworkName";  // Enter SSID here
  3. const char* password = "YourPassword";  //Enter Password here
复制代码

之后,我们创建了ESP8266Weberver库的对象,以便我们可以访问其函数。该对象的构造函数接受服务器将要侦听的端口作为参数。由于HTTP默认使用端口80,因此我们将使用此值。这使我们可以在不指定URL中的端口的情况下连接到服务器。

  1. // declare an object of WebServer library
  2. ESP8266WebServer server(80);
复制代码

接下来,我们定义ESP8266连接传感器的Data引脚的GPIO编号,并创建DHT对象。我们可以访问DHT特定于DHT库的函数。

  1. // DHT Sensor
  2. uint8_t DHTPin = D8;

  3. // Initialize DHT sensor.
  4. DHT dht(DHTPin, DHTTYPE);
复制代码

定义了两个浮点变量:Temperature和Humidity。

  1. float Temperature;
  2. float Humidity;
复制代码

在setup()函数中,我们配置了网页务器。首先,我们为调试目的建立了串口连接,并将GPIO引脚配置为输入。我们还初始化了DHT对象。

  1. Serial.begin(115200);
  2. delay(100);
  3.   
  4. pinMode(DHTPin, INPUT);

  5. dht.begin();
复制代码

然后,我们使用wifi.begin()函数连接到WiFi网络。该函数以SSID(网络名称)和密码作为参数。

  1. Serial.println("Connecting to ");
  2. Serial.println(ssid);

  3. //connect to your local wi-fi network
  4. WiFi.begin(ssid, password);
复制代码

当ESP8266尝试连接到网络时,我们可以使用wifi.status()函数检查连接状态。

  1. //check wi-fi is connected to wi-fi network
  2.   while (WiFi.status() != WL_CONNECTED) {
  3.   delay(1000);
  4.   Serial.print(".");
  5.   }
复制代码

连接到网络后,WiFi.localIP()函数将用于打印分配给ESP8266的IP地址。

  1. Serial.println("");
  2. Serial.println("WiFi connected..!");
  3. Serial.print("Got IP: ");  Serial.println(WiFi.localIP());
复制代码

要处理传入的HTTP请求,我们必须指定当访问特定URL时应执行哪些代码。为此,我们使用.on()方法。该方法接受两个参数:相对URL路径和访问该URL时要执行的函数的名称。


下面的代码表明,当服务器在root(/)路径上接收HTTP请求时,它将调用handle_onconnect()函数。重要的是要注意指定的URL是相对路径。

  1. server.on("/", handle_OnConnect);
复制代码

如果客户端请求未指定server.on.on()的URL,我们尚未指定服务器应提供的服务。它应该给出404错误(未找到页面)作为响应。为此,我们使用server.onNotFound()方法。

  1. server.onNotFound(handle_NotFound);
复制代码

现在,要启动服务器,我们调用服务器对象的begin()方法。

  1. server.begin();
  2. Serial.println("HTTP server started");
复制代码

实际传入的HTTP请求在loop()函数中处理。为此,我们使用服务器对象的handleclient()方法。

  1. server.handleClient();
复制代码

现在,我们必须编写handle_onconnect()函数,以前将其连接到root(/)url server.on。在函数中首先从传感器中读取温度和湿度值。我们使用发送方法来响应HTTP请求。尽管该方法可以使用许多不同的参数调用,但最简单的表格需要HTTP响应代码、内容类型和内容。


我们传递给发送方法的第一个参数是代码200(HTTP状态代码之一),与确定响应相对应。然后,我们将内容类型指定为“ text/html”,最后我们通过sendhtml()自定义函数,该函数生成具有温度和湿度读数的动态HTML页面。

  1. void handle_OnConnect() {

  2. Temperature = dht.readTemperature(); // Gets the values of the temperature
  3.   Humidity = dht.readHumidity(); // Gets the values of the humidity
  4.   server.send(200, "text/html", SendHTML(Temperature,Humidity));
  5. }
复制代码

同样,我们编写一个函数来处理404错误页面。

  1. void handle_NotFound(){
  2.   server.send(404, "text/plain", "Not found");
  3. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-4-19 15:23 , Processed in 0.153399 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表