1. 硬件
- ESP8266-NodeMCU开发板
- DHT22温湿度传感器
- 杜邦线
ESP8266-NodeMCU开发板和DHT22引脚对应关系
2. 开发
在Arduino依赖的库还是通过【项目】→【加载库】→【管理库】下载安装,不再赘述。
直接上代码:
#include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> #include <DHT.h> DHT dht(D1, DHT22); //设置Data引脚所接IO口和传感器类型 ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象 #define SERVER_IP "http://serverIp/environment/info/add" // 网络服务器地址 WiFiClient client; // 创建 WiFiClient 实例化对象 HTTPClient httpClient; //创建http对象 void setup() { Serial.begin(115200); wifiMulti.addAP("无线网名", "无线网密码"); int i = 0; while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前 delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。 } // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是此处while循环判断是否跳出循环的条件。 Serial.println('\n'); Serial.print("Connected to ");Serial.println(WiFi.SSID()); // 连接的WiFI名称 Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // NodeMCU的IP地址 httpClient.begin(client, SERVER_IP); // 配置HTTP请求地址 dht.begin(); // 启动DHT22 } void loop() { delay(1000); //延时1000毫秒 float RH = dht.readHumidity(); //读取湿度数据 float T = dht.readTemperature(); //读取温度数据 Serial.print("Humidity:"); //向串口打印湿度数据 Serial.print(RH); Serial.print("%"); Serial.print(" Temperature:"); //向串口打印温度数据 Serial.print(T); Serial.println("C"); String requestBody = "{\"environmentNo\":\"Home\",\"humidity\":"; requestBody += String(RH); requestBody += ",\"temperature\":"; requestBody += String(T); requestBody += "}"; Serial.print("requestBody:"); Serial.println(requestBody); Serial.print("[HTTP] begin...\n"); //启动连接并发送HTTP报头和报文 httpClient.addHeader("Content-Type", "application/json"); int httpCode = httpClient.POST(requestBody); Serial.print("[HTTP] POST...\n"); if (httpCode > 0) { Serial.printf("[HTTP] POST... code: %d\n", httpCode); if (httpCode == HTTP_CODE_OK) { const String& payload = httpClient.getString(); Serial.println("received payload:\n<<"); Serial.println(payload); Serial.println(">>"); } } else { Serial.printf("[HTTP] POST... failed, error: %s\n", httpClient.errorToString(httpCode).c_str()); } }
启动后,开发板每秒会向服务器上送一次温湿度数据,跑了一晚上,通过数据管理服务(就是个SpringBoot项目从数据库查一下数据,然后Echarts渲染出来)监控到的温湿度如下:
(PS:温度趋势线上有3个高峰不是因为DHT22不准确,第一次是想试一下温湿度监控是否正常,往上面哈了一口气~温度和湿度就飙升上来了……;第二次是早上端着热腾腾的早饭在传感器旁边吃饭;第三次是端着热腾腾的午饭在传感器旁边吃饭……)。
未完待续……
下一步就是把这套系统和加湿器、空调连接起来,当湿度低于最低舒适湿度时(一般舒适湿度在40%~ 70%左右),开发板控制继电器打开加湿器,高于舒适湿度时,开发板控制继电器关闭加湿器;当温度低于最低舒适温度时(一般舒适温度在18℃~25℃左右),开发板控制红外发射模块打开空调制热,当温度高于最高舒适温度时,开发板控制红外发射模块打开空调制冷。下班回家的路上,在手机上可以查看家里的温湿度,也可以通过手机向服务器发送MQTT消息,开发板监听MQTT服务 ,收到MQTT消息后,根据消息内容提前打开空调和加湿器。
买的继电器模块和红外发射接收模块一周之前就到附近了,但可能因为疫情原因,物流一直没配送……希望疫情赶紧过去吧,一切都赶紧好起来!