Исправлены ошибки назначения статического IP адреса; Добавлен набросок WiFiManager Captive Portal для ввода пользовательских параметров и настроек

This commit is contained in:
gunner47
2019-11-09 15:02:52 +02:00
parent 96475bd4e3
commit 4e8a1a6bbf
2 changed files with 99 additions and 16 deletions

View File

@@ -0,0 +1,43 @@
#pragma once
#include <WiFiManager.h>
class CaptivePortalManager
{
public:
static bool captivePortalCalled;
CaptivePortalManager(WiFiManager *wifiManager);
~CaptivePortalManager();
static void captivePortalManagerCallback(WiFiManager *wifiManager);
private:
WiFiManager *wifiManager = NULL;
};
CaptivePortalManager::CaptivePortalManager(WiFiManager *wifiManager)
{
this->wifiManager = wifiManager;
// добавление пользовательских параметров: id, placeholder, prompt/default value, length[, custom html]
// ...
if (wifiManager != NULL)
{
wifiManager->setAPCallback(CaptivePortalManager::captivePortalManagerCallback);
}
}
CaptivePortalManager::~CaptivePortalManager()
{
this->wifiManager = NULL;
}
void CaptivePortalManager::captivePortalManagerCallback(WiFiManager *wifiManager)
{
CaptivePortalManager::captivePortalCalled = true;
// сохранение введённых значений пользовательских параметров
// ...
}

View File

@@ -105,6 +105,12 @@
- Добавлен эффект Белый огонь
- Исправлена ошибка сброса сигнала на пине ALARM_PIN при отключении будильника вручную
- Добавлена сигнализация (4 вспышки красным) при запросе вывода времени шестикратным кликом, если время не синхронизировано
--- 04.11.2019
- Исправлена ошибка невключения MOSFET'а матрицы при срабатывании "рассвета"
- Исправлена ошибка невключения MOSFET'а матрицы при выводе времени и IP адреса
--- 08.11.2019
- Исправлены ошибки назначения статического IP адреса
- Добавлен набросок WiFiManager Captive Portal для ввода пользовательских параметров и настроек
*/
// Ссылка для менеджера плат:
@@ -117,6 +123,7 @@
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include "CaptivePortalManager.h"
#include <WiFiUdp.h>
#include <EEPROM.h>
#include "Types.h"
@@ -226,6 +233,8 @@ uint8_t FavoritesManager::UseSavedFavoritesRunning = 0;
uint8_t FavoritesManager::FavoriteModes[MODE_AMOUNT] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
uint32_t FavoritesManager::nextModeAt = 0UL;
bool CaptivePortalManager::captivePortalCalled = false;
void setup()
{
@@ -302,6 +311,7 @@ void setup()
// WI-FI
wifiManager.setDebugOutput(WIFIMAN_DEBUG); // вывод отладочных сообщений
// wifiManager.setMinimumSignalQuality(); // установка минимально приемлемого уровня сигнала WiFi сетей (8% по умолчанию)
CaptivePortalManager *captivePortalManager = new CaptivePortalManager(&wifiManager);
if (espMode == 0U) // режим WiFi точки доступа
{
// wifiManager.setConfigPortalBlocking(false);
@@ -330,41 +340,71 @@ void setup()
if (WiFi.SSID().length())
{
LOG.printf_P(PSTR("Подключение к WiFi сети: %s\n"), WiFi.SSID().c_str());
if (sizeof(STA_STATIC_IP)) // ВНИМАНИЕ: настраивать статический ip WiFi клиента можно только при уже сохранённых имени и пароле WiFi сети (иначе проявляется несовместимость библиотек WiFiManager и WiFi)
{
LOG.print(F("Сконфигурирован статический IP адрес: "));
LOG.printf_P(PSTR("%u.%u.%u.%u\n"), STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], STA_STATIC_IP[3]);
wifiManager.setSTAStaticIPConfig(
IPAddress(STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], STA_STATIC_IP[3]),// статический IP адрес ESP в режиме WiFi клиента
IPAddress(STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], 1), // первый доступный IP адрес сети (справедливо для 99,99% случаев; для сетей меньше чем на 255 адресов нужно вынести в константы)
IPAddress(255, 255, 255, 0)); // маска подсети (справедливо для 99,99% случаев; для сетей меньше чем на 255 адресов нужно вынести в константы)
}
}
else
{
LOG.println(F("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети..."));
CaptivePortalManager::captivePortalCalled = true;
wifiManager.setBreakAfterConfig(true); // перезагрузка после ввода и сохранения имени и пароля WiFi сети
showWarning(CRGB::Yellow, 1000U, 500U); // мигание жёлтым цветом 0,5 секунды (1 раз) - нужно ввести параметры WiFi сети для подключения
}
if (sizeof(STA_STATIC_IP))
{
LOG.print(F("Сконфигурирован статический IP адрес: "));
LOG.printf_P(PSTR("%u.%u.%u.%u\n"), STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], STA_STATIC_IP[3]);
wifiManager.setSTAStaticIPConfig(
IPAddress(STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], STA_STATIC_IP[3]), // статический IP адрес ESP в режиме WiFi клиента
IPAddress(STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], 1), // первый доступный IP адрес сети (справедливо для 99,99% случаев; для сетей меньше чем на 255 адресов нужно вынести в константы)
IPAddress(255, 255, 255, 0)); // маска подсети (справедливо для 99,99% случаев; для сетей меньше чем на 255 адресов нужно вынести в константы)
}
wifiManager.setConnectTimeout(ESP_CONN_TIMEOUT); // установка времени ожидания подключения к WiFi сети, затем старт WiFi точки доступа
wifiManager.setConfigPortalTimeout(ESP_CONF_TIMEOUT); // установка времени работы WiFi точки доступа, затем перезагрузка; отключить watchdog?
wifiManager.autoConnect(AP_NAME, AP_PASS); // пытаемся подключиться к сохранённой ранее WiFi сети; в случае ошибки, будет развёрнута WiFi точка доступа с указанными AP_NAME и паролем на время ESP_CONN_TIMEOUT секунд; http://AP_STATIC_IP:ESP_HTTP_PORT (обычно http://192.168.0.1:80) - страница для ввода SSID и пароля от WiFi сети роутера
if (WiFi.status() != WL_CONNECTED)
delete captivePortalManager;
captivePortalManager = NULL;
if (WiFi.status() != WL_CONNECTED) // подключение к WiFi не установлено
{
LOG.println(F("Время ожидания ввода SSID и пароля от WiFi сети или подключения к WiFi сети превышено\nЛампа будет перезагружена в режиме WiFi точки доступа!\n"));
if (CaptivePortalManager::captivePortalCalled) // была показана страница настройки WiFi ...
{
if (millis() < (ESP_CONN_TIMEOUT + ESP_CONF_TIMEOUT) * 1000U) // пользователь ввёл некорректное имя WiFi сети и/или пароль или запрошенная WiFi сеть недоступна
{
LOG.println(F("Не удалось подключиться к WiFi сети\nУбедитесь в корректности имени WiFi сети и пароля\nРестарт для запроса нового имени WiFi сети и пароля...\n"));
wifiManager.resetSettings();
}
else // пользователь не вводил имя WiFi сети и пароль
{
LOG.println(F("Время ожидания ввода SSID и пароля от WiFi сети или подключения к WiFi сети превышено\nЛампа будет перезагружена в режиме WiFi точки доступа!\n"));
espMode = (espMode == 0U) ? 1U : 0U;
EepromManager::SaveEspMode(&espMode);
espMode = (espMode == 0U) ? 1U : 0U;
EepromManager::SaveEspMode(&espMode);
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
espMode, espMode == 0U ? F("WiFi точка доступа") : F("WiFi клиент (подключение к роутеру)"));
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
espMode, espMode == 0U ? F("WiFi точка доступа") : F("WiFi клиент (подключение к роутеру)"));
}
}
else // страница настройки WiFi не была показана, не удалось подключиться к ранее сохранённой WiFi сети (перенос в новую WiFi сеть)
{
LOG.println(F("Не удалось подключиться к WiFi сети\nВозможно, заданная WiFi сеть больше не доступна\nРестарт для запроса нового имени WiFi сети и пароля...\n"));
wifiManager.resetSettings();
}
showWarning(CRGB::Red, 1000U, 500U); // мигание красным цветом 0,5 секунды (1 раз) - ожидание ввода SSID'а и пароля WiFi сети прекращено, перезагрузка
ESP.restart();
}
if (CaptivePortalManager::captivePortalCalled && // первое подключение к WiFi сети после настройки параметров WiFi на странице настройки - нужна перезагрузка для применения статического IP
sizeof(STA_STATIC_IP) &&
WiFi.localIP() != IPAddress(STA_STATIC_IP[0], STA_STATIC_IP[1], STA_STATIC_IP[2], STA_STATIC_IP[3]))
{
LOG.println(F("Рестарт для применения заданного статического IP адреса..."));
delay(100);
ESP.restart();
}
LOG.print(F("IP адрес: "));
LOG.println(WiFi.localIP());
}