スケッチ改変ポイントなどを説明してみようかと思いました。
間違い、文字化けがあるかもしれません。
素晴らしいライブラリ、サンプルスケッチを公開してくださっている方々に感謝します。
Wi-Fi接続と固定IPアドレス設定のために"WiFiManager"ライブラリの
"Advanced"サンプルスケッチで設定したIPAddress、Gateway、Subnetを
(Gatewey、Subnetは不要かもしれない)EEPROMへ保存している。
SSIDとPASSWORDは初回設定後引数指定せずにWiFi.begin();
としてESP32内部に保存された前回WiFi認証情報を使って接続する。
#define INI_SETUP_PIN 15 //ESP32 DEV Module INPUT_PULLUP
中略
EEPROMへのデータ保存準備
//>>> EEPROM put アドレスを指定する
//なぜかEEPROM_SSID_ADDRESS 0のデータだけ電源OFF-ONで化けるので使っていない
#define EEPROM_SSID_ADDRESS 0 //使っていないが削除して不具合が出ないか心配で残してある
#define EEPROM_PASS_ADDRESS 32 //使っていないが削除して不具合が出ないか心配で残してある
#define EEPROM_IP_ADDRESS 64
#define EEPROM_GATEWAY 96
#define EEPROM_SUBNET 128 // 1アドレスに1byte
String savedSSID;//それぞれの情報が入る変数
String savedPassword;
IPAddress savedIP; //IPAddress型
IPAddress savedGateway;
IPAddress savedSubnet;
//<<< EEPROM PUT
//>>>> EEPROM setup
Serial.println("\nTesting EEPROM Library\n");
if (!EEPROM.begin(512)) { //512byte
Serial.println("Failed to initialise EEPROM");//"EEPROMの初期化に失敗しました"
Serial.println("Restarting...");//再起動せずにLEDを高速点滅して停止
delay(1000);
Serial.println("stop...");
while (1) {
// LEDを高速点滅する
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
}
//ESP.restart();//これで再起動もできますが、再起動で解決できないことが多いかも
} else {
Serial.println("EEPROM Library Test OK ");
} //<<<< EEPROM setup
GPIO15がHIGHの時 EEPROMに保存したWiFi認証&IP情報で接続する。
GPIO15がLOWの時 強制的にconfigPortalを起動して設定&接続する。
if (digitalRead(INI_SETUP_PIN) == HIGH) { //GPIO15(INPUT_PULLUP)HIGHの時はEEPROMからGETした情報でWiFi接続する
//LOWのときはconfigPortalを起動してWiFi認証、接続情報設定する
Serial.println("Previous WiFi authentication and connection with IP address in EEPROM");
//"以前のWiFi認証とEEPROM内のIPアドレスによる接続"
eepromGetData(); // EEPROMから保存済のIPアドレスを各変数へ読み込む(WiFi認証情報は未使用)
IPAddress dns1 = savedGateway;//dns1はGateweyと同じなので代入
WiFi.config(savedIP, savedGateway, savedSubnet, dns1);//ESP 引数順序厳守 NTPサーバ名アクセス時dns1要
WiFi.begin();// ESP32内部に保存された前回WiFi認証情報(SSID、PASSWORD)を使って接続する
//>>> 2024.01.29
Serial.print("Connecting to WiFi");
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++
digitalWrite(LED_BUILTIN, HIGH);
delay(250);
digitalWrite(LED_BUILTIN, LOW);
delay(250);
//delay(500);
Serial.print(i); //Serial.print(".");
}/* while(WiFi.status() != WL_CONNECTED &&...*/
//Serial.println(i);
if (i >= 20) { //iが20以上の時はWiFi認証情報に問題があると思われるのでconfigPortalを起動して設定し直す
Serial.println("Connection Failed!");
//wm.resetSettings();// wipe settings
//ESP.restart(); //ESP32を再起動
//<<
startConfigPortal();//configPortal起動 関数にしてみました
} /*if (i >= 20)*/
} else { //if (INI_SETUP_PIN == HIGH)//GPIO15がHIGHじゃない時
//>>>> WiFiManagerのconfigPortalで接続設定 //関数化する
startConfigPortal();//configPortal起動 関数にしてみました
}
それぞれの関数は適切な位置へ挿入してください。
関数startConfigPortal()
configPortalの一部分を関数化したものです。
"WiFiManager"ライブラリの
"Advanced"サンプルスケッチの改変部分だけ記載しています。
void startConfigPortal() {
中略
//set static ip固定IPアドレスをセットする ここに書いたアドレスがデフォルト設定として表示されます。
wm.setSTAStaticIPConfig(IPAddress(192, 168, 2, 100), IPAddress(192, 168, 2, 1), IPAddress(255, 255, 255, 0)); // set static ip,gw,sn
中略
//bool res;
// res = wm.autoConnect(); //chipidからAP名を自動生成 auto generated AP name from chipid
// res = wm.autoConnect("AutoConnectAP"); //匿名AP anonymous ap
//res = wm.autoConnect("AutoConnectAP","password"); //パスワードで保護されたAP password protected ap
/*if(!res) { //戻り値が"false"接続失敗 (res = wm.autoConnect()使用時)
Serial.println("Failed to connect or hit timeout");
//ESP.restart();
} else {
//ここまで来れば、WiFiに接続したことになる。 if you get here you have connected to the WiFi
Serial.println("connected...yeey :)??");
}*/
/*暫定的に無効化するため関数にして移動した*/
// start portal w delay
Serial.println("Starting config portal");
wm.setConfigPortalTimeout(120);
if (!wm.startConfigPortal("OnDemandAP", "password")) {
Serial.println("failed to connect or hit timeout");
delay(3000);
// ESP.restart();
} else {
//if you get here you have connected to the WiFi
Serial.println("now connected...yeey :)");
eepromPutData();
//WiFi認証情報と静的IP設定を保存 関数名変更SaveConfigCallbackをeepromPutDataへ
}
eepromGetData(); // EEPROMから(保存済の?)WiFi認証とIPアドレスをそれぞれの変数へ読み込む
} //<<<
関数eepromGetData()
//EEPROMからWiFi認証(保存NGだった)とIPアドレスをそれぞれの変数へ読み込む
void eepromGetData() {
//EEPROM.get(EEPROM_SSID_ADDRESS, savedSSID);//SSIDが電源ON-OFFで化けるため使用中止した
//EEPROM.get(EEPROM_PASS_ADDRESS, savedPassword);//SSID、PASSWORDは設定すると記憶される基本的な機能を活用
EEPROM.get(EEPROM_IP_ADDRESS, savedIP);
EEPROM.get(EEPROM_GATEWAY, savedGateway);
EEPROM.get(EEPROM_SUBNET, savedSubnet);
}
関数eepromPutData () は設定が終わったIPアドレスをESP32のEEPROMへ保存します。
WiFi認証情報の保存、読み出しはうまく行かなかった。
void eepromPutData () {
//関数名変更SaveConfigCallbackをeepromPutDataへ
Serial.println("Save button pressed, saving WiFi credentials and static IP configuration...");
//"保存ボタンが押され、WiFi認証情報と静的IP設定が保存されました..."
EEPROM.put(EEPROM_SSID_ADDRESS, WiFi.SSID());//SSIDはEEPROM保存しているが使っていない
EEPROM.put(EEPROM_PASS_ADDRESS, WiFi.psk());//PASSWORD(psk)はEEPROM保存しているが使っていない
EEPROM.put(EEPROM_IP_ADDRESS, WiFi.localIP());
EEPROM.put(EEPROM_GATEWAY, WiFi.gatewayIP());
EEPROM.put(EEPROM_SUBNET, WiFi.subnetMask());
EEPROM.commit();
}
だんだんわからんなってきた
つづく
"SimpleWiFiServer"
"IRremote"ライブラリの"SendRawDemo"
受信したデータを赤外線リモコン信号にしてテレビへ送信する