見出し画像

ESP32でTWSNMPのセンサー開発6日目:Wifiの設定をシリアルポート行う仕組みをテストしています

今朝は3時過ぎに自力で起きました。助手の猫さんも後から登場しました。ご飯ではなかったようです。2回ぐらいあまえにきていました。

Bluetoothのセンサーに時間が経過したデバイスの情報を自動で削除する仕組みを作りました。何となく納得できないのですが、

void cleanup() {
  auto it = twBlueDeviceMap.begin();
  time_t th = ntp.getEpochTime() - 3600;
  while (it != twBlueDeviceMap.end()){
    TWBlueDevice *p = it->second.get();
    if (p->LastTime < th ) {
      Serial.printf("delete %s\n",p->get().c_str());
      delete p;
      twBlueDeviceMap.erase(it++);
    } else {
      ++it;
    }
  }
}

のようにdeleteとstd::mapのerase関数で削除しようとするとパニックが発生します。eraseだけにすれば、うまく動いています。

次に、ESP32の新しいボードを接続してシリアルポートから設定を入力してFLASHメモリに保存するという仕組みのテストを始めました。
新しいボードは

です。1台だけ売りで安いので買いましたが、失敗だったかもしれません。
ボードに青色のLEDがついていないのです。
Lチカのテストプログラム

が動かないので、Amazonの画像にある回路図をよく見るとLEDはないです。説明にもLEDはありませんでした。
ここで、先代の助手の猫が一言
「同じように見えるボードでも安いものには、理由がある!」
と言っています。

最初に繋いだ時に、認識しませんでしたが、それは、

でした。
先代の助手の猫がさらに一言
「同じように見えるケーブルでも通信できないものがある!」
と言っています。

とりあえず、新しいボードの件は解決したので、本題のプログラムを作ってみました。

#include <Preferences.h>

Preferences preferences;

String getInput(const char* msg) {
  String in = "";
  while (in == "") {
    Serial.println(msg);
    while (Serial.available() < 1);
    in = Serial.readStringUntil('\n');
    Serial.println(in);
  }
  return in;
}

void setup() {
  Serial.begin(115200);
  Serial.println("start");
  preferences.begin("twESP32Config", true);
  bool needConfig = preferences.getBool("config", true);
  if (needConfig) {
    preferences.end();
    preferences.begin("twESP32Config", false);
    String in = getInput("enter ssid:");
    preferences.putString("ssid", in);
    in = getInput("enter password");
    preferences.putString("password", in);
    preferences.putBool("config", false);
  }
  String ssid = preferences.getString("ssid", "");
  String password = preferences.getString("password", "");
  Serial.printf("Config ssid=%s,password=%s\n", ssid, password);
  preferences.end();
}

void loop() {
  if (Serial.available() > 5) {
    String in = Serial.readStringUntil('\n');
    Serial.print("I received: ");
    Serial.println(in);
    if (in == "config") {
      preferences.begin("twESP32Config", false);
      preferences.putBool("config", true);
      preferences.end();
      delay(1000);
      ESP.restart();
    }
  }
}

シリアルポートからの文字の入力は、

 で出来ました。
設定を(たぶん)FLASHに保存する仕組みは、

を使いました。
こんな動きをします。

  • 初期状態か設定モードか判断

  • 設定モードならSSIDとパスワードを入力する処理

  • 動作中にconfigという文字が入力されたら設定モードにして再起動

このテストは快調でした。
一通りプログラムの部品は揃ったので明日からは全部まとめて、
完成版を作ろうと思います。

ただ、Stringとstd::stringの混在は、気持ち悪いです。

と書いている人もいます。
GO言語の偉大さを感じています。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。