【M5】SDカード CSVデータ書き込み・読出し

M5Stack・Arduino

SDカードにCSVデータを書き込み後、読みだして画面に表示する

構成

プロジェクト名:M5-SD_CSV_ReadWrite

デバイス:M5STACK

プログラム

//********************************************************
// Project :
// Device  : M5Stack-Core-ESP32
// Tool    : "ツール"→"pertition scheme"→"no OTA"
// Created :2023.02.02
// Update  :2024.03.14
// Display :320 x 240ピクセル
// 参考サイト
//********************************************************
//========================================================
//ライブラリを追加
//========================================================
#include <M5Stack.h>
//========================================================
//変数
//========================================================
//--------------------------------------------------------
// 保存するファイル名
//--------------------------------------------------------
const char* fname = "/btnevent_log.csv";
//--------------------------------------------------------
//ファイル
//--------------------------------------------------------
File file;
//========================================================
// SDカードへの書き込み処理(ファイル追加モード)
// SD.beginはM5.begin内で処理されているので不要
//========================================================
void writeData(char *paramStr) {
  file = SD.open(fname, FILE_APPEND);
  file.println( "1,2");
  file.close();
}
//========================================================
//初期化処理
//========================================================
void setup() {
  M5.begin();  //Init M5Core.  
  //M5stack不要
  if (!SD.begin()) // SDカードと通信できるか確認
  {
    M5.Lcd.println("no sdcard"); //通信できなければエラーを表示
    while (1)
      ;
  }
  M5.Lcd.println("exist sdcard"); //通信できなければエラーを表示
  //-----------------------------------------------------
  // ファイルオープン
  //------------------------------------------------------
  File fp = SD.open("/btnevent_log.csv", FILE_WRITE); //テスト用のファイルを新規作成する
  fp.println("characters,figures,booleans");  //ヘッダーを入力
  fp.println("abcdef,12345,1");               //値を','で区切って入力
  fp.println("ghijkl,67890,0");
  fp.println("mnopqr,12345,1");
  fp.close(); //ファイルを閉じる
  //------------------------------------------------------
  //
  //------------------------------------------------------
  char characters[100][10]; //要素記憶用の配列を作成
  int figures[100];
  bool booleans[100];
  int row;
  File f = SD.open("/btnevent_log.csv", FILE_READ);
  String line;          //行を一時的に記憶する変数
  int row_inheader = 0; //ヘッダーも含めた行数を記憶する変数
  while (f.available()) //データが有ればループ
  {
    char ch = f.read(); //データを1byteずつ読み取り
    line += String(ch); // 1byteずつ繋げていく
    if (ch == '\n')     //'\n'が読み込まれた所で一旦読み取りをやめる
    {
      M5.Lcd.print(line); //行全体を画面に表示
      line.trim();        //行に含まれる不要な空白を取り除く

      int column = 0;    //行に含まれる要素番号カウントする変数
      int num_end = 0;   //要素の終わりの列番号を記憶する変数
      int num_start = 0; //要素の始まりの列番号を記憶する変数

      if (0 < row_inheader) //ヘッダーを読み込まないように除外する
      {
        while (num_end != -1) //範囲内に','がなくなるまで繰り返し
        {
          num_end = line.indexOf(',', num_start); // num_strから','がないか確認。あれば列番号をnum_endに記憶
          // M5.Lcd.print('[' + String(num_end) + ']');//正しく認識できているか確認用
          String part = line.substring(num_start, num_end); //','で区切られた要素を行から切り出す
          // M5.Lcd.print('(' + part + ')');//正しく認識できているか確認用
          if (column == 0) //行の最初の要素
          {
            part.toCharArray(characters[row_inheader - 1], num_end + 1 - num_start); //配列の"ヘッダーを除いた行数"番目にデータをchar型に変換して代入
          }
          else if (column == 1) //行の2番目の要素
          {
            figures[row_inheader - 1] = part.toInt(); //配列の"ヘッダーを除いた行数"番目にデータをint型に変換して代入
          }
          else if (column == 2) //行の3番目の要素
          {
            booleans[row_inheader - 1] = boolean(part.toInt()); //配列の"ヘッダーを除いた行数"番目にデータをbool型に変換して代入
          }
          num_start = num_end + 1; //','分で1を足して、次の要素を区切る','を探し始めるスタート地点を代入
          column++;                //要素数に1を加算
        }
      }
      line = "\0";    //変数を初期化
      row_inheader++; //行数に1を加算
    }
    row = row_inheader - 1; //ヘッダーを除いた行数をrowに代入
  }
  f.close();                    //ファイルを閉じる
  M5.Lcd.print('\n');           //改行
  for (int i = 0; i < row; i++) //整理したデータを'/'で区切って表示
  {
    M5.Lcd.println(String(characters[i]) + '/' + String(figures[i]) + '/' + String(booleans[i]));
  }


}

void loop() {

}

コメント