これまた単に備忘録です。
しかも今回はネット引用ではなく、色々調べたり試した挙句、ChatGPTに質問投げたら素晴らしくシンプルなやり方で解決したので、これは残しておこうというものです。
通常、浮動小数点なデータをわざわざByte型に変えるなんてもう、通信でデータ転送するくらいしかないわけです。
勿論今回悩むに至った経緯も、通信に乗せるにあたって。
しかし、共同体UNITなどを使ってArduinoのSerialライブラリでそのデータ自体を送信する方法はあるあるとして、
今回は、少しまとまったデータの一部分に、Arduinoボード上で取得したFloatデータ(具体的には温度データなんですけど)を乗せたいとおもった次第です。
まずは結論から
to ChatGPT : Arduinoで、floatをbyte配列に分割格納するには?
float value = 3.14159; // 分割するfloat値
byte* bytes = (byte*)&value; // float値の先頭アドレスをbyteポインタにキャストする
for (int i = 0; i < sizeof(value); i++) {
byte b = bytes[i]; // ポインタからbyte値を取得する
// 取得したbyte値を何らかの方法で格納する
}
素晴らしい!
もうなんてシンプルなんでしょ!!
付け加えてエンディアンの注意事項まで回答してきてくれるので、もうそりゃ人類はAIがかわいく見えて仕方なくなるわけですwww
(たとえその様に仕組まれているとわかっていようとも・・・)
ちなみに後述のため、失敗談も載せておきます。
すぐに思いついた方法「1byte毎シフトして格納」
ArduinoのFloatが4byteデータなので・・・
float value = 3.14159;
byte Data[] = {0,0,0,0};
Data[0] = (byte)((value & 0xff000000) >> 24);
Data[1] = (byte)((value & 0x00f00000) >> 16);
Data[2] = (byte)((value & 0x0000ff00) >> 8);
Data[3] = (byte)((value & 0x000000ff) >> 0);
はい、これだとArduino IDEのコンパイラがFloat、intのデータキャストできんと文句言ってきます。
もしかすると、配列にしなければ上手くいくのか???
今度試してみようか・・・
勿論、単に取得したFloatデータをそのままSerialライブラリ使って送信したいなら、
floatを共同体で宣言すして利用する方法
typedef union {
float value;
byte bytes[4];
} uf;
uf uf1;
uf1.value = 3.14159;
Serial.write(uf1.bytes, 4);
というものありますかね。
でもAIが出したのがシンプル過ぎてね。