【问题标题】:Onewire temperatures to MQTT broker server连接到 MQTT 代理服务器的 Onewire 温度
【发布时间】:2017-04-24 21:33:23
【问题描述】:

我正在尝试修改 arduino 的 onewire 库中包含的示例中的代码,这样无论我插入了多少个 onewire 设备,它总能找到它们并使用设备 ID 和当前温度将其发布到 MQTT .我已经得到它来发布温度,但是在将十六进制的设备 ID 或 ROM 添加到我的主题时遇到问题。

例如,我希望它看起来像这样。注意 MQTT 的主题和消息必须是 Char*(更多信息:http://knolleary.net/arduino-client-for-mqtt/api/#publish1

主题 = 摄氏度,例如 12.09

有效负载(或消息)= \home[ROM]\temperature\current 例如。 \home\2894AA6220025\温度\电流

(只是您在没有我添加的情况下运行代码时通常得到的输出示例,这是串行输出!!注意我要使用的 ROM 和摄氏度)

已将我的完整代码放在这里,它只是对包含的 onewire 示例的修改,并添加了 pubsub MQTT 部分。
(见第 155 行以后)https://gist.github.com/matbor/5931466

//publish the temp now to mqtt topic
  String strTopic = "/house/285A9282300F1/temperature/current"; // need to replace the 285A9282300F1 with the ROM ID on each LOOP!
  char charMsg[10];
  String strMsg = dtostrf(celsius, 4, 2, charMsg); //convert celsius to char
  char charTopic[strTopic.length() + 1];
  //char charMsg[strMsg.length() + 1];
  strTopic.toCharArray(charTopic, sizeof(charTopic));
  strMsg.toCharArray(charMsg, sizeof(charMsg));
  client.publish(charTopic,charMsg);

【问题讨论】:

标签: arduino mqtt


【解决方案1】:

将此添加到您的草图顶部,在loop 函数之外:

char hexChars[] = "0123456789ABCDEF";
#define HEX_MSB(v) hexChars[(v & 0xf0) >> 4]
#define HEX_LSB(v) hexChars[v & 0x0f]

这定义了一对宏,它们返回 int 的最重要和最不重要的字节作为适当的 HEX 字符。 (可能有更合适的内置函数,但这是我出于习惯使用的)。

以下代码会将 ROM 作为 HEX 字符串插入到主题中。请注意,您可以直接将主题创建为 char[] - 您不需要通过 String 对象。

char charTopic[] = "/house/XXXXXXXXXXXXXXXX/temperature/current";
for (i = 0; i < 8; i++) {
    charTopic[7+i*2] = HEX_MSB(addr[i]);
    charTopic[8+i*2] = HEX_LSB(addr[i]);
}

对于有效负载,我不确定它是否是 100% 必要的,但是当用作缓冲区时,我总是将任何 char[] 显式初始化为全 0。这确保了写入缓冲区的任何内容肯定会以空值结尾。同样,您不需要通过字符串类型:

char charMsg[10];
memset(charMsg,'\0',10);
dtostrf(celsius, 4, 2, charMsg);

最后,发布消息:

client.publish(charTopic,charMsg);

【讨论】:

  • 很棒的工作,唯一的问题是串行打印显示'ROM = 28 5A 92 82 3 0 0 F1'但主题有'285A9282030000F1'它有额外的零,实际上我假设你的是比串行打印更正确!
  • 嘿-是的。我的代码确保严格每个字节转换两个字符,因此 0 变为 '00'。事实上,任何
  • 这么想,再次感谢您的帮助。已更新上述要点上的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2015-02-22
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多