mirror of
https://github.com/gunner47/GyverLamp.git
synced 2025-08-10 18:27:35 +03:00
Исправлены ошибки назначения статического IP адреса; Добавлен набросок WiFiManager Captive Portal для ввода пользовательских параметров и настроек
This commit is contained in:
43
firmware/GyverLamp_v1.4/CaptivePortalManager.h
Normal file
43
firmware/GyverLamp_v1.4/CaptivePortalManager.h
Normal 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;
|
||||||
|
// сохранение введённых значений пользовательских параметров
|
||||||
|
// ...
|
||||||
|
}
|
@@ -105,6 +105,12 @@
|
|||||||
- Добавлен эффект Белый огонь
|
- Добавлен эффект Белый огонь
|
||||||
- Исправлена ошибка сброса сигнала на пине ALARM_PIN при отключении будильника вручную
|
- Исправлена ошибка сброса сигнала на пине ALARM_PIN при отключении будильника вручную
|
||||||
- Добавлена сигнализация (4 вспышки красным) при запросе вывода времени шестикратным кликом, если время не синхронизировано
|
- Добавлена сигнализация (4 вспышки красным) при запросе вывода времени шестикратным кликом, если время не синхронизировано
|
||||||
|
--- 04.11.2019
|
||||||
|
- Исправлена ошибка невключения MOSFET'а матрицы при срабатывании "рассвета"
|
||||||
|
- Исправлена ошибка невключения MOSFET'а матрицы при выводе времени и IP адреса
|
||||||
|
--- 08.11.2019
|
||||||
|
- Исправлены ошибки назначения статического IP адреса
|
||||||
|
- Добавлен набросок WiFiManager Captive Portal для ввода пользовательских параметров и настроек
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Ссылка для менеджера плат:
|
// Ссылка для менеджера плат:
|
||||||
@@ -117,6 +123,7 @@
|
|||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266WebServer.h>
|
#include <ESP8266WebServer.h>
|
||||||
#include <WiFiManager.h>
|
#include <WiFiManager.h>
|
||||||
|
#include "CaptivePortalManager.h"
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include "Types.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};
|
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;
|
uint32_t FavoritesManager::nextModeAt = 0UL;
|
||||||
|
|
||||||
|
bool CaptivePortalManager::captivePortalCalled = false;
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
@@ -302,6 +311,7 @@ void setup()
|
|||||||
// WI-FI
|
// WI-FI
|
||||||
wifiManager.setDebugOutput(WIFIMAN_DEBUG); // вывод отладочных сообщений
|
wifiManager.setDebugOutput(WIFIMAN_DEBUG); // вывод отладочных сообщений
|
||||||
// wifiManager.setMinimumSignalQuality(); // установка минимально приемлемого уровня сигнала WiFi сетей (8% по умолчанию)
|
// wifiManager.setMinimumSignalQuality(); // установка минимально приемлемого уровня сигнала WiFi сетей (8% по умолчанию)
|
||||||
|
CaptivePortalManager *captivePortalManager = new CaptivePortalManager(&wifiManager);
|
||||||
if (espMode == 0U) // режим WiFi точки доступа
|
if (espMode == 0U) // режим WiFi точки доступа
|
||||||
{
|
{
|
||||||
// wifiManager.setConfigPortalBlocking(false);
|
// wifiManager.setConfigPortalBlocking(false);
|
||||||
@@ -330,41 +340,71 @@ void setup()
|
|||||||
if (WiFi.SSID().length())
|
if (WiFi.SSID().length())
|
||||||
{
|
{
|
||||||
LOG.printf_P(PSTR("Подключение к WiFi сети: %s\n"), WiFi.SSID().c_str());
|
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
|
else
|
||||||
{
|
{
|
||||||
LOG.println(F("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети..."));
|
LOG.println(F("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети..."));
|
||||||
|
CaptivePortalManager::captivePortalCalled = true;
|
||||||
|
wifiManager.setBreakAfterConfig(true); // перезагрузка после ввода и сохранения имени и пароля WiFi сети
|
||||||
showWarning(CRGB::Yellow, 1000U, 500U); // мигание жёлтым цветом 0,5 секунды (1 раз) - нужно ввести параметры 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.setConnectTimeout(ESP_CONN_TIMEOUT); // установка времени ожидания подключения к WiFi сети, затем старт WiFi точки доступа
|
||||||
wifiManager.setConfigPortalTimeout(ESP_CONF_TIMEOUT); // установка времени работы WiFi точки доступа, затем перезагрузка; отключить watchdog?
|
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 сети роутера
|
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;
|
espMode = (espMode == 0U) ? 1U : 0U;
|
||||||
EepromManager::SaveEspMode(&espMode);
|
EepromManager::SaveEspMode(&espMode);
|
||||||
|
|
||||||
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
|
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
|
||||||
espMode, espMode == 0U ? F("WiFi точка доступа") : F("WiFi клиент (подключение к роутеру)"));
|
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 сети прекращено, перезагрузка
|
showWarning(CRGB::Red, 1000U, 500U); // мигание красным цветом 0,5 секунды (1 раз) - ожидание ввода SSID'а и пароля WiFi сети прекращено, перезагрузка
|
||||||
ESP.restart();
|
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.print(F("IP адрес: "));
|
||||||
LOG.println(WiFi.localIP());
|
LOG.println(WiFi.localIP());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user