Arduino智能手表项目中DHT11传感器温湿度显示NAN求助
解决DHT11输出NaN问题的排查与修复方案
硬件排查步骤
- 确认DHT11接线正确性:VCC接5V(DHT11不兼容3.3V),GND接Arduino GND,DATA引脚接引脚2;必须在DATA与VCC之间串联10K上拉电阻(部分集成模块自带,裸传感器需额外添加)。
- 用万用表检测DHT11供电电压,确保稳定在5V±0.2V范围内,电压不足会导致传感器无法正常输出数据。
- 更换DHT11传感器测试,这类低成本传感器故障率较高,硬件损坏是常见原因。
软件修改建议
- 移除冲突库:代码中同时引入
DHT.h和DHT_U.h会导致库冲突,仅保留DHT.h即可。 - 添加数据有效性校验:读取数据后检查是否为NaN,同时通过串口输出状态信息,便于排查问题。
- 增加采样间隔:DHT11要求至少2秒的采样间隔,频繁读取会导致传感器无响应。
修改后的代码:
#include <DHT.h> #include <Wire.h> #include <Adafruit_SH1106.h> #define OLED_RESET 4 Adafruit_SH1106 display(OLED_RESET); #define DHT_TYPE DHT11 #define DHT_PIN 2 DHT HT(DHT_PIN, DHT_TYPE); float humi; float tempC; float tempF; int current_menu; int menu_knob_state; void setup() { Serial.begin(9600); display.begin(SH1106_SWITCHCAPVCC, 0x3C); display.display(); display.clearDisplay(); HT.begin(); } void mainmenu() { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.setTextColor(BLACK, WHITE); display.print("Archimedes V1 - Menu "); display.setTextSize(2); display.setCursor(15, 20); display.setTextColor(WHITE); display.print("12:00:00"); display.setTextSize(1); display.setCursor(35, 40); display.setTextColor(WHITE); display.print("01/01/1900"); display.display(); } void tempmenu(float tempC, float tempF, float humi){ display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.setTextColor(BLACK, WHITE); display.print("Archimedes V1 - Temp."); display.setTextSize(2); display.setCursor(3, 20); display.setTextColor(WHITE); // 校验温度数据,无效时显示错误 if(isnan(tempF)){ display.print("Err"); } else { display.print(tempF); display.setCursor(40, 20); display.print("F"); } display.setCursor(73, 20); if(isnan(tempC)){ display.print("Err"); } else { display.print(tempC); display.setCursor(110, 20); display.print("C"); } display.setTextSize(1); display.setCursor(20, 40); display.print("Humidity:"); display.setCursor(80, 40); if(isnan(humi)){ display.print("Err"); } else { display.print(humi); display.print("%"); } display.display(); } void loop() { menu_knob_state = analogRead(A0); Serial.println(menu_knob_state); // 每2秒读取一次数据 static unsigned long lastReadTime = 0; if(millis() - lastReadTime >= 2000){ lastReadTime = millis(); humi = HT.readHumidity(); tempC = HT.readTemperature(); tempF = HT.readTemperature(true); // 串口输出读取状态 if(isnan(humi) || isnan(tempC)){ Serial.println("读取DHT11数据失败"); } else { Serial.print("湿度: "); Serial.print(humi); Serial.print("% 温度: "); Serial.print(tempC); Serial.print("C "); Serial.print(tempF); Serial.println("F"); } } if(menu_knob_state <= 256){ current_menu = 0; mainmenu(); } else { current_menu=1; tempmenu(tempC, tempF, humi); } // 避免频繁刷新OLED,添加短延迟 delay(50); }
内容的提问来源于stack exchange,提问作者AtomicUnleashed
相关产品推荐
相关产品推荐

