You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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未正确初始化/格式化错误
    原因:

    1. 你使用sprintf时传入了VWC参数,但格式化字符串中没有对应的占位符,参数被闲置
    2. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 04:45:07