LoginSignup
67
63

More than 3 years have passed since last update.

ESP32 WiFiのSSID、パスワードを外部から設定しアクセスポイントに接続

Last updated at Posted at 2018-01-23

ESP32のWiFi設定をスケッチの書き換えをせずにブラウザ経由で設定する

以下のライブラリを使用する

WiFi Manager for ESP32
https://github.com/zhouhan0126/WIFIMANAGER-ESP32

このライブラリを使用するために以下のライブラリも導入する
WebServer
https://github.com/zhouhan0126/WebServer-esp32
DNSServer
https://github.com/zhouhan0126/DNSServer---esp32
2021/3/14更新
WebServer及びDNSServerライブラリはESP32ライブラリに取り込まれましたので最新版では個別のインストールは不要となりました。

今回もこのボードにOLEDを取り付けて動作確認をする。
Unopuino32s
https://www.switch-science.com/catalog/3456/

WifiBManagerのサンプルプログラムを参考に、OLEDにIPアドレス情報を表示する。

立ち上げた時にWiFi設定を表示するスケッチ

AP名: OnDemandAP にWiFiで接続し、ブラウザで"192.168.4.1"にアクセスするとWiFi設定が表示される。設定値はESP32のFlashに記憶される。

ESP32_OnDemandConfigPortal.ino

#include <WiFi.h>          //https://github.com/esp8266/Arduino
#include <WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager

// Include the correct display library
// For a connection via I2C using Wire include
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`

// Include Unopuino32 pin definition
#include "Unopuino32.h"

// Initialize the OLED display using Wire library
SSD1306  display(0x3c, GPSDA, GPSCL);

void setup() {
    display.init();
    display.clear();

    display.flipScreenVertically();
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);

    // put your setup code here, to run once:
    Serial.begin(115200);
    Serial.println("\n Starting");

    // is configuration portal requested?
    //WiFiManager
    //Local intialization. Once its business is done, there is no need to keep it around
    WiFiManager wifiManager;

    //reset settings - for testing
    //wifiManager.resetSettings();

    //sets timeout until configuration portal gets turned off
    //useful to make it all retry or go to sleep
    //in seconds
    //wifiManager.setTimeout(120);

    //it starts an access point with the specified name
    //here  "AutoConnectAP"
    //and goes into a blocking loop awaiting configuration

    //WITHOUT THIS THE AP DOES NOT SEEM TO WORK PROPERLY WITH SDK 1.5 , update to at least 1.5.1
    //WiFi.mode(WIFI_STA);

    display.drawString(0, 0, "AP mode: OnDemandAP");
    display.drawString(0, 10, "IP adrs: 192.168.4.1");
    display.display();

    if (!wifiManager.startConfigPortal("OnDemandAP")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.restart();
      delay(5000);
    }

    //if you get here you have connected to the WiFi
    IPAddress ipadr = WiFi.localIP();

    Serial.println("connected(^^)");
    Serial.println("local ip");
    Serial.println(ipadr);
    Serial.println(WiFi.SSID());
    display.clear();
    display.drawString(0, 0, "connected (^^)");
    display.drawString(0, 10, "SSID: " + WiFi.SSID());
    display.drawString(0, 20, "IP adrs: " + (String)ipadr[0] + "." + (String)ipadr[1] + "." + (String)ipadr[2] + "." + (String)ipadr[3]);
    display.display();
}

void loop() {
  // put your main code here, to run repeatedly:
}

Wifi設定画面にアクセスするとAPの一覧が表示されるのでSSIDとパスワードを入力して接続する。接続が完了したらOLEDに接続先のAPと取得したIPアドレスを表示する。
IMG_2592.PNG
IMG_2593.PNG
IMG_2594.PNG
IMG_2595.PNG
無題.jpg

WiFiに自動接続するスケッチ

既にEEPROMに設定情報が保存されたいたらそれを使いAPに自動で接続する。
接続できなかった場合はAP名: AutoConnectAP にWiFiで接続し、ブラウザで"192.168.4.1"にアクセスするとWiFi設定が表示される。

ESP32_Wifi_AutoConnect.ino
#include <WiFi.h>          //https://github.com/esp8266/Arduino
#include <DNSServer.h>
#include <WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager

// Include the correct display library
// For a connection via I2C using Wire include
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`

// Include Unopuino32 pin definition
#include "Unopuino32.h"

// Initialize the OLED display using Wire library
SSD1306  display(0x3c, GPSDA, GPSCL);

void setup() {
    display.init();
    display.clear();

    display.flipScreenVertically();
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);

    // put your setup code here, to run once:
    Serial.begin(115200);

    //WiFiManager
    //Local intialization. Once its business is done, there is no need to keep it around
    WiFiManager wifiManager;
    //reset saved settings
    //wifiManager.resetSettings();

    //set custom ip for portal
    //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

    display.drawString(0, 0, "AP mode: AutoConnectAP");
    display.drawString(0, 10, "IP adrs: 192.168.4.1");
    display.display();

    //fetches ssid and pass from eeprom and tries to connect
    //if it does not connect it starts an access point with the specified name
    //here  "AutoConnectAP"
    //and goes into a blocking loop awaiting configuration
    wifiManager.autoConnect("AutoConnectAP");
    //or use this for auto generated name ESP + ChipID
    //wifiManager.autoConnect();

    //if you get here you have connected to the WiFi
    IPAddress ipadr = WiFi.localIP();
    Serial.println("connected(^^)");
    Serial.println(WiFi.SSID());

    display.clear();
    display.drawString(0, 0, "AutoConnectAP");
    display.drawString(0, 10, "SSID: " + WiFi.SSID());
    display.drawString(0, 20, "IP adrs: " + (String)ipadr[0] + "." + (String)ipadr[1] + "." + (String)ipadr[2] + "." + (String)ipadr[3]);
    display.display();
}

void loop() {
    // put your main code here, to run repeatedly:

}

任意のアクセスポイントを切替する場合は、これらをスイッチ等で切り替える様に実装すればよい。

EEPROMに記憶されたAP情報のクリア

記憶されたAP情報はESP32では以下のメンバ関数ではクリアできない。
wifiManager.resetSettings();

EEPROM情報をクリアする場合はESP-IDFのプロジェクトライブラリで以下のコマンドを実行する。
$ make erase_flash

67
63
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
63