ESP8266 и Arduino IDE. Часть 5: WiFiManager

Примечание

Оригинал статьи: martyncurrey.com

Этот урок объясняет, как использовать WiFiManager для подключения ESP8266 к сетям без жёстко заданных учётных данных.

Что такое WiFiManager?

WiFiManager — это библиотека, которая создаёт портал подключения на ESP8266. При первом включении устройство входит в режим точки доступа (AP) и отображает страницу конфигурации по адресу 192.168.4.1. Пользователи могут выбрать и подключиться к своей локальной сети без изменения скетча. После успешного подключения ESP8266 переключается в режим станции и запоминает учётные данные для автоматического переподключения.

Рекомендуется использовать форк Ken Taylor вместо оригинальной библиотеки Tzapu, так как он предоставляет подтверждение подключения и отображает назначенный IP-адрес.

WiFiManager

Установка и настройка

WiFiManager Ken Taylor требует две дополнительные библиотеки:

  • DNSServer

  • ESP8266WebServer

Обе включены в ядро ESP8266, поэтому отдельная установка не требуется.

Библиотеку можно установить вручную, загрузив с GitHub и скопировав папку в каталог библиотек Arduino.

Открытие портала конфигурации

Базовый пример

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>

const int PIN_LED = 2;

void setup() {
  pinMode(PIN_LED, OUTPUT);
  Serial.begin(115200);

  WiFiManager wifiManager;

  if (WiFi.SSID()!="")
    wifiManager.setConfigPortalTimeout(60);

  if (!wifiManager.startConfigPortal("ESP8266","password")) {
    Serial.println("Not connected to WiFi but continuing anyway.");
  } else {
    Serial.println("connected...yeey :)");
  }

  digitalWrite(PIN_LED, HIGH);
  Serial.print("local ip: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  delay(10000);
}
Портал конфигурации

Порядок использования

  1. Первый запуск: подключитесь к AP-сети ESP8266 (SSID: «ESP8266», пароль: «password»)

  2. Конфигурация: перейдите на 192.168.4.1 в веб-браузере

  3. Выбор сети: нажмите «Configuration», выберите вашу локальную сеть, введите пароль

  4. Сохранение: нажмите «save» для подключения

  5. Выход: нажмите «Exit Portal» для закрытия страницы конфигурации

  6. Доступ к устройству: подключитесь к обычному WiFi и откройте устройство по его IP-адресу

WiFiManager - выбор сети WiFiManager - конфигурация WiFiManager - сохранение WiFiManager - подключение

Интегрированный скетч с управлением LED

Полный скетч, объединяющий WiFiManager с mDNS и веб-интерфейсом управления светодиодом:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ESP8266mDNS.h>

WiFiServer server(80);
int LED_Pin = D1;

void setup() {
  pinMode(LED_Pin, OUTPUT);
  Serial.begin(115200);

  // WiFiManager initialization
  WiFiManager wifiManager;
  wifiManager.autoConnect("ESP8266","password");

  Serial.println("Connected.");

  if (!MDNS.begin("esp8266")) {
    Serial.println("Error setting up MDNS responder!");
  } else {
    Serial.println("mDNS responder started");
  }

  server.begin();
  Serial.println("Server started");
}

void loop() {
  WiFiClient client = server.available();

  if (client) {
    String request = client.readStringUntil('\r');

    if (request.indexOf("LEDON") > 0) {
      digitalWrite(LED_Pin, HIGH);
    } else if (request.indexOf("LEDOFF") > 0) {
      digitalWrite(LED_Pin, LOW);
    }

    // Send HTML response with button
    client.flush();
    client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
    client.print("<html><body><h2>LED Control</h2>");

    if (digitalRead(LED_Pin) == HIGH) {
      client.print("<form action='LEDOFF'><input type='submit' value='Turn off'></form>");
    } else {
      client.print("<form action='LEDON'><input type='submit' value='Turn on'></form>");
    }

    client.print("</body></html>");
    delay(5);
  }
}
Результат работы LED управление через WiFiManager

Важные замечания

  • Портал конфигурации остаётся активным, пока не будет явно закрыт

  • На устройствах Android используйте IP-адрес; на ПК mDNS позволяет использовать «esp8266.local»

  • Для сброса сохранённых учётных данных используйте wifiManager.resetSettings(); перед autoConnect()

Продвинутый паттерн использования

Для повышения надёжности проверяйте наличие сохранённых учётных данных перед открытием портала:

if (WiFi.SSID() != "") {
  Serial.print("Trying to connect to ");
  Serial.println(WiFi.SSID());

  int count = 0;
  WiFi.mode(WIFI_STA);

  while ((WiFi.status() != WL_CONNECTED) && (count < 20)) {
    Serial.print(".");
    count++;
    delay(500);
  }
}

if (WiFi.status() != WL_CONNECTED) {
  WiFiManager wifiManager;
  wifiManager.startConfigPortal("ESP8266_IOT", "12345678");
}

Альтернативные библиотеки: Khoi Hoang’s ESP_WiFiManager, Ryan Downing’s PersWiFiManager.