M5Stackでできること 〜micro SDカード内のCSVファイルを読み取る

M5StackでWi-Fiに接続する場合、Arduino IDEスケッチにWi-Fiルータの「SSID」と「パスワード」を記載する必要があります。

自分で使う場合は特に問題ないのですが、そのIoTデバイスを他人に使ってもらおうとすると、いろいろと問題が発生します。
利用者自身に「SSID」と「パスワード」を変更してもらおうと思うと、スケッチそのものを渡さなければならない上、Arduino IDEの使い方も教えなければいけません。
一方、自分で「SSID」と「パスワード」を変更しようとすると、他人からWi-Fiルータの「パスワード」を教えてもらわなければならず、そもそも作業自体もそれなりの手間になります。
スケッチを書き換えず、スマホなどからESP32のWi-Fi設定を変更できる「WiFiManager」もありますが、使い方に少々クセがある上に、やはり他人に「WiFiManager」の使い方を教える手間は生じます。

また、「SSID」や「パスワード」以外にも、データを採取する際の「時間間隔」や、異常を検知するための「しきい値」など、利用者が変更したくなる変数はあります。

このように、スケッチ内の変数の値を後から変更したくなる機会は結構ありますが、そのような時に最も簡単で分かりやすい方法は「SDカード」の利用ではないかと思います。
M5Stackにはmicro SDカードのスロットがついています。micro SDカードに各変数の値を書き込んでM5Stackに挿入し、スケッチではカードの内容を読みこんで変数に設定するようにしておくことで、スケッチを書き換えなくても変数の値を所望のものにすることができます。

また、変数の値を保存するファイルを「CSV」形式にしておけば、利用者はExcelで変数の値を記入できます。パソコンでExcelデータを編集し、それをmicro SDカードに保存するという使い方なら、ITに疎い利用者でもそれほど抵抗なく使えるのではないかと思います。

そんな訳で、micro SDカードに保存されたCSVファイルの内容を読み取り、それを変数の値として設定してみようと思います。


最初にExcelで「var_list1.csv」というファイルをつくり、それをmicro SDカードに保存します。内容は以下のとおりです。

スケッチ内の変数「variable0」の値を「600」に、「variable1」の値を「3.1415926」に、「variable2」の値を「my-password」に設定するのが目標です。

micro SDカードはM5Stackに挿入しておきます。

「CSV-Parser-for-Arduino」というライブラリがあるので、それを使います。
Arduino IDEのライブラリマネージャで「CSV Parser by Michal Borowski」というライブラリをインストールします。

このライブラリは、CSVファイルの1行目がヘッダ、2行目以降にデータが羅列されているという書式を想定しているようです。
そのため、読み取るデータの書式(整数、文字列など)を列ごとに指定できるようになっていますが、今回は値の書式がまちまちなので、一旦すべてを「文字列」として読み取り、読み取った後に所望の書式で変数に設定することにします。

スケッチは以下のとおりです。

#include <M5Stack.h>
#include <CSV_Parser.h>

const char* fname = "/var_list1.csv";

int   variable0;
float variable1;
char* variable2;

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.fillScreen(BLACK);

  if(!SD.begin()) {
    M5.Lcd.println("Card error.");
    while(1);
  }

  CSV_Parser cp(/*format*/ "ss", /*has_header*/ false);

  File fp = SD.open(fname, FILE_READ);
  if(!fp) {
    M5.Lcd.println("File open error.");
  } else {
    while(fp.available()) {
      cp << (char)fp.read();
    }   
    fp.close();
  }

  char **col0 = (char**)cp[0];
  char **col1 = (char**)cp[1];

  for(int row=0; row<cp.getRowsCount(); row++) {
    if(strcmp(col0[row],"variable0")==0) variable0 = atoi(col1[row]);
    if(strcmp(col0[row],"variable1")==0) variable1 = atof(col1[row]);
    if(strcmp(col0[row],"variable2")==0) variable2 = col1[row];
  }

  M5.Lcd.println(variable0);
  M5.Lcd.printf("%.5f\n", variable1);
  M5.Lcd.println(variable2);
}

void loop() {
}

「CSV-Parser-for-Arduino」を使うことで、col0[0] が「variable0」、col0[1] が「variable1」、col0[2] が「variable2」、col1[0] が「600」、col1[1] が「3.1415926」、col1[2] が「my-password」になります。
これらの値を所望の書式にして、変数「variable0」「variable1」「variable2」に設定します。

M5StackのLCD画面に、各変数に設定された値が表示されます。

M5Stackのmicro SDカードスロットを使うことで、スケッチを書き換えることなしに、スケッチ内の変数に所望の値を設定することができました。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。