ESP8266使用MQTT向Node-RED发字符串失败、消息无法被接收求助
ESP8266 MQTT发布故障排查与修复方案
全局变量被局部覆盖,时间判断逻辑失效
原因:你已经在全局定义了unsigned long lastMsg = 0,但在setup()函数中又重复定义了同名局部变量unsigned long lastMsg = 0,导致全局的lastMsg一直没有被更新,loop()中的发送间隔判断逻辑完全失效。
修复:直接删除setup()函数中unsigned long lastMsg = 0;这一行即可。传感器未上电,读取数值异常
原因:你配置了D2为传感器供电引脚,但在读取模拟值前没有给D2输出高电平,传感器全程处于未工作状态,读取的VWC数值完全错误。
修复:在loop()中读取analogRead(0)之前添加一行digitalWrite(2, HIGH);。字符串消息
msgtext未正确初始化/格式化错误
原因:- 你使用
sprintf时传入了VWC参数,但格式化字符串中没有对应的占位符,参数被闲置 - 当
VWC处于Threshold1和Threshold2之间时,msgtext没有被赋值,内部为随机内存垃圾值,发布的消息内容异常
修复:
首先给msgtext设置默认值,修改sprintf格式化语句,带上VWC数值:
if (now - lastMsg > 500) { lastMsg = now; // 先设置默认值 strcpy(msgtext, "VWC is in normal range"); if (VWC < Threshold1) { Serial.print("WARNING:(too low) Irrigation needed. "); // 增加%.2f占位符输出VWC数值 sprintf(msgtext,"Irrigation needed, VWC:%.2f",VWC); } if (VWC > Threshold2) { Serial.print("WARNING:(too high) Irrigation not needed. "); sprintf(msgtext,"Irrigation not needed, VWC:%.2f",VWC); }- 你使用
浮点数值格式化错误
原因:VWC是浮点类型,你使用%i(整型格式符)格式化,会直接截断小数部分,输出错误的整数值。
修复:修改数值格式化语句,用浮点格式符:// 保留2位小数输出 sprintf(msg,"%.2f",VWC);可选调试建议
发布消息前增加串口打印,确认发送内容正确:Serial.print("Publish VWC_msg: "); Serial.println(msgtext); Serial.print("Publish VWC_val: "); Serial.println(msg); client.publish("GW_sensor/VWC_msg", msgtext); client.publish("GW_sensor/VWC_val", msg);同时确认Node-RED侧MQTT in节点的服务端地址、端口与Arduino代码中
mqtt_server、端口1883一致,订阅主题与Arduino发布的主题完全匹配即可。
内容的提问来源于stack exchange,提问作者sondeskh
相关产品推荐
相关产品推荐

