Mqtt 我正在写一个代码来读取DHT11值和控制4继电器,但温度。传感器每次都显示“nan”

Mqtt 我正在写一个代码来读取DHT11值和控制4继电器,但温度。传感器每次都显示“nan”,mqtt,arduino-esp8266,Mqtt,Arduino Esp8266,我正在使用NodeMCU ESP8266-12E制作一个关于家庭自动化和温度读数的项目。我在DHT11.h库中使用DHT11传感器,但我的温度传感器显示的是nan而不是任何值。我不知道我在哪里落后了 我的代码如下: 包括DHT.h//包括DHT11温度和湿度传感器库 定义DHT类型DHT11//DHT 11 包括 包括Adafruitmqtt.h 包括adafru\MQTT\u Client.h 定义关系1 D1 定义关系2 D2 定义关系3 D3 定义关系4 D4 在D0中定义dhtp DHT

我正在使用NodeMCU ESP8266-12E制作一个关于家庭自动化和温度读数的项目。我在DHT11.h库中使用DHT11传感器,但我的温度传感器显示的是nan而不是任何值。我不知道我在哪里落后了

我的代码如下:

包括DHT.h//包括DHT11温度和湿度传感器库 定义DHT类型DHT11//DHT 11 包括 包括Adafruitmqtt.h 包括adafru\MQTT\u Client.h 定义关系1 D1 定义关系2 D2 定义关系3 D3 定义关系4 D4 在D0中定义dhtp DHT-dhtDHTPIN,DHTTYPE; 浮子温度; 字符串webString=; 无符号long-previousMillis=0; 常数长间隔=2300; 定义WLAN_SSID internet//您的SSID 定义WLAN_PASS********//您的密码 /*************************Adafruit.io设置*********************************/ 定义AIO_服务器io.adafruit.com//adafruit服务器 定义AIO_服务器端口1883 定义AIO_用户名foo//USERNAME 定义AIO_密钥栏//验证密钥 //无线客户端 无线客户端; Adafru MQTT_客户端MQTT&Client、AIO_服务器、AIO_服务器端口、AIO_用户名、AIO_密钥; //为发布设置一个名为“photocell”的提要。 //请注意,AIO的MQTT路径的格式如下:/feed/ const char TEMP_FEED[]PROGMEM=AIO_USERNAME/FEED/photocell; Adafruit_MQTT_Publish photocell=Adafruit_MQTT_Publish&MQTT,AIO_用户名/feed/photocell; Adafruit_MQTT_Subscribe Light1=Adafruit_MQTT_Subscribe&MQTT,AIO_用户名/feeds/Relay1;//提要的名称在任何地方都应该相同 Adafruit_MQTT_Subscribe Light2=Adafruit_MQTT_Subscribe&MQTT,AIO_用户名/feed/Relay2; Adafruit_MQTT_Subscribe Light3=Adafruit_MQTT_Subscribe&MQTT,AIO_用户名/feed/Relay3; Adafruit_MQTT_Subscribe Light4=Adafruit_MQTT_Subscribe&MQTT,AIO_用户名/feed/Relay4; 无效MQTT_连接; 无效设置 { 从15200年开始; 延迟10; dht.begin; //打印温度传感器的详细信息。 引脚1,输出; pinModeRelay2,输出; pinmoderlay3,输出; 引脚长度4,输出; //连接到WiFi接入点。 Serial.println; Serial.println; 串行打印连接到; Serial.printlnWLAN_SSID; WiFi.beginWLAN_SSID、WLAN_PASS; 当WiFi.status!=WL\U已连接时{ 延迟500; 连载。; } Serial.println; 已连接串行.printlnWiFi; Serial.printlnIP地址:; Serial.printlnWiFi.localIP; temp_f=dht.readTemperaturetrue; Serial.println; 串行打印初始温度:; Serial.printlntemp\u f; Serial.println; mqtt.subscribe&Light1; mqtt.subscribe&Light3; mqtt.subscribe&Light2; mqtt.subscribe&Light4; } int delayTime=300000//等待5分钟,然后再将数据发送到web int startDelay=0; 空穴环 { MQTT_连接; 如果毫秒-开始延迟<延迟时间{ 串行打印延迟时间; } 否则{ temp\u f=dht.readTemperaturetrue;//在Farenheit中获取temp 起始时间=毫秒; Serial.printF\n发送温度:; Serial.printtemp\u f; 连载。打印。。。; if!photocell.publishtemp_f{//发布到Adafruit Serial.printlnfailed; } 否则{ 连载。打印输入!; } } /*//int t=dht.readTemperaturetrue; //t=t/100000000; 串行.printF\n发送光电池值; Serial.printt; 连载。打印。。。; 如果!光电管{ Serial.printlnfailed; }否则{ 连载,printlnFOK!; }*/ Adafruit_MQTT_订阅*订阅; 而subscription=mqtt.readSubscription2000{ 如果订阅==&1{ Serial.printFGot:; Serial.printlnchar*Light1.lastread; int Light1_State=atoichar*Light1.lastread; digitalWriteRelay1,Light1_状态; } 如果订阅==&2{ Serial.printFGot:; Serial.printlnchar*Light2.lastread; int Light2_State=atoichar*Light2.lastread; digitalWriteRelay2,Light2_状态; } 如果订阅==&Light3{ Serial.printFGot:; Serial.printlnchar*Light3.lastread; int Light3_State=atoichar*Light3.lastread; digitalWriteRelay3,Light3_状态; } 如果订阅==&Light4{ Serial.printFGot:; Serial.printlnchar*Light4.lastread; int Light4_State=atoichar*Light4.lastread; digitalWriteRelay4,Light4_状态; } } //这是我们的“等待传入订阅包并回调它们”忙碌子循环 //尽量在这里消磨时间: mqtt.processPackets500; } 无效MQTT_连接 { 国际贸易; 如果mqtt.connected{ 回来 } Serial.print连接到MQTT; uint8_t重试次数=3次; 而ret=mqtt.connect!=0{ Serial.printlnmqtt.connectErrorStringret; Serial.printlnRetrying MQTT con 在5秒钟内连接。。。; mqtt.disconnect; 延迟5000; 重试-; 如果重试次数==0{ 1; } } Serial.printlnMQTT已连接!; }
您尝试在设置中读取温度和湿度。但您需要在dht开始后和读取之前至少等待2秒,因为传感器读数也可能高达2秒


因此,请在第一次阅读之前添加delay2000。

请登录adafruit并撤销您刚刚发布到internet上的密钥。每次都是什么意思?每次启动程序时,或每次延迟5分钟后?您可能想更改WiFi密码,因为代码中也有此密码。后续读取后,还必须添加延迟。读取温度的频率不可能超过每2秒一次。