/
Yurask67
/
ESP32C3_AUDIO
Обзор
Документация
Войти
/
Yurask67
/
ESP32C3_AUDIO
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/mqtt_task.cpp
226 строк
11 KB
Yurask67
process
08 дек 2025, 17:45
08 дек 2025, 17:45
c9de5d5
Код
Авторство
О чём код?
#include <WiFi.h> #include <time.h> #include "conf.h" TaskHandle_t mqtt; // хендл задачи #define STACK_SIZE 8192 // declare function void vMQTTTask(void *pvParameters); /*-----------------------------------*/ /************ старт задачи***********/ void startMQTTTask(void) { xTaskCreate(vMQTTTask, "mqtt", STACK_SIZE, NULL, 10, &mqtt); } /*---------------------------------*/ /**********сетап задачи**************/ void setupMQTTTask(void) { Serial.println(); Serial.println("Demo project FOR ESP32C"); } /*---------------------------------*/ // Параметры подключения к WiFi // const char *wifiSSID = "Sweet Home 43"; const char *wifiSSID = "Galaxy A12D142"; const char *wifiPASS = "44445555"; // XXX--- Параметры NTP --- const char *ntpServer = "pool.ntp.org"; // Адрес публичного NTP сервера // Пример: для GMT+3 установите 3 * 3600. Для Москвы (UTC+3) значение 10800. const long gmtOffset_sec = 10800; // Смещение для перехода на летнее время в секундах. // Обычно 1 час (3600 секунд) или 0, если летнее время не используется. const int daylightOffset_sec = 0; struct tm timeinfo; // Структура для компонентов времени // IPAddress ip(192, 168, 0, 61); // XXXNode static IP // IPAddress gateway(192, 168, 0, 1); // // IPAddress subnet(255, 255, 255, 0); // // IPAddress dns1(8,8,8,8); // Подключение к WiFi точке доступа bool wifiConnected() { // Если подключение активно, то просто выходим и возвращаем true if (WiFi.status() != WL_CONNECTED) { // ... иначе пробуем подключиться к сети Serial.print("Connecting to WiFi AP "); Serial.print(wifiSSID); // Настраиваем объект WiFi // WiFi.setAutoConnect(false); WiFi.setAutoReconnect(false); WiFi.mode(WIFI_STA); WiFi.begin(wifiSSID, wifiPASS); // WiFi.config(ip,gateway,subnet);//XXX // И ждем подключения 2 циклов по 0,5 сек - это 1 секунд int i = 0; while (WiFi.status() != WL_CONNECTED) { i++; if (i > 10) // при меньшем значении не подключается повторно { // Если в течение этого времени не удалось подключиться - выходим с false // Бескорнечно ждать подключения опасно - если подключение было разорвано во время работы // нужно всё равно "обслуживать" реле и датчики, иначе может случиться беда Serial.println(""); Serial.println("Connection failed!"); return false; }; Serial.print("."); delay(500); }; // Подключение успешно установлено Serial.println(""); Serial.print("WiFi connected, obtained IP address: "); Serial.println(WiFi.localIP()); // Инициализация и получение времени с NTP сервера // configTime(смещение_GMT_сек, смещение_летнего_времени_сек, адрес_NTP_сервера) configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // // Первоначальный вывод времени после синхронизации // printLocalTime(); { // OTA Configiration and Enable OTA только после успешно подключения вафли, иначе рестартует Serial.println("\nDisable OTA Feature"); ArduinoOTA.setPassword("kns020267"); ArduinoOTA.begin(); // disableCore0WDT(); // TODO отключаем нафик WDT на 0 ядре иначе постоянно перегружает и нихуа не сделаеш } }; return true; } /*********************************************************************************************************************** * Настройка устройства и основной цикл **********************************************************************************************************************/ void vMQTTTask(void *pvParameters) { (void)pvParameters; setupMQTTTask(); while (1) { // Проверяем подключение к WiFi и MQTT if (wifiConnected()) { // Основной цикл клиента MQTT static long ota_timeout = millis(); if (ota_timeout < millis()) { ota_timeout += 5000; if (WiFi.status() == WL_CONNECTED) { // OTA Handle ArduinoOTA.handle(); } } } else { // Даже если ничего не вышло с WiFi подключением, вы можете что-то сделать автономно // Например переключить реле по датчику температуры // Ваш роутер может просто выйти из строя, но автоматика должна продолжать работать delay(1000); } vTaskDelay(1000); timeRTCLoop(); } } // // --- Функция для получения и вывода локального времени --- // void printLocalTime() // { // struct tm timeinfo; // Структура для хранения компонентов времени // // Попытка получить локальное время. // // getLocalTime() возвращает false, если время еще не синхронизировано. // if (!getLocalTime(&timeinfo)) // { // Serial.println("Не удалось получить время с NTP сервера."); // return; // Выход из функции, если время не получено // } // // Вывод времени в стандартном формате: День недели, Месяц День Год Час:Минута:Секунда // // Функция strftime форматирует время из структуры tm в строку согласно спецификаторам формата. // char timeStringBuff[50]; // Буфер для отформатированной строки времени // strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); // Serial.println(timeStringBuff); // Вывод полной строки времени // // --- (Опционально) Детальный вывод компонентов времени --- // Serial.print("День недели: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%A", &timeinfo); // %A - полное название дня недели // Serial.println(timeStringBuff); // Serial.print("Месяц: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%B", &timeinfo); // %B - полное название месяца // Serial.println(timeStringBuff); // Serial.print("День месяца: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%d", &timeinfo); // %d - день месяца (01-31) // Serial.println(timeStringBuff); // Serial.print("Год: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%Y", &timeinfo); // %Y - год (4 цифры) // Serial.println(timeStringBuff); // Serial.print("Час (24ч): "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%H", &timeinfo); // %H - час (00-23) // Serial.println(timeStringBuff); // Serial.print("Час (12ч): "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%I", &timeinfo); // %I - час (01-12) // Serial.println(timeStringBuff); // Serial.print("Минута: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%M", &timeinfo); // %M - минута (00-59) // Serial.println(timeStringBuff); // Serial.print("Секунда: "); // strftime(timeStringBuff, sizeof(timeStringBuff), "%S", &timeinfo); // %S - секунда (00-59) // Serial.println(timeStringBuff); // // --- (Опционально) Пример сохранения компонентов времени в переменные --- // Serial.println("Переменные времени:"); // char timeHour[3]; // Буфер для часов (2 цифры + нуль-терминатор) // strftime(timeHour, sizeof(timeHour), "%H", &timeinfo); // Serial.print("Час сохраненный в переменную: "); // Serial.println(timeHour); // char timeWeekDay[10]; // Буфер для дня недели (макс. ~9 символов + нуль-терминатор) // strftime(timeWeekDay, sizeof(timeWeekDay), "%A", &timeinfo); // Serial.print("День недели сохраненный в переменную: "); // Serial.println(timeWeekDay); // Serial.println(); // Пустая строка для разделения выводов // time_t sec = ((timeinfo.tm_year + 1900 - 2025) * 365 + timeinfo.tm_yday) * 86400 + // ((timeinfo.tm_hour) * 60 + timeinfo.tm_min) * 60 + timeinfo.tm_sec; // XXX текущее время в сек с 2025г // Serial.print("текущее время в секундах с 2025 года = "); // Serial.println(sec); // } // --- Функция возвращает время в секундах с 2025 года --- void timeRTCLoop(void) { // struct tm timeinfo; // Структура для хранения компонентов времени // Попытка получить локальное время. // getLocalTime() возвращает false, если время еще не синхронизировано. if (!getLocalTime(&timeinfo)) { Serial.println("Не удалось получить время с NTP сервера."); // return; // Выход из функции, если время не получено } // Вывод времени в стандартном формате: День недели, Месяц День Год Час:Минута:Секунда // Функция strftime форматирует время из структуры tm в строку согласно спецификаторам формата. char timeStringBuff[50]; // Буфер для отформатированной строки времени strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo); Serial.println(timeStringBuff); // Вывод полной строки времени }