完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
描述
Nodemcu 数据记录器 您大多已经在 ThingSpeak 和其他物联网平台上看到了带有实时图表和表格的数据记录 Web 服务器。但我们也可以创建自己的网络服务器并实时更新数据,我们之前使用不同的板创建了许多网络服务器。在这里,我们还将使用 DHT11 传感器创建 ESP8266 Web 服务器数据记录器。这里的温度和湿度数据将使用AJAX在网页上更新。 AJAX(异步 JavaScript 和 XML)允许通过在后台与服务器共享少量数据来自动更新网站,而无需刷新整个网页。这可确保在不重新加载整个网站的情况下更改网页的某些部分。所以让我们开始吧! 所需组件 NodeMCU ESP8266 DHT11 传感器 跳线 DHT11传感器用于测量温度和湿度,通常用于创建气象站。 电路原理图 将 DHT11 连接到 NodeMCU 很容易。DHT11 的 VCC 和 GND 引脚连接到 3.3V 和 GND NodeMCU,而 DHT 的 Data 引脚连接到 NodeMCU 的 D5 (GPIO 14) 引脚。 为数据记录编程 NodeMCU ESP8266 在直接开始编码之前,安装所需的库,ESP8266 库已预先安装在 IDE 上;你只需要安装 DHT11 库 安装库后,包括所有必需的库。 #include #include #include #include "DHT.h" 现在在接下来的几行中,输入您的 Wi-Fi 名称和密码。 const char* ssid = "Wi-Fi 名称"; const char* 密码 = "密码"; 然后定义 DHT 传感器的类型和传感器连接的引脚。如果您使用的是 DHT22,则将 DHT 类型更改为 DHT22。在我的例子中,DHT 传感器连接到 NodeMCU 的 GPIO14 (D5)。 #define LED 2 //板载LED #define DHTTYPE DHT11 // DHT 11 uint8_t DHTPin = 14; DHT dht(DHTPin, DHTTYPE); 当我们使用 NodeMCU IP 地址打开网页浏览器时,会执行 handleRoot 函数。 无效句柄根() { 字符串 s = MAIN_page; //读取HTML内容 server.send(200, "text/html", s); //发送网页 } 下一个函数 readData() 用于从 DHT11 传感器读取数据并将其发送到网页。在这个循环中,NodeMCU 将 DHT11 值存储到两个浮点变量中:温度和湿度,之后它将浮点变量转换为字符串并将它们的数据存储到另一个字符串变量“数据”中,并在请求时将其发送到网页。 无效读取数据() { String data = "{"温度":""+ String(温度) +"", "湿度":""+ String(湿度) +""}"; 数字写入(LED,!数字读取(LED)); server.send(200, "文本/平面", 数据); 延迟(2000); 温度 = dht.readTemperature(); 湿度 = dht.readHumidity(); Serial.print(湿度,1); Serial.print(温度,1); } 在 void setup() 函数中,我们使用 .begin() 函数初始化波特率,DHT 传感器,使用 server.begin() 函数初始化网页,然后使用 Wi-Fi 名称和密码将模块与 Wi-Fi 连接。 序列号.开始(115200); pinMode(DHTPin,输入); dht.begin(); WiFi.begin(ssid, 密码); server.begin(); 第一个函数用于在客户端请求 URI(统一资源标识符)“/”时调用“handleRoot”函数,而第二个函数用于在对 URI“/readData”进行 POST 请求时调用“readData”函数 server.on("/", handleRoot); server.on("/readData", readData); void loop() 函数持续监听来自客户端的 HTTP 请求 无效循环(无效) { server.handleClient(); } 数据记录 ESP8266 等物联网设备的常见用途是监控传感器。使用前面示例中的代码,我们可以请求时间,并将一些传感器值保存到文件中。如果我们也运行服务器,我们可以在网页的漂亮图表中显示这些数据。 温度记录仪 在以下示例中,我们将使用 DS18S20 温度传感器记录一段时间内的温度并将其保存到 SPIFFS。然后它可以显示在浏览器的图表中。 安装库 首先,下载 Miles Burton 的 Dallas Temperature 库和 Jim Studt 的 OneWire 库:转到 Sketch > Include Library ... > Manage Libraries 并搜索“Dallas Temperature”和“OneWire”(确保下载正确的版本) . 硬件 将 DS18S20 温度传感器的地(引脚 1)连接到 ESP 的地,将数据引脚(引脚 2)连接到 GPIO5,将 VCC(引脚 3)连接到 ESP 的 3.3V。最后,在数据引脚和 VCC 之间连接一个 4k7Ω 电阻。 库、常量和全局变量 #include #include <达拉斯温度.h> #include #include #include #include #include #include #include #define ONE_HOUR 3600000UL #define TEMP_SENSOR_PIN 5 单线单线(TEMP_SENSOR_PIN);// 设置 OneWire 实例以与 OneWire 设备通信 DallasTemperature tempSensors(&oneWire); // 创建温度传感器类的实例 ESP8266WebServer 服务器(80);// 创建一个监听 80 端口上的 HTTP 请求的 webserver 对象 文件 fsUploadFile; // 一个 File 变量来临时存储接收到的文件 ESP8266WiFiMulti wifiMulti;// 创建一个 ESP8266WiFiMulti 类的实例,名为 'wifiMulti' const char *OTAName = "ESP8266"; // OTA 服务的名称和密码 const char *OTAPassword = "esp8266"; const char* mdnsName = "esp8266"; // mDNS 响应者的域名 WiFiUDP UDP;// 创建一个 WiFiUDP 类的实例来发送和接收 UDP 消息 IPAddress timeServerIP; // time.nist.gov NTP 服务器的 IP 地址 const char* ntpServerName = "time.nist.gov"; 常量 int NTP_PACKET_SIZE = 48; // NTP 时间戳在消息的前 48 个字节中 字节数据包缓冲区[NTP_PACKET_SIZE];// 用于保存传入和传出数据包的缓冲区 这里唯一的新东西是 OneWire 和 DallasTemperature 库,用于从传感器获取温度。 设置 无效设置(){ 序列号.开始(115200);// 启动串口通信向计算机发送消息 延迟(10); Serial.println(" "); tempSensors.setWaitForConversion(false); // 不要在温度传感器读取时阻塞程序 tempSensors.begin(); // 启动温度传感器 if (tempSensors.getDeviceCount() == 0) { Serial.printf("在引脚 %d 上找不到 DS18x20 温度传感器。正在重新启动。 ", TEMP_SENSOR_PIN); Serial.flush(); ESP.reset(); } 开始WiFi();// 启动一个 Wi-Fi 接入点,并尝试连接到一些给定的接入点。然后等待 AP 或 STA 连接 startOTA(); // 启动OTA服务 开始SPIFFS();// 启动 SPIFFS 并列出所有内容 开始MDNS();// 启动 mDNS 响应者 启动服务器();// 使用文件读取处理程序和上传处理程序启动 HTTP 服务器 开始UDP();// 开始监听 UDP 消息到端口 123 WiFi.hostByName(ntpServerName, timeServerIP); // 获取NTP服务器的IP地址 Serial.print("时间服务器 IP: "); Serial.println(timeServerIP); 发送NTP包(时间服务器IP); } 在设置中,也没有太多新的东西,我们只是启动温度传感器,并检查我们是否可以与之通信。如果未找到温度传感器,ESP 将重置。 从传感器获取温度可能需要一些时间(最多 750 毫秒)。我们不希望我们的循环花费超过几毫秒的时间,所以我们不能等待 750 毫秒。如果我们这样做了,HTTP 服务器等就会开始出现问题。 解决方法是先请求温度。然后传感器将开始读取模拟温度,并将其存储在内存中。与此同时,循环继续运行,服务器刷新等。750毫秒后,我们再次联系传感器,并从其内存中读取温度。 为了告诉库我们不想等待传感器的模数转换,我们使用 setWaitForConversion。 环形 常量无符号长间隔NTP = ONE_HOUR; // 每小时更新时间 无符号长 prevNTP = 0; unsigned long lastNTPResponse = millis(); const unsigned long intervalTemp = 60000; // 每分钟进行一次温度测量 无符号长 prevTemp = 0; 布尔 tmpRequested = 假; 常量无符号长 DS_delay = 750; // 从 DS18x20 读取温度可能需要 750 毫秒 uint32_t timeUNIX = 0; // 从时间服务器接收到的最新时间戳 无效循环(){ 无符号长 currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // 每小时向时间服务器请求时间 prevNTP = currentMillis; 发送NTP包(时间服务器IP); } uint32_t 时间 = getTime(); // 检查时间服务器是否有响应,如果有,获取UNIX时间 如果(时间){ timeUNIX = 时间; Serial.print("NTP 响应: "); Serial.println(timeUNIX); lastNTPResponse = 毫秒(); } else if ((millis() - lastNTPResponse) > 24UL * ONE_HOUR) { Serial.println("自上次 NTP 响应以来已超过 24 小时。重新启动。"); Serial.flush(); ESP.reset(); } 如果(时间UNIX!= 0){ if (currentMillis - prevTemp > intervalTemp) { // 每分钟,请求温度 tempSensors.requestTemperatures(); // 从传感器请求温度(读取它需要一些时间) tmpRequested = 真; prevTemp = currentMillis; Serial.println("温度要求"); } if (currentMillis - prevTemp > DS_delay && tmpRequested) { // 请求温度后 750 毫秒 uint32_t 实际时间 = timeUNIX + (currentMillis - lastNTPResponse) / 1000; // 实际时间是上次 NTP 时间加上自上次 NTP 响应以来经过的时间 tmpRequested = 假; 浮动温度 = tempSensors.getTemPCByIndex(0); // 从传感器获取温度 温度=圆形(温度* 100.0)/ 100.0;// 将温度四舍五入到 2 位 Serial.printf("附加温度到文件:%lu,", actualTime); Serial.println(temp); 文件 tempLog = SPIFFS.open("/temp.csv", "a"); // 将时间和温度写入 csv 文件 tempLog.print(实际时间); tempLog.print(','); tempLog.println(temp); tempLog.close(); } } else { // 如果我们还没有收到 NTP 响应,发送另一个请求 发送NTP包(时间服务器IP); 延迟(500); } server.handleClient(); // 运行服务器 ArduinoOTA.handle(); // 监听 OTA 事件 } 循环看起来要复杂得多,但实际上非常简单。这一切都基于Blink without Delay。 有两件事发生: 概述 这是一款带有板载传感器DHT22(AM2302)的校准数字温湿度模块,与DHT11相比具有更高的精度和更宽的测量范围。 通过标准的单线接口,可用于检测环境温度和湿度。 规格 温度 分辨率:0.1°C 精度:±0.5℃ 测量范围:-40°C ~ 80°C 湿度 分辨率:0.1%RH 精度:±2%RH (25°C) 测量范围:0%RH ~ 99.9%RH 工作电压:3.3V~5.5V 推荐储存条件 温度 : 10°C ~40°C 湿度:60%RH或以下 MQ135材质是SnO2,它是一种特殊的材料:暴露在干净的空气中几乎不导电,但放在有可燃气体的环境中,它的导电性能很好。只需制作一个简单的电子电路,将电导率的变化转换为相应的输出信号。MQ135气体传感器对氨、硫化物、苯蒸汽、烟雾等有害气体敏感。用于家庭、周边环境有害气体检测装置,适用于氨气、芳烃、硫磺、苯蒸气等有害气体/烟雾、气体检测,检测浓度范围:10-1000ppm。在正常环境下,没有检测到气体的环境下,将传感器的输出电压设置为参考电压,模拟输出电压约为1V,当传感器检测到气体时, 每隔一小时,ESP 就会向 NTP 服务器请求时间。然后它会不断检查响应,并在收到 NTP 响应时更新时间。如果超过 24 小时没有收到任何响应,则说明有问题,ESP 会自行重置。 每分钟,ESP 都会向 DS18x20 传感器请求温度,并设置“tmpRequested”标志。传感器将启动模数转换。 请求后 750 毫秒,当转换应该完成时,ESP 从传感器读取温度,并重置标志(否则,它将一遍又一遍地读取相同的温度)。然后它将时间和温度写入 SPIFFS 中的文件。 通过将其保存为文件系统中的 CSV 文件,我们可以轻松地将其下载到客户端(使用正在运行的 Web 服务器),并且很容易使用 JavaScript 进行解析。 如果我们错过了第一个 NTP 响应,timeUNIX 将为零。如果是这种情况,我们发送另一个 NTP 请求(否则,下一个请求将在一个小时后,并且温度记录仅在时间已知时开始)。 我们还需要运行服务器和 OTA 函数来处理 HTTP 和 OTA 请求。 设置函数、服务器处理程序和辅助函数 这些函数自上一个示例以来没有改变,因此这里没有必要介绍它们。不过,您确实需要它们来运行程序。下载带有完整草图示例的 ZIP 存档。 SD卡模块 该模块(microsd卡适配器)是 micro sd卡读卡器模块,通过文件系统驱动和spi接口,微控制器系统完成micro sd卡文件的读写。用户可以直接使用arduino ide自带的sd卡完成借书卡的初始化和读写。 HTML 和 JavaScript 有一些 HTML 和 JavaScript 文件可以使用 Google Graphs 绘制温度。我不会在这里介绍它,但如果你想知道它是如何工作的,你可以在 ZIP 存档中找到这些文件。 使用示例 如果您打算长时间使用它,请将 SPIFFS 大小设置为 64KB 或更大。(您也可以增加第 80 行的记录间隔以节省空间。) 代码 用法 [代码] 诠释 LED=13;//内置LED引脚 整数 MQ135=5;//MQ135的输出引脚 无效设置() { pinMode(LED,输出);//LED为输出 pinMode(MQ135,输入);//MQ135为输入 序列号.开始(9600);//串口监视器的波特率为9600 } 无效循环() { int MQValue=digitalRead(MQ135); 如果(MQValue==0) { 数字写入(LED,高);//写高电平到LED Serial.print("有有害气体"); } 别的 { 数字写入(LED,低);//将低电平写入LED Serial.print("很干净"); } } 在第 138-140 行输入您的 Wi-Fi 凭据,然后点击上传。然后使用 Tools > ESP8266 Sketch Data Upload 将网页和脚本上传到 SPIFFS。
|
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
9575 浏览 0 评论
8941 浏览 0 评论
13328 浏览 0 评论
4387 浏览 0 评论
4641 浏览 0 评论
354浏览 1评论
490浏览 1评论
IPC-6012E CN 2020中文 CN 刚性印制板的鉴定及性能规范
585浏览 1评论
383浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 09:55 , Processed in 1.551288 second(s), Total 72, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号