M5StackでSDカードにCSVデータを作成する

 調べてみたのですが、情報がヒットしなかったのでメモとして記事にしておきます。あまり難しくはありませんが、SD.begin()で少し悩みました。

 もくじ(Index)

用意するもの

 ボタンのイベントを記録するだけなのでM5Stack本体があれば大丈夫です。

サンプルスケッチ

 まずはいきなり、サンプルスケッチからです。WiFiに接続しNTPサーバから日付と時刻を取得して、M5Stackのボタンが押下されたときにCSVファイル出力を行うサンプルです。

 ※ssidとpassは環境に合わせて書き換えてください。

#include <M5Stack.h>
#include <WiFi.h>
#include <time.h>

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "XXXXXXXXXX";
char pass[] = "XXXXXXXXXXXXXXXXXXXX";

// Time
char ntpServer[] = "ntp.jst.mfeed.ad.jp";
const long gmtOffset_sec = 9 * 3600;
const int  daylightOffset_sec = 0;
struct tm timeinfo;
String dateStr;
String timeStr;

File file;

// 保存するファイル名
const char* fname = "/btnevent_log.csv";

// ボタン押下時に記録するイベント名
// CSVファイルは日本語が使えます。
char *eventName[] = { "ボタンA", "ボタンB", "ボタンC" };

void getTimeFromNTP(){
  // NTPサーバと時刻を同期
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  while (!getLocalTime(&timeinfo)) {
    delay(1000);
  }
}

void getTime(){
  // 時刻の取得と表示
  getLocalTime(&timeinfo);
  dateStr = (String)(timeinfo.tm_year + 1900)
          + "/" + (String)(timeinfo.tm_mon + 1)
          + "/" + (String)timeinfo.tm_mday;
  timeStr = (String)timeinfo.tm_hour
          + ":" + (String)timeinfo.tm_min
          + ":" + (String)timeinfo.tm_sec;

  M5.Lcd.setTextColor(WHITE,BLACK);
  M5.Lcd.setCursor(0, 50, 1);
  M5.Lcd.println(dateStr + "   ");
  M5.Lcd.println(timeStr + "   ");
}


void writeData(char *paramStr) {
  // SDカードへの書き込み処理(ファイル追加モード)
  // SD.beginはM5.begin内で処理されているので不要
  file = SD.open(fname, FILE_APPEND);
  file.println(dateStr + "," + timeStr + "," + paramStr);
  file.close();
}

void setup()
{
  M5.begin();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(WHITE,BLACK);
  M5.Lcd.println("CSV Writer");

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("\nWiFi connected.");

  // timeSet
  getTimeFromNTP();

}

void loop()
{
  M5.update();
  // 時刻表示
  getTime();

  // カーソル位置の指定
  M5.Lcd.setCursor(0, 100, 1);

  // ボタンイベント処理
  if (M5.BtnA.wasPressed()) {
    M5.Lcd.print("Button A Pressed");
    writeData(eventName[0]);
  }
  if (M5.BtnB.wasPressed()) {
    M5.Lcd.print("Button B Pressed");
    writeData(eventName[1]);
  }
  if (M5.BtnC.wasPressed()) {
    M5.Lcd.print("Button C Pressed");
    writeData(eventName[2]);
  }
}

サンプルスケッチの補足

SD.beginは不要

 ESP32だとSD.begin()が必要なのですが、M5.begin()内で行われているため不要です。

書き込んでいる処理は「writeData()」のみ

 WiFiへの接続や日付の加工で色々していますが、SDカードへ書き込んでいる部分は下記のwriteDataのみです。

 SD.open(ファイル名, モード)でモードは「FILE_WRITE」(上書き)、「FILE_APPEND」(追加)が指定できます。

void writeData(char *paramStr) {
  // SDカードへの書き込み処理(ファイル追加モード)
  // SD.beginはM5.begin内で処理されているので不要
  file = SD.open(fname, FILE_APPEND);
  file.println(dateStr + "," + timeStr + "," + paramStr);
  file.close();
}

おわりに

 センサー等のデータをかき出す場合はバッファを使う必要もあるかもしれませんが、初心者向けにSDカードへ書き込むという手順を紹介しました。様々なデータロガーとしてもM5StackはLCDと同時に確認できるので便利です。ぜひ使ってみましょう。

コメントを残す

メールアドレスが公開されることはありません。