ESP32とMicro SDカード

概要

今回は、ESP32で何か作るときはとりあえず一緒にMicro SDスロットも載せましょうという話です。

SSIDをどう伝えるのか問題

ESP32をWi-Fiに接続させたいとき、SSIDとパスワードをどうやってESP32に伝えるのかというのがしばしば問題になります。

ソースコード中に書いてしまうのは、運用上さまざまな問題を引き起こすでしょう。

SDカードにWiFIのSSIDとパスワードを書く

そこで僕はいつも、SDカードにWiFiのSSIDとパスワードが書かれたファイルを保存しておき、ESP32から読み取るようにしています。

これならば、PCさえあれば、SSIDとパスワードをESP32に伝えることができます。

SDカードがたくさん必要?

各ESP32に対してSDカードを用意するのはけっこう高価です。しかし、ESP32は内部にファイルシステムを持っているので、SDカードから読んだファイルをそこにコピーしてしまえば、2回目からはSDカードなしでWiFiに接続することができます。

つまり、SDカードが1枚あれば、使いまわしてすべてのESP32のWiFi設定をすることができるのです。

実際にやってみた

SDからファイルを読み取り、WiFiに接続するプログラムをArduinoで書いてみました。
(今回は内部のファイルシステムに保存するところまではやっていません)

設定ファイルのフォーマット

SSIDとパスワードは以下のようなフォーマットで保存しました。

  • SSIDとPasswordはスペースで区切って記述
  • #から行末まではコメントとみなす
  • SSIDとパスワードを複数個書けば、上から順に接続を試みる(WiFiMulti)

wifi.txt

# This is treated as a comment.
# Please enter SSID and password separated by space

# Home WiFi
your_SSID your_password

# Office WiFi
SSID1 password1 # 1st
SSID2 password2 # 2nd
SSID3 password3 # 3rd

サンプルコード

Arduino Core for ESP32 で動くコードです。バージョンはなるべく新しいものがいいと思います。

SSIDとパスワードが書かれたwifi.txtはSDカードのルートディレクトリに置いておいてください。

/*
   File:    WiFiConfigWithSD.ino
   Author:  KERI
   Date:    2017.07.29
*/

#include <WiFi.h>
#include <WiFiMulti.h>
#include <SD_MMC.h>
#include <esp32-hal-log.h>

WiFiMulti wifiMulti;

bool sdInit() {
  pinMode(2, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(12, INPUT_PULLUP); pinMode(13, INPUT_PULLUP);
  if (!SD_MMC.begin()) {
    log_e("SD_MMC.begin() Failed :(");
    return false;
  }
  return true;
}

bool wifiConfigWithSD(String path) {
  File file = SD_MMC.open(path, "r");
  if (!file) {
    log_e("Can't Open File %s", path);
    return false;
  }
  while (file.available()) {
    String line = file.readStringUntil('\n');
    line = line.substring(0, line.indexOf('#'));
    String ssid = line.substring(0, line.indexOf(' ')); ssid.trim();
    String password = line.substring(line.indexOf(' ')); password.trim();
    if (ssid.length() != 0) {
      log_d("WiFiMulti += SSID: %s", ssid.c_str());
      wifiMulti.addAP(ssid.c_str(), password.c_str());
    }
  }
  WiFi.mode(WIFI_STA);
  log_i("WiFiMulti Connecting...");
  if (wifiMulti.run() != WL_CONNECTED) {
    log_e("WiFi Connection Failed :(");
    return false;
  }
  log_i("WiFi Connected :)");
  log_i("SSID: %s\tLocal IP: %s", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
  return true;
}

void setup() {
  log_i("Hello, I'm ESP32 :D");
  sdInit();
  wifiConfigWithSD("/wifi.txt");
}

void loop() {
}

まとめ

この方法を使えば、ソースコードを公開リポジトリなどで管理する場合でもいちいちSSIDとパスワードの流出を気にしなくていいので、その点においても安全です。

ESP32でWiFiに接続する際にはぜひ試してみてください!