2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Arduinoのfloatをbyte配列へ格納

Posted at

これまた単に備忘録です。

しかも今回はネット引用ではなく、色々調べたり試した挙句、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が出したのがシンプル過ぎてね。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?