04.M5PaperS3でSDテスト


04.M5PaperS3でSDテスト

説明

ArduinoとSDストレージのガイド 2024/04/17
https://docs.arduino.cc/learn/programming/sd-guide/
に5つのサンプルがあります。その中で
スケッチ1は
Read and Write (ファイルの読み書き)
スケッチ2は
List Files (ファイル一覧表示)
についてを修正し動作確認しました。

SDカードは、2GB以下のFAT16 or 32GB以下(FAT32)に対応しています。ファイル名は8文字.3文字までです。

スケッチ1

SDのルートにあるtest.txtに "書込みテストtesting 1, 2, 3." を書込み、その後、読み出します。

#include <SD.h>                      // SDを使用
File myFile;                         // Fileのインスタンスを作成
#include <epdiy.h>                   // 電子ペーパードライバー
#include <M5GFX.h>                   // M5Stack用グラフィックライブラリ
M5GFX display;                       // M5GFXのインスタンスを作成
#define SD_SPI_CS_PIN GPIO_NUM_47    // SDのpin
#define SD_SPI_SCK_PIN GPIO_NUM_39   // SDのpin
#define SD_SPI_MOSI_PIN GPIO_NUM_38  // SDのpin
#define SD_SPI_MISO_PIN GPIO_NUM_40  // SDのpin

void SetFont() {                                  // Font等初期化関数
  display.init();                                 // パネルの初期化
  if (display.isEPD()) {                          // e-Paper displayなら
    display.setEpdMode(epd_mode_t::epd_fastest);  // 描画速いが、低品質に設定
  }
  //display.setRotation(0);                     // 縦長に回転
  display.setRotation(1);                       // 横長に回転
  display.fillScreen(TFT_WHITE);                // 全画面白
  display.setFont(&fonts::lgfxJapanGothic_32);  // 固定幅ゴシック体 8,12,16,20,24,28,32,36,40
  display.setTextColor(TFT_BLACK, TFT_WHITE);   // (字,地)
  display.setTextSize(1);                       // 文字サイズの倍数 1-7
  display.setTextWrap(true, true);              // 自動折返し(x,y)
  display.setCursor(0, 0);                      // カーソル位置
}

void setup() {
  SPI.begin(SD_SPI_SCK_PIN, SD_SPI_MISO_PIN,
            SD_SPI_MOSI_PIN, SD_SPI_CS_PIN);
  delay(100);                                // 0.1秒待つ
  SetFont();                                 // Font等初期化関数へ
  display.setAutoDisplay(true);              // 書込後即描画
  display.print("SDライブラリの初期化...");  // 表示
  if (!SD.begin(47)) {                       // SDライブラリとカードを初期化できなければ
    display.println("失敗");                 // 表示
    while (1)                                // 無限ループ
      ;
  }
  display.println("完");                              // 表示
  myFile = SD.open("/test.txt", FILE_WRITE);          // text.txtを書込用として開く
  if (myFile) {                                       // ファイルが開けば
    display.print("/test.txtへ書込み...");            // 表示
    myFile.println("書込みテストtesting 1, 2, 3.");   // SDに書込む
    myFile.close();                                   // ファイルを閉じる
    display.println("完");                            // 表示
  } else {                                            // ファイルが開けなかったら
    display.println("エラー /test.txtを開けません");  // 表示
  }
  myFile = SD.open("/test.txt", FILE_READ);  // 再度開く。一度に開けるファイルは1つ
  if (myFile) {                              // ファイルが開けば
    display.print("/test.txt読込内容:");     // 表示
    while (myFile.available()) {             // 読取れるバイトがあれば
      display.startWrite();                  // バッファを効率的に使用
      display.write(myFile.read());          // 読み取った物を表示 printではだめ
      display.endWrite();                    // バッファを効率的に使用
    }
    myFile.close();                                   // ファイルを閉じる
    display.println("終了");                          // 表示
  } else {                                            // ファイルが開けなかったら
    display.println("エラー /test.txtを開けません");  // 表示
  }
}
void loop() {}
* flash memory(1.3Mbyte)のうち、スケッチが71%使用。RAM(327kbyte)のうち、global変数が6%使用、local変数で306kbyte使用可能。(1000byte=1kbyteで計算)

スケッチ2

SDのファイル一覧を表示します。
・ファイルに上から番号をふりました。
・ホルダ名は()を付けました。
・ホルダの中身は2文字字下げしました。
・ファイルとホルダは字下げを含めて23文字まで表示します。
・ファイルサイズは1000B以上はkB単位で表示します。
・SDの中身は以下の通りです。

|--System Volume Information
| |--WPSettings.dat
| |--IndexerVolumeGuid
|
|--test.txt
|
|--API
| |--TEST100
| |  |--RTC.txt
| |
| |--M5GFX.txt
| |--M5Unifie.txt
|
|--ino
| |--M5GFX_examples_Basic_all
|   |--M5GFX_examples_Basic_all.ino
|
|--SDlib.txt

#include <SD.h>                      // SDを使用
File root;                           // Fileのインスタンスを作成
#include <epdiy.h>                   // 電子ペーパードライバー
#include <M5GFX.h>                   // M5Stack用グラフィックライブラリ
M5GFX display;                       // M5GFXのインスタンスを作成
#define SD_SPI_CS_PIN GPIO_NUM_47    // SDのpin
#define SD_SPI_SCK_PIN GPIO_NUM_39   // SDのpin
#define SD_SPI_MOSI_PIN GPIO_NUM_38  // SDのpin
#define SD_SPI_MISO_PIN GPIO_NUM_40  // SDのpin
String fName, fTab;                  // ファイル名(ホルダ名),空白
uint8_t fCount = 0;                  // ファイル数をカウント表示

void SetFont() {                                  // Font等初期化関数
  display.init();                                 // パネルの初期化
  if (display.isEPD()) {                          // e-Paper displayなら
    display.setEpdMode(epd_mode_t::epd_fastest);  // 描画速いが、低品質に設定
  }
  display.setRotation(0);  // 縦長に回転
  //display.setRotation(1);                     // 横長に回転
  display.fillScreen(TFT_WHITE);                // 全画面白
  display.setFont(&fonts::lgfxJapanGothic_32);  // 固定幅ゴシック体 8,12,16,20,24,28,32,36,40
  display.setTextColor(TFT_BLACK, TFT_WHITE);   // (字,地)
  display.setTextSize(1);                       // 文字サイズの倍数 1-7
  display.setTextWrap(true, true);              // 自動折返し(x,y)
  display.setCursor(0, 0);                      // カーソル位置
}

void setup() {
  SPI.begin(SD_SPI_SCK_PIN, SD_SPI_MISO_PIN,
            SD_SPI_MOSI_PIN, SD_SPI_CS_PIN);
  delay(100);                    // 0.1秒待つ
  SetFont();                     // Font等初期化関数へ
  display.setAutoDisplay(true);  // 書込後即描画
  //Serial.begin(115200);          // シリアル通信を開始し、ポートが開くのを待つ:
  //while (!Serial)                // シリアルモニターが接続するのを待つ。ネイティブUSBポートボードにのみ必要:
  //  ;
  display.print("SDライブラリの初期化...");  // 表示
  if (!SD.begin(47)) {                       // SDライブラリとカードを初期化できなければ
    display.println("失敗");                 // 表示
    while (true)                             // 無限ループ
      ;
  }
  display.printf("完\n\n");    // 表示
  root = SD.open("/");         // ルートのファイルを開く
  printDirectory(root, 0);     // 表示関数へ ルートからTAB数0個で
  display.printf("\n終了\n");  // 表示
}
void loop() {}

void printDirectory(File dir, int numTabs) {  // 表示関数 (開始場所,TAB数)
  while (true) {                              // breakになるまで無限ループ
    File entry = dir.openNextFile();          // ディレクトリ内の次のファイルまたはホルダを取得
    if (!entry) break;                        // 次のファイルまたはフォルダがないなら抜ける
    fTab = "";                                // ファイル前に付ける空白
    for (uint8_t i = 0; i < numTabs; i++) {   // numTabsの数だけ
      fTab = fTab + "--";                     // TABを表示
    }
    fName = entry.name();                                 // ファイル名を取得
    fName = fTab + fName + "                       ";     // 23文字空白追加
    fName = fName.substring(0, 23);                       // 頭から23文字
    if (entry.isDirectory()) {                            // ホルダなら
      display.print("  (");                               // 表示
      display.print(fName);                               // ホルダ名を表示
      display.println(")");                               // 表示
      printDirectory(entry, numTabs + 1);                 // TABを1増加してこの関数へ
    } else {                                              // ファイルなら
      fCount++;                                           // ファイル番号に1加算
      display.printf("%2d ", fCount);                     // ファイル番号を表示
      display.print(fName);                               // ファイル名を表示
      if (entry.size() < 1000) {                          // ファイルサイズが1k未満なら
        display.printf(" %5dB\n", entry.size());          // ファイルサイズ(bytes)を表示
      } else {                                            // 1kB以上なら
        display.printf(" %4dkB\n", entry.size() / 1000);  // ファイルサイズ(kB)を表示
      }
    }
    entry.close();  // ファイルを閉じる
  }
}
* flash memory(1.3Mbyte)のうち、スケッチが71%使用。RAM(327kbyte)のうち、global変数が6%使用、local変数で306kbyte使用可能。(1000byte=1kbyteで計算)