← До всіх проєктів
IoT / Веб Початковий

Налаштування Wi-Fi без перепрошивки: портал WiFiManager

Прибираємо пароль від Wi-Fi з коду: при першому запуску ESP32 піднімає власну точку доступу з веб-формою, де можна вибрати мережу й задати власні параметри.

Складність
Початковий
Час
30 min
Категорія
IoT / Веб

Проблема

У більшості прикладів SSID і пароль зашиті прямо в скетч. Це незручно: змінився роутер — перепрошивай; віддав пристрій другу — перепрошивай. Бібліотека WiFiManager вирішує це так само, як «розумні» розетки з магазину:

  1. Якщо плата не знає мережі або не може до неї підключитися — вона створює точку доступу ESP32-Setup.
  2. Ви підключаєтеся до неї з телефона — автоматично відкривається сторінка налаштування (captive portal).
  3. Обираєте мережу зі списку, вводите пароль — і плата запам'ятовує його у флеш-пам'яті.

Цей підхід варто додавати в будь-який проєкт з цього сайту, який ви плануєте використовувати постійно.

Що знадобиться

  • Будь-яка плата ESP32
  • Бібліотека WiFiManager (автор tzapu) — встановіть через Library Manager

Код

Окрім Wi-Fi, портал збереже ще й власний параметр — адресу MQTT-сервера. Утримання кнопки BOOT 3 секунди під час старту скидає налаштування.

#include <WiFi.h>
#include <WiFiManager.h>
#include <Preferences.h>

const int RESET_PIN = 0;   // кнопка BOOT

WiFiManager wm;
Preferences prefs;
char mqttHost[40] = "";

void setup() {
  Serial.begin(115200);
  pinMode(RESET_PIN, INPUT_PULLUP);

  // Власні параметри зберігаємо в NVS (енергонезалежна пам'ять)
  prefs.begin("config", false);
  prefs.getString("mqtt", mqttHost, sizeof(mqttHost));

  // BOOT утримується 3 с при старті → забути Wi-Fi
  if (digitalRead(RESET_PIN) == LOW) {
    delay(3000);
    if (digitalRead(RESET_PIN) == LOW) {
      Serial.println("Resetting Wi-Fi settings");
      wm.resetSettings();
    }
  }

  WiFiManagerParameter mqttParam("mqtt", "MQTT server", mqttHost, sizeof(mqttHost) - 1);
  wm.addParameter(&mqttParam);

  wm.setConfigPortalTimeout(180);   // 3 хв на налаштування, потім перезавантаження
  if (!wm.autoConnect("ESP32-Setup", "setup1234")) {
    Serial.println("Portal timeout, restarting");
    ESP.restart();
  }

  strlcpy(mqttHost, mqttParam.getValue(), sizeof(mqttHost));
  prefs.putString("mqtt", mqttHost);

  Serial.printf("Connected! IP: %s, MQTT: %s\n",
                WiFi.localIP().toString().c_str(), mqttHost);
}

void loop() {
  // ваш основний код
}

Як користуватися

  1. Прошийте плату й відкрийте Serial Monitor.
  2. На телефоні підключіться до мережі ESP32-Setup (пароль setup1234).
  3. Якщо сторінка не відкрилась сама — зайдіть на http://192.168.4.1.
  4. Configure WiFi → оберіть мережу, введіть пароль і адресу MQTT → Save.
  5. Плата підключиться до роутера. Наступні запуски відбуватимуться автоматично, без порталу.

Корисні налаштування

Метод Навіщо
wm.setConnectTimeout(20) Скільки секунд чекати на підключення до збереженої мережі
wm.setConfigPortalBlocking(false) + wm.process() у loop() Портал не блокує решту коду
wm.setHostname("kitchen-sensor") Ім'я пристрою в роутері
wm.startConfigPortal("ESP32-Setup") Відкрити портал вручну, наприклад за натисканням кнопки

Поради

  • Пароль точки доступу має бути мінімум 8 символів, інакше вона не запуститься.
  • Якщо у вас кілька однакових пристроїв, додайте до назви точки доступу частину MAC-адреси, щоб їх розрізняти.
  • WiFiManager підтримує лише мережі 2.4 ГГц — як і сам ESP32.