ESP32搭配DHT11使用DHT_nonblocking库无有效数据输出问题
解决DHT_nonblocking集成到ESP32异步Web服务器的温湿度数据异常问题
问题根源
DHT_nonblocking是非阻塞式采样库,它不像传统DHT库那样单次调用就读取数据,而是需要在主循环里持续调用dht.tick(),由库自己判断合适的时机完成传感器采样和解析。如果你的异步Web服务器代码里没做好这个调用逻辑,或者在回调里错误地读取数据,就会导致数据一直停留在初始的0或空值。
具体修复方案
1. 全局变量正确声明
把传感器实例和温湿度变量设为全局,保证Web服务器的回调能拿到最新数据:
#include <Arduino.h> #include <WiFi.h> #include <AsyncWebServer.h> #include <DHT_nonblocking.h> #define DHT_TYPE DHT_TYPE_11 #define DHT_PIN 27 // 全局传感器实例 DHT_nonblocking dht_sensor(DHT_PIN, DHT_TYPE); // 存储最新采样的温湿度 float current_temp = 0.0f; float current_humidity = 0.0f; const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; AsyncWebServer server(80);
2. 主循环必须持续调用tick()
在loop()里一定要不停调用tick(),并且在传感器返回有效数据时更新全局变量:
void loop() { // 这行是核心,必须一直调用,不能丢 dht_sensor.tick(); // 检查传感器状态,只有成功读取时才更新变量 if (dht_sensor.getStatus() == DHT_OK) { current_temp = dht_sensor.getTemperature(); current_humidity = dht_sensor.getHumidity(); // 可选:串口打印验证数据 // Serial.print("Temp: "); Serial.print(current_temp); // Serial.print("°C | Humidity: "); Serial.print(current_humidity); Serial.println("%"); } // 异步Web服务器不需要手动调用handleClient(),框架会自动处理 }
3. Web回调直接用全局变量
绝对不要在Web请求的回调里去调用传感器读取方法,直接用已经更新好的全局变量构造响应:
void setup() { Serial.begin(115200); // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("连接WiFi中..."); } Serial.println("WiFi已连接"); // 配置根路由的响应 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ String html = "<html><body>"; html += "<h1>温湿度监测</h1>"; html += "<p>当前温度: " + String(current_temp) + " °C</p>"; html += "<p>当前湿度: " + String(current_humidity) + " %</p>"; html += "</body></html>"; request->send(200, "text/html", html); }); server.begin(); }
4. 避开这些坑
- 别在Web回调里操作传感器:异步回调的执行时机不固定,会打乱DHT_nonblocking的采样节奏,导致数据出错。
- 不要省略
tick()调用:这是库更新数据的唯一途径,主循环里必须保证它被持续执行,哪怕其他逻辑占了时间,也要留时间给它。 - 确认库版本:用适配ESP32的DHT_nonblocking版本,旧版本可能有兼容性问题。
验证步骤
- 上传代码后打开串口监视器,确认能看到温湿度数据正常打印(如果开了串口输出)。
- 访问ESP32的IP地址,Web页面上的数值应该和串口一致,且能定期更新。
内容的提问来源于stack exchange,提问作者Shrest Burra
相关产品推荐
相关产品推荐

