From 4e8a1a6bbf4c1ade0d1cf628ba3c8501abbd9561 Mon Sep 17 00:00:00 2001 From: gunner47 Date: Sat, 9 Nov 2019 15:02:52 +0200 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20IP=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0;=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B1=D1=80=D0=BE=D1=81=D0=BE=D0=BA=20WiFiManager=20Captive=20?= =?UTF-8?q?Portal=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B8=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GyverLamp_v1.4/CaptivePortalManager.h | 43 +++++++++++ firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino | 72 ++++++++++++++----- 2 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 firmware/GyverLamp_v1.4/CaptivePortalManager.h diff --git a/firmware/GyverLamp_v1.4/CaptivePortalManager.h b/firmware/GyverLamp_v1.4/CaptivePortalManager.h new file mode 100644 index 0000000..65f25ad --- /dev/null +++ b/firmware/GyverLamp_v1.4/CaptivePortalManager.h @@ -0,0 +1,43 @@ +#pragma once + +#include + + +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; + // сохранение введённых значений пользовательских параметров + // ... +} diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index 3da92e8..a2daf05 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -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 #include #include +#include "CaptivePortalManager.h" #include #include #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()); }