1.SDカード装置の設置と配線
マイクロSDカードスロットDIP化キットは、あらかじめ付属のヘッダーピンを半田付けしてブレッドボードに設置できるようにしてください。
準備ができたらESP32開発ボードをブレッドボードから外します。ドライバーなどを使って、壊れないように注意してください。そしてマイクロSDカード装置を写真の位置に設置して、ESP32開発ボードを元の位置に差し込みます。
(1)電源とGNDの配線
写真左を参考に、以下のようにジャンパーワイヤーで配線します。
・ESP386:GNDをブレッドボードの(-)へ。
・ESP386:3.3Vをブレッドボードの(+)へ。
・microSD:VDDをブレッドボードの(+)へ。
・microSD:VSSをブレッドボードの(-)へ。
![](photo/SD1.jpg)
![](photo/SD2.jpg)
(2)信号線の配線
写真右上を参考にしながら、下表の「microSDカード装置の端子と接続先」に沿ってジャンパーコードで配線します。
![](photo/sd_tbl.png)
これでMCUボード内の配線は完了です。すでにRTCとはI2Cで接続済みですが、もう一度次のようになっていることを確認してください。
・データ線 写真の① RCT:SDA ---(黄色 )--> ESP32:GPIO21
・クロック線 写真の② RTC:SCL ---(オレンジ)--> ESP32:GPIO22
・グランド 写真の③ RTC:GND ---(緑色 )--> ESP32:GND
![](photo/SD3.jpg)
![](photo/SD4.jpg)
2.土壌センサーのアナログ入力
下図は「土壌湿度センサーYL-38の端子と接続先」です。ESP8266では [VCC]を計測ボードの5Vラインに接続していましたが、これを3.3Vラインに変更します。
また、ESP8266のアナログ入力用TOUTピンの最大電圧は1.0Vであるため、CPUボード側に分圧回路を設けていましたが、ESP32はアナログ入力の電圧範囲が 0~3.3Vなので直接入力が可能になります。A0端子をいったん計測ボードにつないでから(中継してから)、ESP32のSVP(GPIO36)ピンに接続しています。
![](photo/sd_tbl2.png)
すべての接続が終わった状態です。
![](photo/SD5.jpg)
3.SDカード装置等のハンドリング
(1)SDカード装置のハンドリング
このテーマの冒頭でも述べたとおり、現時点ではファイルのタイムスタンプを扱うライブラリー(ESP8266でのSdFatに該当)が未完です。そこで、これに関連したヘッダーファイルのインクルードや、dateTimeコールバック関数は削除することになります。
また、SDカード装置のポートやファイル名の定義、SDカード装置の初期設定、ファイル出力モードなども変更が必要になります。以下にこれらのポイントを整理します。
①インクルードファイルの変更
#include
SdFat SD;
↓
#include
②SDカード装置番号の変更
#define SDCARD_DRIVE 16 // SD card chip select number
↓
#define SDCARD_DRIVE 5 // SD card chip select number (CS=GPIO5)
③dateTimeコールバック関数定義の削除
// Set dateTime callback function to provide timestamp.
SdFile::dateTimeCallback(dateTime);
④dateTimeコールバック関数本体の削除
/*
* Callback function to provide file timestamp.
*/
void dateTime(uint16_t* date, uint16_t* time)
{
:
:
}
⑤ファイル名定義の変更
#define DATA_FILE "datafile.txt"
↓
#define DATA_FILE "/datafile32.txt"
(補足)
ファイル位置を明示しなければオープン処理に失敗します。
⑥SDカード装置初期設定の変更(必要に応じて)
// Prepare SD card unit.
if (SD.begin(SDCARD_DRIVE))
↓
// Prepare SD card unit.
if (SD.begin(SDCARD_DRIVE, SPI, 24000000, "/sd"))
(補足)
従来どおりで問題ないが、必要なら SPIクラスや動作周波数、マウント位置を指定できます。
このメソッドはSD.h内で次のようにプロトタイプ宣言されています。
bool begin(uint8_t ssPin, SPIClass &spi=SPI,
uint32_t frequency=4000000, const char * mountpoint="/sd");
⑦ファイル出力モードの変更
File df = SD.open(fname, FILE_WRITE);
↓
File df = SD.open(fname, FILE_APPEND);
(補足)
従来のSDの open()では、FILE_WRITEを指定するとファイルの終端に追加書き出ししていま
したが、ESP32では先頭から出力します。つまり、いつも1レコードしか書き込まれません。
この問題は、新たな入出力モードFILE_APPENDを指定することで解決できます。
(2)土壌湿度計のハンドリング
計測値の変換ロジックです。アナログ入力値がESP8266とは変わるため変更が必要です。アナログポートで取得した土壌湿度値を実測しながら、計測結果を0~100に変換するなど、定数部を環境に応じて調整してください。
int measureSoilMoisture(int pin_no)
{
int val = 1023 - analogRead(pin_no);
return (int)map(val, 56, 545, 0, 100);
}
↓
int measureSoilMoisture(int pin_no)
{
int val = analogRead(pin_no);
int res = (int)map(val, 2650, 4100, 100, 0);
if (res < 0)
res = 0;
else if (res > 100)
res =100;
return res;
}
4.既存コードの変更
〔変更点〕
※以下のコードは変更部分だけをピックアップしたものです。
3~4行: SdFatライブラリー未完のため削除。
5行目: 替えてSDライブラリーを使用する。
11行目: SDカード装置のChip select pinをGPIO5に変更。
12行目: "(SENSOR_VP/GPIO36)"のコメントを追加。
13行目: "/"を付加。
35行目: Wire.begin()をWire.begin(SDA, SCL)に変更。
46~48行: SdFileのコールバック関数定義を削除
50行目: ファイル出力モードをFILE_WRITE→FILE_APPENDに変更して追加出力を指定。
96~100行: 計測値の変換ロジックを修正。
107~124行: SdFileのコールバック関数本体を削除。
#include <Wire.h> #include <SPI.h> ////#include <SdFat.h> ////SdFat SD; #include <SD.h> // I2C Address #define DS1307_ADDRESS 0x68 // Realtime clock // SD card drive & File name #define SDCARD_DRIVE 5 // SD card chip select number (CS=GPIO5) #define ANALOG_PIN A0 // Analog input pin (SENSOR_VP/GPIO36) #define DATA_FILE "/datafile32.txt" : : /***************************************************************************** * Predetermined Sequence * *****************************************************************************/ void setup() { Serial.begin(115200); // Prepare SD card unit. if (SD.begin(SDCARD_DRIVE)) bSD_Enabled = true; else { bSD_Enabled = false; Serial.println("SD Drive does'nt work!"); return; } Serial.println("\nSD enabled!"); // Prepare I2C protocol. Wire.begin(21,22); //Define(SDA, SCL) // Create file. if (SD.exists(DATA_FILE)) { Serial.print(" File exists: "); Serial.println(DATA_FILE); if (SD.remove(DATA_FILE)) Serial.println(" File removed!"); else Serial.println(" Couldn't remove file!"); } /* // Set dateTime callback function to provide timestamp. SdFile::dateTimeCallback(dateTime); */ // Write data file. File df = SD.open(DATA_FILE, FILE_APPEND); if (df) { for (int i=0; i<8; i++) { df.println(sData[i]); df.close(); delay(500); } } else Serial.println("Failed to create data file"); } void loop() { if (bSD_Enabled && bAtFirst) { bAtFirst = false; File df = SD.open(DATA_FILE, FILE_READ); if (!df) { Serial.println("Couldn't open data file!"); return; } Serial.println("Read file opened!"); char buf[31]; while (readln(&df, buf, 30) > 0) { Serial.print(buf); } df.close(); Serial.println("File cloed!"); } int val = measureSoilMoisture(ANALOG_PIN); Serial.println(val); delay(1000); } /*****************************************************************************/ : : /* * Measure soil moisture * Return: moisture value(0~100) */ int measureSoilMoisture(int pin_no) { int val = analogRead(pin_no); int res = (int)map(val, 2650, 4100, 100, 0); if (res < 0) res = 0; else if (res > 100) res =100; return res; } : : /* * Callback function to provide file timestamp. */ /* void dateTime(uint16_t* date, uint16_t* time) { uint16_t year; uint8_t month, day, hour, minute, second; getDateTime(&dtClock); year = 2000 + ((int)(dtClock.year >> 4)) * 10 + (int)(dtClock.year & 0x0f); month = ((int)(dtClock.month >> 4)) * 10 + (int)(dtClock.month & 0x0f); day = ((int)(dtClock.day >> 4)) * 10 + (int)(dtClock.day & 0x0f); hour = ((int)(dtClock.hour >> 4)) * 10 + (int)(dtClock.hour & 0x0f); minute = ((int)(dtClock.minute >> 4)) * 10 + (int)(dtClock.minute & 0x0f); second = ((int)(dtClock.sec >> 4)) * 10 + (int)(dtClock.sec & 0x0f); *date = FAT_DATE(year, month, day); *time = FAT_TIME(hour, minute, second); } */
5.スケッチの実行
変更後のスケッチをesp32SD.inoの名称で保存して、[ツール]タブからシリアルモニタを開きます。
ESP32開発ボードの右ボタン[FLASH]を押したまま左ボタン[RESET]を押下した後、IDEの「マイコンボードに書き込む」アイコンをクリックしてください。コンパイルとマイコンボードへの書き込みが終わると、シリアルモニターに次のように表示されます。「File closed!」に続く数値が土壌湿度です。
![](photo/test3-1.png)
以上!