ESP8266 и Arduino IDE. Часть 5: WiFiManager
Примечание
Оригинал статьи: martyncurrey.com
Этот урок объясняет, как использовать WiFiManager для подключения ESP8266 к сетям без жёстко заданных учётных данных.
Что такое WiFiManager?
WiFiManager — это библиотека, которая создаёт портал подключения на ESP8266. При первом включении устройство входит в режим точки доступа (AP) и отображает страницу конфигурации по адресу 192.168.4.1. Пользователи могут выбрать и подключиться к своей локальной сети без изменения скетча. После успешного подключения ESP8266 переключается в режим станции и запоминает учётные данные для автоматического переподключения.
Рекомендуется использовать форк Ken Taylor вместо оригинальной библиотеки Tzapu, так как он предоставляет подтверждение подключения и отображает назначенный IP-адрес.
Установка и настройка
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);
}
Порядок использования
Первый запуск: подключитесь к AP-сети ESP8266 (SSID: «ESP8266», пароль: «password»)
Конфигурация: перейдите на 192.168.4.1 в веб-браузере
Выбор сети: нажмите «Configuration», выберите вашу локальную сеть, введите пароль
Сохранение: нажмите «save» для подключения
Выход: нажмите «Exit Portal» для закрытия страницы конфигурации
Доступ к устройству: подключитесь к обычному WiFi и откройте устройство по его IP-адресу
Интегрированный скетч с управлением 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);
}
}
Важные замечания
Портал конфигурации остаётся активным, пока не будет явно закрыт
На устройствах 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.