Делаю для себя систему умного дома. Есть центральный контроллер на базе ESP8266, который собирает посредством UDP информацию от различных датчиков и отдаёт в MQTT, а также принимает из MQTT управляющие данные и отдаёт через UDP датчикам.
Для управления устройствами я использовал Smartrele Tuya с перепайкой их контроллера на ESP8285. За основу взял Ваш код таймера, добавил в него управление каналом(реле) по UDP, то есть состояние канала отправляется по UDP на центральный контроллер, и обратно - по команде с центрального контроллера меняется состояние канала. Естественно локальное управление через WEB тоже работает, что для меня важно. Но я не разбираюсь в WEB интерфейсах, и потому хочу спросить как сделать, чтобы при изменении состояния канала по UDP изменялось состояние кнопки c "Turn ON" на "Set OFF" и обратно в WEB интерфейсе?
Я тоже не разбираюсь в WEB-интерфейсах, поэтому у меня браузеру просто отдаётся статическая HTML-страница и всё, что я могу делать при таком подходе - это рефрешить (<META http-equiv='refresh' content='0;URL=....) страницу полностью при изменениях содержимого.
Чтобы полноценно реализовать задуманное, придётся Вам переходить на динамический HTML, благо информации о нём предостаточно, в том числе и на этом форуме.
Спасибо на добром слове, у меня пропуски заданий однажды начались после активных игр с настройками, зачистил флеш - заработало как надо, причину так и не нашел. Поставлю-ка тестовую ЕСП с десятком-другим заданий, понаблюдаю.
Нужно смотреть что формирует HHTPсервер в заголовках
должно быть Cache-Control: no-cache особенно в тех файлах в которых есть изменяющиеся данные.
Не знаю как насчет ESP это сделать , но в своем HHTPсервере на pic32 всегда управляю кешированием и другими параметрами.
3000 строк в одном файле, это конечно.. Среда ардуино позволяет дробить код на файлы, или надо все в отдельном файле?
Функционал навороченный, все состояния в глобальных переменнных. Нужны нетривиальные усилия чтобы это все отладить и работало. О развитии речи не идет.
А зачем так сложно сделана обработка времени. У ESP есть родной функционал.
Установить системное время с NTP сервера: configTime(gmtOffset_sec, daylightOffset_sec, ntpServer)
Получить время в структуру tm: getLocalTime(&timeinfo), она же проверяет инициализированность системного времени
Из tm в юникс формат (time_t): unixTime = mktime(&timeinfo), юникс формат (или таймштамп) - количество секунд прошедшие с 1.01.1970
Из юникс формата в tm: timeInfo=localtime(&unixTime);
Установить системное время вручную :
timeval tv = { unixTime, 0 };
timezone tz = { 0, 0 };
settimeofday(&tv, &tz);
Такой подход позволит легко инициализировать системное время ESP с внешних RTC или других источников времени. Сначала в юникс таймштамп, потом в систему. Две строчки и все.
Тогда если позволите еще один прием, который позволит сохранить показания системного времени при перегрузке ESP.
RTC_DATA_ATTR time_t storeTime; // буфер хранения времени, для восстановления при перезагрузке
// перезгрузка ESPшки
void restart(){
tm timeinfo;
if(getLocalTime(&timeinfo)){
storeTime = mktime(&timeinfo);// сохраняем время в памяти RTC ESP32
} else {
storeTime=0;
}
ESP.restart();
}
// при загрузке
void onLoad(){
if(esp_sleep_get_wakeup_cause()){//если проснулись не по хардовому ресету
timeval tv = {storeTime+(millis()/1000)+1, 0 }; // установить системное время, секунда на перезагрузку
timezone tz = { 0, 0 };
settimeofday(&tv, &tz);
}
}
На самом деле, лучше сохранять системное время раз в секунду, тогда при сработке ватчдога призависании и перезагрузке, время все равно восстановится, да с потерей точности, но в таймере секунды не всегда важны.
О, это тоже интересная фича, если на ESP8266 работает - воспользуюсь, спасибо.
Да, забыл упомянуть, что возможно на 8266 работать не будет. Но , помоему, там так же есть RTC , в котором и память есть. И причину перезагрузки так же можно узнать.
При неудачной попытке подключиться к Wi-Fi таймер перезагружается в режим точки доступа, затем десять минут ожидает к себе подключения, затем перезагружается в режим станции, пытается подключиться к Wi-Fi, при неудачной попытке перезагружается... и так по кругу. Так и задумано.
Я слегка усовершенствовал журналирование и выложил свежий скетч на https://github.com/Araris/VersatileTimer , обновитесь при возможности - логи стали более информативны.
Отличный таймер, есть практически всё необходимое.
Но так как в программировании микроконтроллеров дальше мигалок светодиодами я не продвинулся ещё, то не могу прикрутить один, как мне кажется, нужный функционал: ВКЛ/ВЫКЛ до следующего задания по физической кнопке.
Интуитивно понимаю, что добавить нужно буквально пару строк, но куда и что не понимаю. Поможете?
Karas1que, простите великодушно, но нет, не помогу. Начиная писать таймер, я поставил себе жесткое ограничение : никакой периферии, кроме реле, и твердо его придерживаюсь. Все исходники выложены "как есть", любой желающий может использовать их как угодно и где угодно, сожалею, что Ваш уровень пока что не позволяет это сделать.
Да ничего существенного, на Гите (в issues) добрый человек нашел мелкий баг "при первом включении через точку доступа (192,168,4,1) , я в настройках выбираю свою сеть, ввожу пароль. ниже два переключателя, автоматитически получать IP , я выбираю данный пункт и при сохранении выходит ошибка, что поля ниже не заполонены (это шлюз, маска, IP)", я и пофиксил.
Здравствуйте, big_alex, нет, не планирую, увы. Причину я изложил выше : "Начиная писать таймер, я поставил себе жесткое ограничение : никакой периферии, кроме реле, и твердо его придерживаюсь. Все исходники выложены "как есть", любой желающий может использовать их как угодно и где угодно".
Попробовал скомпилировать последнюю версию с Гитхаба:
Arduino: 1.8.18 (Windows 10), Плата:"Generic ESP8266 Module, 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200"
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounterC2Ejjb':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:5: multiple definition of `_ZN17EEPROMRingCounterC2Ejjb'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:5: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounterC2Ejjb':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:5: multiple definition of `_ZN17EEPROMRingCounterC1Ejjb'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:5: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter9readValueEj':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:15: multiple definition of `_ZN17EEPROMRingCounter9readValueEj'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:15: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter10writeValueEjm':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:24: multiple definition of `_ZN17EEPROMRingCounter10writeValueEjm'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:24: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter4initEv':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:33: multiple definition of `_ZN17EEPROMRingCounter4initEv'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:33: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter3getEv':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:62: multiple definition of `_ZN17EEPROMRingCounter3getEv'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:62: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter3setEm':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:76: multiple definition of `_ZN17EEPROMRingCounter3setEm'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:76: first defined here
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\EEPROMRingCounter\EEPROMRingCounter.cpp.o: in function `_ZN17EEPROMRingCounter5clearEv':
C:\Users\user\Documents\Arduino\libraries\EEPROMRingCounter/EEPROMRingCounter.cpp:124: multiple definition of `_ZN17EEPROMRingCounter5clearEv'; sketch\EEPROMRingCounter.cpp.o:D:\Projects\Таймер-Нагорнский\Удаленное управление\Универсальный таймер\24-04-2023\VersatileTimer-main\AVVersatileTimer/EEPROMRingCounter.cpp:124: first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.
Arduino IDE 1.8.18, esp boards 3.0.2
Библиотека EEPROMRingCounter - та, что в комплекте и исходником (с Гитхаба)
Какой-то косяк с ней.
Скомпилировал предыдущую версию исходника - без ошибок.
Привет пытаюсь компелировать и не проходит выдает ошибку
закомментировать строку 21 (#include "Secrets.h") , разкомментировать 18 и 19 , вписать имя WIFI и пароль
подставляю свои данные
и не чего
Тогда создай в папке со скотчем файл secrets.h и вставь туда эти 2 строки
спасибо,
получилось посмотрим заработает или нет
vema, в начале скетча есть комментарий
Здравствуйте Araris.
Делаю для себя систему умного дома. Есть центральный контроллер на базе ESP8266, который собирает посредством UDP информацию от различных датчиков и отдаёт в MQTT, а также принимает из MQTT управляющие данные и отдаёт через UDP датчикам.
Для управления устройствами я использовал Smartrele Tuya с перепайкой их контроллера на ESP8285. За основу взял Ваш код таймера, добавил в него управление каналом(реле) по UDP, то есть состояние канала отправляется по UDP на центральный контроллер, и обратно - по команде с центрального контроллера меняется состояние канала. Естественно локальное управление через WEB тоже работает, что для меня важно. Но я не разбираюсь в WEB интерфейсах, и потому хочу спросить как сделать, чтобы при изменении состояния канала по UDP изменялось состояние кнопки c "Turn ON" на "Set OFF" и обратно в WEB интерфейсе?
Здравствуйте, mistert83
Я тоже не разбираюсь в WEB-интерфейсах, поэтому у меня браузеру просто отдаётся статическая HTML-страница и всё, что я могу делать при таком подходе - это рефрешить (<META http-equiv='refresh' content='0;URL=....) страницу полностью при изменениях содержимого.
Здравствуйте Araris!
Заметил обновление AVVersatileTimer.ino на Гитхабе.
А что за изменения?
Здравствуйте, vladimirk68
Поднял повыше проверку daylight saving, вот и все изменения ))) :
Спасибо, понятно!
Спасибо на добром слове, у меня пропуски заданий однажды начались после активных игр с настройками, зачистил флеш - заработало как надо, причину так и не нашел. Поставлю-ка тестовую ЕСП с десятком-другим заданий, понаблюдаю.
Нужно смотреть что формирует HHTPсервер в заголовках
должно быть Cache-Control: no-cache особенно в тех файлах в которых есть изменяющиеся данные.
Не знаю как насчет ESP это сделать , но в своем HHTPсервере на pic32 всегда управляю кешированием и другими параметрами.
Был у меня случай, когда точное время необходимо, Интернета в месте расположения нет, GSM модуль ставить не хочется.
Время можно синхронизировать с временем компа(или мобильного девайса) при заходе на веб интерфейс.
В автономном режиме работаем по DS3231 (I2C) . Они достаточно точно тикают
3000 строк в одном файле, это конечно.. Среда ардуино позволяет дробить код на файлы, или надо все в отдельном файле?
Функционал навороченный, все состояния в глобальных переменнных. Нужны нетривиальные усилия чтобы это все отладить и работало. О развитии речи не идет.
А зачем так сложно сделана обработка времени. У ESP есть родной функционал.
Установить системное время с NTP сервера: configTime(gmtOffset_sec, daylightOffset_sec, ntpServer)
Получить время в структуру tm: getLocalTime(&timeinfo), она же проверяет инициализированность системного времени
Из tm в юникс формат (time_t): unixTime = mktime(&timeinfo), юникс формат (или таймштамп) - количество секунд прошедшие с 1.01.1970
Благодарю, не знал про такой функционал, так действительно проще, попробую на досуге.
Тогда если позволите еще один прием, который позволит сохранить показания системного времени при перегрузке ESP.
На самом деле, лучше сохранять системное время раз в секунду, тогда при сработке ватчдога призависании и перезагрузке, время все равно восстановится, да с потерей точности, но в таймере секунды не всегда важны.
О, это тоже интересная фича, если на ESP8266 работает - воспользуюсь, спасибо.
О, это тоже интересная фича, если на ESP8266 работает - воспользуюсь, спасибо.
Да, забыл упомянуть, что возможно на 8266 работать не будет. Но , помоему, там так же есть RTC , в котором и память есть. И причину перезагрузки так же можно узнать.
Собрал в железе, работает, уже в корпусе. Будет работать в теплице на полив. Жду начала сезона.
Готов потестировать новые варианты программы.
Собрал в железе.
Добрый день!
бинарником не поделитесь? а, то компилится что то не хочет..
Igor_116 - адрес, куда послать файл?
Для разных плат разные бинарники, имейте в виду.
У меня скетч Araris без переделки работает с голой ESP-12, 6 каналов, GPIO 2, 4, 5, 12, 13, 14.
vladimirk68 - Спасибо!
igonin1969собакаgmail.com
Обновил скетч на Гитхабе. Принципиальных изменений нет.
1. Избавился от внешней библиотеки NTPClient.h, по совету уважаемого brokly работу с точным временем перевёл на родной функционал ESP.
2. Добавил использование RTC памяти и функции ESP.getResetInfoPtr() для мелких фич, просто интересно было разобраться, ещё один респект коллеге.
3. Некоторые незначительные изменения интерфейса.
Обновил по воздуху. Я дома, девайс - на даче.
Исчезла ошибка:
Ошибка NTP синхронизации времени
Все настройки сохранились.
Спасибо Автору и brokly!
Не исчезла ошибка...
Всего файловых блоков: 125 Занято блоков: 9 Доступно блоков: 116 Файлов с настройками: 2 Файлов журналов: 3
Найдены журналы на даты: 09.05.2022 - 11.05.2022
Отвалился Интернет, девайс завис в 03.52.09.
В журнале повтор сообщений с 1 по 158.
Приехал, починил Интернет, перезапустил девайс, работает.
Записи с 164 по 145 из 164
Спасибо, интересный лог, есть мысль, что девайс не мог подключиться к Wi-Fi, попробую воспроизвести у себя.
Посмотрел, да, возможно так и было.
При неудачной попытке подключиться к Wi-Fi таймер перезагружается в режим точки доступа, затем десять минут ожидает к себе подключения, затем перезагружается в режим станции, пытается подключиться к Wi-Fi, при неудачной попытке перезагружается... и так по кругу. Так и задумано.
Я слегка усовершенствовал журналирование и выложил свежий скетч на https://github.com/Araris/VersatileTimer , обновитесь при возможности - логи стали более информативны.
Araris, спасибо!
Забыл добавить - во время "висения" был включен 1 канал, и постоянно шел полив...
Прошивку обновил, буду наблюдать.
За ночь вот:
Записи с 24 по 5 из 24
С этим вряд ли помогу, причину я искал бы в качестве питания, контактах, помехах, наводках и проч.
Кстати, спасибо, заметил неучтённое летнее время между RTCMEM и NTP, поправлю.
UPD 14:12 Поправил.
Лог за ночь:
Отличный таймер, есть практически всё необходимое.
Но так как в программировании микроконтроллеров дальше мигалок светодиодами я не продвинулся ещё, то не могу прикрутить один, как мне кажется, нужный функционал: ВКЛ/ВЫКЛ до следующего задания по физической кнопке.
Интуитивно понимаю, что добавить нужно буквально пару строк, но куда и что не понимаю. Поможете?
Karas1que, простите великодушно, но нет, не помогу. Начиная писать таймер, я поставил себе жесткое ограничение : никакой периферии, кроме реле, и твердо его придерживаюсь. Все исходники выложены "как есть", любой желающий может использовать их как угодно и где угодно, сожалею, что Ваш уровень пока что не позволяет это сделать.
Araris, вижу обновление. А что изменилось?
Да ничего существенного, на Гите (в issues) добрый человек нашел мелкий баг "при первом включении через точку доступа (192,168,4,1) , я в настройках выбираю свою сеть, ввожу пароль. ниже два переключателя, автоматитически получать IP , я выбираю данный пункт и при сохранении выходит ошибка, что поля ниже не заполонены (это шлюз, маска, IP)", я и пофиксил.
Понятно, спасибо!
Девайс работает.
Здравствуйте!
Araris, не планируете ли добавить к таймеру GPS, для вариантов где интернета нет?
Здравствуйте, big_alex, нет, не планирую, увы. Причину я изложил выше : "Начиная писать таймер, я поставил себе жесткое ограничение : никакой периферии, кроме реле, и твердо его придерживаюсь. Все исходники выложены "как есть", любой желающий может использовать их как угодно и где угодно".
локально тогда уж лучше часы на DS3231 добавить
Почему то не пошло с динамическим назначением адреса. Просто вис веб интерфейс и всё.
со статикой всё заработало отлично!
Странно это, я изначально использую DHCP на всех таймерах, на роутере выставляя адрес как static, чтобы не изменялся.
Выложил обновление на Гитхаб.
Добавлено :
Попробовал скомпилировать последнюю версию с Гитхаба:
Разобрался.
В папке с AVVersatileTimer.ino должен быть только файл Secrets.h и больше ничего.
А я второпях свалил весь архив с Гитхаба в одну папку.
Компилируется без ошибокю
Arduino IDE 2.1.0, esp boards 3.1.2 тоже компилируется.
Уже залил последнюю версию по воздуху, скоро включу полив в теплице по этому таймеру.
Прошлый сезон прекрасно отработал.
Автору спасибо!!!
Аналогично с таким столкнулся
Доброго времени суток, при компиляции Arduino IDE выдает такую ошибку: 'AP_SSID' was not declared in this scope.
В стоках 2414, 2415 ( AP_name = AP_SSID; AP_pass = AP_PASS;) что необходимо указать подскажите пожалуйста. Я в программировании несилен.
версия Arduino IDE 1.8.9 Boards 3.0.2
Заранее спасибо!