[作業ログ]ESP8266でSDカードを読んでみる


・目的
wifiでAPに接続する際、コードに接続情報を書きたくないので、SDカードから読み込ませる事にする。
ESP8266は3.3Vなので、SDのDIP化カードを使うとき、レベル変換しなくてよいので、ハードに疎い人間にとってはとても便利。


・準備
1.SDカード
とりあえず、読み込ませるSDカードのrootディレクトリ直下に「HOGE.TXT」というテキストファイルをつくって適当な文字列を何行か記述した。
※たぶん、ファイル名が長かったり、日本語がはいってたりすると、FAT16で読んだ時みたく、ニョロになるので全角文字列のない短い名前の大文字のファイル名とした。
※ファイルの中身は、シリアルで出すので、とりあえずは、全角文字を混入しないものとした。
※念のため、持ってるSDカードで一番容量が少ないmicroSDの4Gを使用した。
(多分、3DSについてたやつ。。。)

ディレクトリ。
![sd_dir.png](https://qiita-image-store.s3.amazonaws.com/0/38889/98df5791-a06a-4263-0fdb-7385ffeb51f4.png "sd_dir.png")


中身。
![hoge_txt.png](https://qiita-image-store.s3.amazonaws.com/0/38889/f8abfc29-0122-9726-f134-2546663cf162.png "hoge_txt.png")




2.Aruduino側ソース

SDカードの接続は、SPIを使用するので、SPIのライブラリをinclude。
また、SDのライブラリがあるので、SDのライブラリもinclude。
初期化処理で「HOGE.txt」を読み込んで行単位でコンソールに出力する。
その後のメインループでは、何もしない。


```
#include <ESP8266WiFi.h>
//#include <WiFiUDP.h>

// SPI接続でSDカードと接続
#include <SPI.h>
#include <SD.h>


// SDカードのhoge.txtを読み込む
static boolean ReadHogeOnSD() {

  File hogeFile;
  String line;
  char c;

  // ESP8266は、GPIO15
  if (!SD.begin(15)) {
    Serial.println("SD Card initialization failed!");
    return false;
  }
  Serial.println("SD Card initialization successed...");
  
  // ファイルopen
  hogeFile = SD.open("/HOGE.TXT", FILE_READ);
  if (hogeFile) {
    // open成功
    
    // 行文字列初期化
    line = "";
    while (hogeFile.available()) {

      // 今時言語みたいに１行読み込みする方法がわからなかったので、
      // とりあえず、昔ながらの１文字づつ読み込み。。。
      c = hogeFile.read();
      // 改行の場合
      if (c == '\n' || c == '\r') {
        // 行文字列の長さが１以上の場合
        if (line.length() > 0) {
          Serial.println(line);
        }
        // 改行文字が来たので行文字列をクリア
        line = "";
      } else {
        // 改行文字でなければ行文字列に読み込んだ1文字を追加
        line = line + String(c);       
      }
    }
    // ファイルclose
    hogeFile.close();
  } else {
    Serial.println("error opening hoge.txt...");
    return false;
  }

  return true;
}


void setup() {
  // シリアル初期化
  Serial.begin(9800);

  // ファイル読み込み
  ReadHogeOnSD();

}

void loop() {
  // とりあえず、何もしない
  delay(10000);
}

```

3.配線
[1]準備した部品
マイクロSD DIP化キット
https://akizukidenshi.com/catalog/g/gK-05488/
秋月で購入。
レベル変換はついていない。
![sd_pin_layout.png](https://qiita-image-store.s3.amazonaws.com/0/38889/175c35a9-7301-d94a-5c08-4974170cb90f.png "sd_pin_layout.png")


[2]配線
こんな感じで接続。
SD  ESP8266
1   未接続
2   D8(GPIO15:HCS)
3   D7(GPIO13:HMOSI)
4   3.3V
5   D5(GPIO14:HSCLK)
6   GND
7   D6(GPIO12:HMISO)
8   未接続
9   未接続 
10  未接続

![cap_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/1846b216-a677-78dd-c994-a72f791c0a7c.png "cap_1.png")


・実行
配線できたので、ビルドして実行してみた。
![cap_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9ba0301f-4649-a607-de02-822b01ef571f.png "cap_2.png")

繋がらないorz
ここで、だいぶ悩む。。。

![cap_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/8df18e69-8015-4413-b14c-d4d797e5b4b1.png "cap_3.png")

ハンダ付けしてかったからだった。
orz
素人なので、ピンさせば使えるものと。。。
ハンダ付け敷居が高い。。。


で、再び、ハンダ付けしたSDスロットをブレッドボードに挿し直し、実行してみる。
![cap_4.png](https://qiita-image-store.s3.amazonaws.com/0/38889/37ad0f24-c6ae-364f-8c85-6d5645764d93.png "cap_4.png")

読めました。
とりあえず、読めたので、ここまで。
読めるからには書けるハズ。。。
どこまでの容量のSDが読み書きできるかわからないが、とりあえず、4GのSDは読めるので、ログをダラダラかかしたりするのはいいかもしれない。
また、接続パラメータだけをしょっちゅう変えるなら、
後述TODOのSPIFFSよりもSD内に持たせたほーが良い気がする。



・TODO
1.Wifiでアナログ値飛ばすプログラムにSDカードからパラメータ（SSID、パスワード、接続サーバー、ポート等）を読み込む処理を、追加する。

2.SDカードを接続しなくてもESP8266自体のFlashにファイルシステムを作れて、かきこめる模様（コメントで教えてもらいました。）
->SPIFFSを試してみる。
->クライアントではなく、簡易なHTTPサーバーを作って、静的HTMLを持って、センサー（可変抵抗だけど。。。）の値をスマフォのかえすよーなのを作ってみたい。。。（可能なのかどーかはまだ調べてない）

3.どこまでの容量のSDカードを認識出来るか調べる。また、１階層にどれだけファイルを置いてもよいか（FATの限界はさておき）試してみる。。。