Arduinoに複数センサーを接続してRaspberry Piで値を取得したい。
シリアル通信を行うが、Pythonでテキストのパーサーを書くのも面倒だし、Arduinoでパーサーしやすい形を手打ちするのも手間。
楽にArduinoからデータを吸い出せないか検索していた所、JSONを使って実現することが出来た。
以下のサイトから取得したいデータに応じてkey, valueを入力し、次々進んでいくとArduinoに必要なプログラムを自動生成してくれる。
ArduinoJson Assistant 6
The ArduinoJson Assistant is an online tool that computes the required JsonDocument capacity for a given document and ge...
CO2と湿度を取得したかったので、こんな感じになった。
StaticJsonDocument<16> doc;
doc["co2"] = 1.1;
doc["humidity"] = 2.2;
serializeJson(doc, output);
Arduinoにコピペし、数値の部分を変数に書き換え。
output先はシリアル通信先なのでそれも書き換え。
printlnで改行コードを挟むのも忘れない。
#include <ArduinoJson.h>
void setup()
{
...
}
void loop()
{
float co2, humidity;
co2 = ... ;
humidity = ... ;
doc["co2"] = co2;
doc["humidity"] = humidity;
serializeJson(doc, Serial);
Serial.println("");
}
Pythonとシリアル通信を開始する。
Arduinoと通信するタイミングによってはJSONの途中の文字列から受信する可能性があるので、try, exceptは必須。
import serial
import json
PORT = "/dev/ttyACM0"
BAUDRATES = ...
ser = serial.Serial(PORT, BAUDRATES)
while True:
byte_data = ser.readline()
str_data = byte_data.decode().split()[0]
try:
json_data = json.loads(str_data)
except json.JSONDecodeError:
continue
これでArduinoから複数の値をRaspberry Piに送信し、Pythonで簡単に受信することが出来た。
参考
https://frenchsavvy.com/2020/12/30/python-serial-port-arduino-and-json/
コメント