04.M5PaperS3でSDテスト
04.M5PaperS3でSDテスト
説明
ArduinoとSDストレージのガイド 2024/04/17https://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で計算)