09.Wio TerminalのSDを読み書き


09.Wio TerminalのSDを読み書き

Wio TerminalにあるmicroSDの読み書きをします。
スケッチは、
Seeed Wiki > Platform > Wio Terminal > File System > Read and Write の
https://wiki.seeedstudio.com/Wio-Terminal-FS-ReadWrite/
に出ているReading/Writing from the SD CardのComplete Codeを少し変更しました。
変更点
・シリアルモニタ表示を変更し、日本語の画面表示にしました。
・デモスケッチの後に、PCで作成したファイルを読込みます。
ここの場所のごみ収集は曜日ごとに収集品が決まっています。5wayボタンを押込むごとに月曜日からスタートし、各曜日の収集品を表示します。
月曜日→火→水→木→金→土→日→月→・・・
これには、SDのGomiホルダの中に、"GomiMon.txt","GomiTue.txt"・・・のファイルを入れておきます。
・読込むファイルを切替える時に、ボタンクリック音を付けました。

Seeed_Arduino_FSをインストール

SDカードの基本機能と、SPI通信で読書きを可能にするライブラリです。
https://github.com/Seeed-Studio/Seeed_Arduino_FS/tree/master
を開き、
コード > ZIPをダウンロード > "Seeed_Arduino_FS-master.zip"をディスクトップにコピー
Arduino-IDE > スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール... > 先程のzipファイルを指定 > 開く

Seeed_Arduino_SFUDのインストール

フラッシュデバイスの読み書きを可能にするライブラリです。このスケッチでは使用しません。
https://github.com/Seeed-Studio/Seeed_Arduino_SFUD
も上と同様にインストールします。

使用できるmicroSD

Wio Terminalで使用できるサイズとフォーマット形式です。
・最大16GB

フォーマット
・FAT12 (FAT)
  最大ファイル 32MB
  フロッピーディスクに使用
・FAT16
  最大ファイル 2GB
  MS-DOS~WindowXP時代
  2GBまでのSD
・FAT32
  最大ファイルサイズ4GB
  汎用的 互換性がいい
  4-32GBのSDHC
・exFAT
  最大ファイルサイズ約100万TB
  32GB-2TBのSDXC,2-128TBのSDUC

ここでは手持ちにあった2GBを使用しました。ファイルシステムはFATでしたので、
・ファイルシステム = FAT32
・アロケーションユニットサイズ(保存場所の最小単位) = 4kB
にしてフォーマットしました。Wio Terminalには、microSDの裏面を上にして挿入します。

openファイル関数

open("ファイル名",モード)
モードは、
・書込む FILE_WRITE
・読込む FILE_READ
・追加  FILE_APPEND

スケッチ

・スケッチ内でのフォルダの区切りは円記号の"\"ではなく、除算の"/"です。
・SD.beginでは、通信の初期化をしますがファイルは消えません。
・このスケッチの他にSDのGomiホルダの中に、GomiMon.txt, GomiTue.txt, GomiWed.txt, GomiThu.txt, GomiSat.txt の画面表示用のtxtファイルが必要です。

// SDの初期設定・書き込み・読み込み SD.ino
// 表示ファイルの準備必要
#include <SPI.h>          // SDのためにSPI通信を使用
#include <Seeed_FS.h>     // SDを使用
#include <SD/Seeed_SD.h>  // SD追加分
#define LGFX_AUTODETECT   // LovyanGFX対応機種を自動認識
#include <LovyanGFX.hpp>  // LovyanGFXを使用
static LGFX lcd;          // LGFXのインスタンスを作成
File myFile;              // ファイルクラスを初期化し、myFileという名前を付ける
int i = 0;                // 表示画面番号(0-6)
String fname[] = {"Mon", "Tue", "Wed", "Thu", "Mon", "Sat", "Wed"};//ファイル名一部

void setGamen() {                         // 画面初期設定関数
  lcd.init();                             // LCD初期化
  lcd.setBrightness(64);                  // バックライト輝度(暗0-255明)
  lcd.setRotation(1);                     // LCD表示向き
  lcd.setFont(&lgfxJapanGothic_20);       // ゴシック固定長 縦ドット(16,20,24,28,32)
  //lcd.setTextScroll(true);              // 画面下端に到達後スクロール
  //lcd.setScrollRect(0, 0, lcd.width(), lcd.height());  //スクロール範囲(X,Y,W,H)
  lcd.setTextSize(1.0);                   // 文字サイズ(幅倍数)
  lcd.setTextColor(TFT_GREEN, TFT_BLACK); // (文字色,背景色)
  lcd.setCursor(0, 0);                    // 画面左上から開始
}

void setButton() {                     // ボタン設定関数
  pinMode(WIO_KEY_A, INPUT_PULLUP);    //   内側ボタンをPull up Digital入力に
  pinMode(WIO_KEY_B, INPUT_PULLUP);    //   中間ボタンをPull up Digital入力に
  pinMode(WIO_KEY_C, INPUT_PULLUP);    //   外側ボタンをPull up Digital入力に
  pinMode(WIO_5S_UP, INPUT_PULLUP);    // 5wey上ボタンをPull up Digital入力に
  pinMode(WIO_5S_DOWN, INPUT_PULLUP);  // 5wey下ボタンをPull up Digital入力に
  pinMode(WIO_5S_LEFT, INPUT_PULLUP);  // 5wey左ボタンをPull up Digital入力に
  pinMode(WIO_5S_RIGHT, INPUT_PULLUP); // 5wey右ボタンをPull up Digital入力に
  pinMode(WIO_5S_PRESS, INPUT_PULLUP); // 5wey押ボタンをPull up Digital入力に
}

void setBuzzer() {               // ブザー設定関数
  pinMode(WIO_BUZZER, OUTPUT);   // ブザーpinを出力に
}

void click1() {                   // クリック音関数
  analogWrite(WIO_BUZZER, 200);  // 矩形波出力(pin番号,DT(0-255))
  delay(100);                    // 0.1秒待つ
  analogWrite(WIO_BUZZER, 0);    // 出力0V
}

void setup() {
  setGamen();                                 // 表示画面の初期設定関数へ
  setButton();                                // ボタン設定関数へ
  setBuzzer();                                // ブサ―設定関数へ
  lcd.print("SD通信初期化");                    // 表示 ファイルは消えない
  if (!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) { // 通信初期化できなかったら
    lcd.println(" 失敗");                     // 表示
    while (1);                                // 永久ループ
  }
  lcd.println(" 終了");                       // 表示

  lcd.print("test.txtへ書込み");               // 表示
  myFile = SD.open("test.txt", FILE_WRITE);  // SDのファイルを開く("ファイル名",書込み)
  if (myFile) {                              // ファイルが開けたら
    myFile.println("テストテストtest〇▲▼ 1, 2, 3."); // SDに書込む(半角カナもOK)
    myFile.close();                          // ファイルを閉じる。
    lcd.println(" 終了");                    // 表示
  } else {                                   // ファイルが開けなかったら
    lcd.println(" エラー open時");            // 表示
  }                                          // 一度に開くことができるファイルは1つまで

  lcd.print("test.txt読取り:");               // 表示
  myFile = SD.open("test.txt", FILE_READ);   // SDのファイルを開く("ファイル名",読込み)
  if (myFile) {                              // ファイルが開けたら
    while (myFile.available()) {             // ファイルから読取り可能なバイト数
      lcd.write(myFile.read());              // ファイルから1バイト読取り、シリアルポートに1バイト出力
    }
    myFile.close();                          // ファイルを閉じる
    lcd.println("\n5wayボタンを押してください"); // 表示
  } else {                                   // ファイルが開けなかったら
    lcd.println(" エラー open時");            // 表示
  }
}
void loop() {
  if (digitalRead(WIO_5S_PRESS) == LOW) {  // 5weyボタンを押し込むと
    click1();                     // クリック音関数へ
    lcd.fillScreen(TFT_BLACK);    // 画面クリア
    lcd.setCursor(0, 0);          // 画面左上から開始
    myFile = SD.open("Gomi/Gomi" + fname[i] + ".txt", FILE_READ); // SDのファイルを開く("ファイル名",読込み)
    while (myFile.available()) {  // ファイルから読取り可能なバイト数
      lcd.write(myFile.read());   // ファイルから1バイト読取り、シリアルポートに1バイト出力
    }
    myFile.close();               // ファイルを閉じる
    i++; if (i > 6) i = 0;        // iに1追加し、i=0-6にする
  }
  delay(500);                     // 0.5秒待つ
}
* フラッシュメモリの57%を使用。