M5StackにはLCDディスプレイとmicroSDスロットが付いているため、何か集めたデータを手軽に表示するのにピッタリです。
そこで、microSDカードに入ったCSVファイル内の数値を読み込む方法について説明したいと思います。
ここでは、以下のようなデータの入った、Data.csvというファイルの3列目の数字を取得することを目指します。
#M5StackからmicroSDにアクセスし、CSVファイル内の数値を読み込む
まずM5StackからmicroSDにアクセスします。
このコードを書くことで、Data.csvファイルにアクセスすることができます。
void loop() {
File file = SD.open("Data.csv");
続いて、CSVファイルに入っている文字を読み込みます。
続いて、読み込んでいる文字が何列目にあるのかを知るために、読み込んだ文字がカンマであるかどうかを調べます。そしてカンマである場合には、カウンターの値を1つ増やすことにします。今回はint型でconnma_countという文字を用意しました。
そしてカウンターの値が、2で割って余りが0になる時から、文字をカウントします。
buf[0] = file.read();
if(connma_count%2==0 && connma_count>2){
value[buf_number] = buf[0];
buf_number++;
}
if (buf[0] == ',') {
connma_count++;
}
ここで注意するポイントとして、読み込んだ文字を繰り返し用いたい場合には、毎回read()関数を使わずに、一度変数に代入してからその変数を使うようにして下さい。毎回read()を使うと、実行する度に読み込んでいる値が次の文字に更新されてしまいます。
read()関数を一度実行すると、開いたファイルから受け取ったデータを1バイト分だけ返します。そして、もう一度実行すると今度は、すでに読み込んだ文字の次の文字を読み込んで値を返します。
Arduinoなどでよく使うSerial.read()なんかも同じ動きをしていて、loop()内でそれを繰り返すから、シリアルモニタで文字が続いて表示されるのですね。僕はSDカードファイルの読み込みが初めてだったこともあり、今までいい加減に扱っていたread()関数がどのように動いているかを知るいい機会になりました。
そして、カンマが次の区切りになった時に、数値の計算と配列への格納を行いました。こうすることで、セル内の値を数値として扱えるようになります。
if(connma_count%2==1&&connma_count>3)
{
value = ctoi(value[0])*100+ctoi(value[1])*10+ctoi(value[2]) ;
}
ここで使用したctoi()は、char型の数字をint型に変換するために指定した変数です。
int ctoi(char c) {
switch (c) {
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
default: return 0;
}
}