0

arduino用のonewireライブラリに含まれている例のコードを変更して、接続したonewireデバイスの数に関係なく、常にそれらを見つけて、デバイスIDと現在の温度を使用してMQTTに公開しようとしています。温度を公開してもらいましたが、16 進数のデバイス 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);
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 に初期化します。これにより、バッファーに書き込まれるものはすべて確実に null で終了します。繰り返しますが、String 型を経由する必要はありません。

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

最後に、メッセージを発行します。

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