ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【M5StickC Plus/Arduino】Arduinoでjsonを扱う

 最近ArduinoというかESP32というかM5StickC Plusをいじって遊んでいますが、ふと「jsonって扱えたりするのかな」と思って調べてみるとすでにそういうライブラリがいくつか存在することがわかりました。

 その中で今回は「ArduinoJson」というライブラリを使ってみたのでその備忘録です。

 では、始めます。


1:ArduinoJsonライブラリについて
 ArduinoJsonの公式ページは以下のリンクです。

 今回は公式ページのDocumentationのInstallationの「Option 1」に沿ってやっていきます。

 その他にもスケッチ例など様々な情報が公式ページにあるので、詳しく知りたい場合は各自で参照してください。


2:ArduinoJsonライブラリのインストール
 Arduino IDEを起動させてメニューの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択します。
f:id:rikoubou:20210412152028p:plain

 ライブラリマネージャの画面が出てくるので検索欄に「arduinojson」と入力してEnterキーを押し、出てきた一番上にある「Arduino Json」とかかれたライブラリの「インストール」ボタンをクリックします。
f:id:rikoubou:20210412152246p:plain

 Arduino Jsonのライブラリに「INSTALLED」の文字が出ていたらインストール完了です。
f:id:rikoubou:20210412152523p:plain


3:ArduinoJsonを使ってみる
 インストールができたので、とりあえず文字列のjsonから値を取得してみます。

 基本的な記述方法は以下のようになります。

#include <ArduinoJson.h>

char json[] = "{\"hello\":\"world\"}"; // json文字列

StaticJsonDocument<64> doc;  // メモリを確保(静的)
// DynamicJsonDocument doc(64); // メモリを確保(動的)

deserializeJson(doc, json);       // json形式に変換
const char* world = doc["hello"]; // 値の取り出し

 StaticJsonDocumentは静的、DynamicJsonDocumentは動的な場合に使用します。StaticJsonDocumentの方が処理が速いらしいのでできる限りこちらを利用するのが良いかと思います。
 このStaticJsonDocumentまたはDynamicJsonDocumentを使用する際には予めメモリを確保しておく必要があります。メモリをどのぐらい確保するべきかは次に紹介する「ArduinoJson Assistant」を使うと簡単です。


4:ArduinoJson Assistantの使い方
 例えば以下のようなjsonがあったとします。

{ "test": "hello", "value": 314 }

 このjsonから値を取得する際のStaticJsonDocumentまたはDynamicJsonDocumentのメモリを計算していきます。

 始めに「ArduinoJson Assistant」のページを開きます。

 開くと「Processor」、「Mode」、「Input type」の項目があるので、プルダウンから選んでいきます。

 今回は「文字列として受け取ったjsonをM5StickC Plusで使いたい」のでProcessorは「ESP32」、「Mode」は「Deserialize」、「Input type」は「String」を選択して「Next:JSON」をクリックします。
f:id:rikoubou:20210416160205p:plain

 テキストボックスのある画面が表示されるので、取得したいjsonを入力して「Next:Size」をクリックします。ちなみに右下にある「Prettify」をクリックするとjsonを見やすい形に整形してくれます。
f:id:rikoubou:20210416160413p:plain

 この画面でメモリサイズの計算結果が表示されます。ここの数値を使えば良いのですが「Next:Program」をクリックするとサンプルのコードが表示されます。
f:id:rikoubou:20210416160618p:plain

「Next:Program」をクリックしてみると以下のようにサンプルコードが表示されるのでコピペしてそのまま使うことができます。
f:id:rikoubou:20210416160914p:plain



5:実際に動かしたスケッチ
 サンプルコードだけを見てもどう使うかイマイチわからないかもしれないので、実際にスケッチにして使ってみます。

 4の例と同じ以下のjsonとします。

{ "test": "hello", "value": 314 }

 このjsonのそれぞれの項目の値を取得してM5StickC Plusの画面に表示させるスケッチは以下の通りです。

・M5StickCPlus_json_test.ino

#include <M5StickCPlus.h>
#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);

  M5.begin();
  M5.Axp.ScreenBreath(10); // 画面の明るさ(7-12)
  M5.Lcd.setRotation(0);   // 画面を縦向きに(0-3)
  M5.Lcd.setTextSize(2);   // フォントサイズは2

  // jsonの文字列
  String jsonStr = "{ \"test\": \"hello\", \"value\": 314 }";

  // メモリを確保してjsonに変換
  StaticJsonDocument<64> doc;
//  DynamicJsonDocument doc(64); // 動的な場合はこっち
  DeserializationError error = deserializeJson(doc, jsonStr);

  if (error) {
    // エラーの場合
    M5.Lcd.print(F("deserializeJson() failed: "));
    M5.Lcd.println(error.f_str());
  } else {
    // 正常な場合は値を取得して表示
    const char* test = doc["test"];
    int value = doc["value"];   

    M5.Lcd.print("test: ");
    M5.Lcd.println(test);
    M5.Lcd.print("value: ");
    M5.Lcd.println(value);
  }

  Serial.println("setup end");
}

void loop() {
  
}

 このスケッチを実行すると以下のようにちゃんとjsonの値が取得でき、画面に表示されています。
f:id:rikoubou:20210416161841p:plain

 以上がArduinojsonを扱うためのライブラリ「ArduinoJson」についてです。

 今回はESP32というかM5StickC Plusでやりましたが、普通のArduino Unoなどでも使えると思うので割と色々便利そうです。


・参考資料