Onewire温度到MQTT代理服务器

时间:2013-07-05 03:54:44

标签: arduino mqtt

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

所以例如我希望它看起来像这样。请注意,MQTT的主题和消息需要为Char *(此处有更多信息:http://knolleary.net/arduino-client-for-mqtt/api/#publish1

topic = Celsius,例如12.09

有效载荷(或msg)= \ home [ROM] \ temperature \ current例如。 \家\ 2894AA6220025 \温度\电流

(只是你在没有我添加的情况下运行代码时通常得到的输出的一个例子,这是串行输出!!注意我想要使用的ROM和摄氏度) enter image description here

在这里放了我的完整代码,它只是对包含的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);

1 个答案:

答案 0 :(得分: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。这样可以确保写入缓冲区的内容肯定会以空值终止。同样,您不需要通过字符串类型:

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

最后,发布消息:

client.publish(charTopic,charMsg);