0

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

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

主题 = 摄氏度,例如 12.09

有效载荷(或 msg)= \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);
4

1 回答 1

3

将此添加到草图顶部,在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。这确保了写入缓冲区的任何内容肯定会以空值结尾。同样,您不需要通过 String 类型:

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

最后,发布消息:

client.publish(charTopic,charMsg);
于 2013-07-05T09:53:19.097 回答