kghr IT備忘録
HOME » Arduino » Entry
ESP32にWiFi接続したら自動的にトップページを開くみたいな
2020.08/13 (Thu)

空港やホテルでフリーWi-Fiに接続した際に、すぐにはインターネットには繋がらず同意画面などのページが表示されるような仕組みをESP32で試してみた。
完成品
先に動くようになったコードを書いておく。
ESP32で立てたアクセスポイント”ESP32LED”にWiFi接続する。この例で立てたアクセスポイントにはパスワードを設定していないので、WiFi接続するとLEDをON/OFFするページが自動的に表示される。
Webの画面でONやOFFを押すとLED(LED_BUILTIN)が点滅する仕組みをやりたかったのではなく、WiFiに接続すると自動的に操作用の画面に切り替わるということをしたかったのだ。
#include <WiFi.h>
#include <DNSServer.h>
#include <WebServer.h>
//#define LED_BUILTIN 2;
IPAddress apIP(192,168,1,100);
WebServer webServer(80);
const char* ap_ssid = "ESP32LED"; //APのSSID
DNSServer dnsServer;
void LED_top() {
String html = "";
html +="<html><body>";
html +="LED [<a href='/on'>ON</a>] [<a href='/off'>off</a>]";
html +="</body></html>";
webServer.send(200, "text/html", html);
}
void LED_on() {
digitalWrite(LED_BUILTIN, HIGH);
// 「/」に転送
webServer.sendHeader("Location", String("/"), true);
webServer.send(302, "text/plain", "");
}
void LED_off() {
digitalWrite(LED_BUILTIN, LOW);
// 「/」に転送
webServer.sendHeader("Location", String("/"), true);
webServer.send(302, "text/plain", "");
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
WiFi.mode(WIFI_AP);
WiFi.softAP(ap_ssid); // no password
delay(200); // Important! This delay is necessary
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start(53, "*", apIP);
webServer.on("/", LED_top);
webServer.on("/on", HTTP_GET, LED_on);
webServer.on("/off", HTTP_GET, LED_off);
webServer.onNotFound(LED_top);
webServer.begin();
}
void loop() {
dnsServer.processNextRequest();
webServer.handleClient();
}
つまづいたところ
サンプルを参考にプログラムしたが、接続後にPanicが発生しESP32がリセットを繰り返してしまうという現象が多発。サンプルのままなのにどこが悪いのだろうか。
dhcps: send_offer>>udp_sendto result 0
Guru Meditation Error: Core 0 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x00000000 PS : 0x00060e30 A0 : 0x80114061 A1 : 0x3ffb3b40
A2 : 0x3ffcda3c A3 : 0x3ffcccf8 A4 : 0x3ffcd168 A5 : 0x3ffcd148
A6 : 0x6501a8c0 A7 : 0x6f01a8c0 A8 : 0x80113f04 A9 : 0x3ffb3b00
A10 : 0x3ffcda4c A11 : 0x3ffcccf8 A12 : 0x3ffb3b4c A13 : 0x00000044
A14 : 0x00000001 A15 : 0x00000006 SAR : 0x00000010 EXCCAUSE: 0x00000014
EXCVADDR: 0x00000000 LBEG : 0x4000c349 LEND : 0x4000c36b LCOUNT : 0x00000000
Backtrace: 0x00000000:0x3ffb3b40 0x4011405e:0x3ffb3b80 0x40120ee5:0x3ffb3ba0 0x40125eed:0x3ffb3be0 0x4012b18a:0x3ffb3c00 0x40114a67:0x3ffb3c20 0x400889ad:0x3ffb3c50
Rebooting...
デバッグのメッセージがヒントになるかもしれないと、"Core Debug Level"を”なし”から”Debug"に変更したら、プログラムを変えてないのに何事もなかったように動く。きっとタイミング的な要素があるに違いない。

解決したところ
結局、softAP()とsoftAPConfig()の間にdelay(100)を入れることで解決した。念のためdelay(200)にしておく。
OKパターン
WiFi.softAP(ap_ssid); // no password
delay(200); // Important! This delay is necessary
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
いくつか試したうち、NGパターンも書いておく。
NGパターン①
softAP()とsoftAPCofig()の間にdelay()を入れないと、panicになってしまう。
WiFi.softAP(ap_ssid); // no password
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
NGパターン②
softAP()より先にsoftAPCofig()を配置するとpanicになってしまう。
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
WiFi.softAP(ap_ssid); // no password
NGパターン③
softAP()より先にsoftAPCofig()を配置してdelay()を入れてもpanicになってしまう。
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
delay(200);
WiFi.softAP(ap_ssid); // no password
まとめ
海外のサイトにも、このpanicになる件に関して書き込みを見かけたが、どれも解決に至っていなかった。「自分はこれで出来てるけど?」的な書き込みがあっても出来ない人は出来ない。
きっとESP32の個体差とかバージョンの違いがあるに違いないのでここに書いたとおりにプログラムしても動かないこともあるだろう。
ちなみに冒頭の写真のESP32は”MH ET LIVE ESP32MiniKit”だが、手持ちの"DOIT ESP32 DEVKIT V1"でも動作した。
とりあえずここでは動くようになったから良しとする。
今日はここまで。
スポンサーサイト
