Arduino IDE, eps8266, mqtt

Тема в разделе "Глядите, что я сделал", создана пользователем Pavlo, 6 май 2017.

  1. Pavlo

    Pavlo Нуб

    Перешил Sonoff-touch, используя Arduino IDE.
    Брокер Москито поставил на Raspberry.
    Все красиво работает, включается и реконнектится.
    Но мой внутренний параноик не дает покоя: "а что если..."
    - потеря соединения с wifi или raspberry (даже краткосрочно), приводит к тому, что клиент пытается восстановить соединение и в этот момент выключатель света не реагирует (тобишь не рабоает).

    Я использую библиотеку <PubSubClient.h>.
    В инетах нашел, что у функции client.connect уходит под 6 секунд на попытку установить соединение (допустим mqtt-сервис офлайн)... там вроде бы в библиотеке жестко прописаны толи 20, толи даже 30 попыток с таймаутом в 150 миллисекунд на каждую...

    Может кто-то подсказать или другую библиотеку, или какой-то выход с данной ситуации?
     
    Последнее редактирование: 6 май 2017
  2. SergeiL

    SergeiL Оракул Модератор

    Да, есть такая особенность. Я тоже с этим столкнулся в своих модулях на ESP.

    Я перенес обработку выключателей, и все критичное к задержкам, в функцию вызываемую через Ticker. (посмотрите эту библиотеку)
    Тикер, настроен на вызов каждую миллисекунду. В тикере обрабатываю наличие полупериодов напряжения сети, для определения включен выключатель или нет, и соответственно, переключаю реле.

    В loop() осталось только отслеживание соединений по WiFi, mqtt, переподключения, и публикация состояния по mqtt на брокер.

    В таком варианте выключатели работают как обычные, без задержек.
     
    Последнее редактирование: 7 май 2017
    Pavlo нравится это.
  3. Pavlo

    Pavlo Нуб

    Спасибо огромное.
    Помогло.
     
  4. ИгорьК

    ИгорьК Гуру

    Не вздумайте работать с модулями на Lua: там нет такой проблемы по сути явления.

    Разве позволено правоверному сектанту-ардуиноIDE искать легкие пути!
     
  5. SergeiL

    SergeiL Оракул Модератор

    :)

    Ну, в NodeMcu, тоже ведь все не так уж идеально. :)
     
  6. ИгорьК

    ИгорьК Гуру

    Конечно! Верьте в это свято и не вздумайте проверить лично :)
     
  7. Pavlo

    Pavlo Нуб

    Перечитал несколько раз, пока врубился.
    ИгорьК, вы проповедуете советуете Lua для работы с модулями?

    Просто, само как-то так получилось, что скрипты в Ардуино-IDE мне (java-программеру) показались с ходу очень интуитивно понятными... и почему то даже в голову не пришло, что можно попробовать какой-то другой язык.

    Или я вас не правильно понял и вы вообще о другом?
     
  8. ИгорьК

    ИгорьК Гуру

    Правильно поняли.

    Я не проповедую, я программирую на Lua - 90% моих устройств IoT именно на нем.

    В отличие от Си, оно же Java, реализация Lua на ESP-8266 есть like node.js (JavaScript) - асинхронная и событийно ориентированная. Это за глаза хватает для большинства задач. А та проблема что в топике - просто невозможна как явление.
     
    Последнее редактирование: 11 май 2017
  9. SergeiL

    SergeiL Оракул Модератор

    Так проверял, лично! :)

    Мой пример – это не совсем правильный вариант “сектантства Ардуино IDE”.
    Столкнулся с ESP в 2015 - начинал разбираться с ESP под NodeMcu и LUA.

    С LUA, тогда столкнулся впервые, скачал книжку, разбирался на примерах…
    Нашел Вашу тему на этом форуме. Спасибо!!! Очень помогла!

    Все бы ничего, но бесили вечная нехватка памяти и непредсказуемые рестарты.
    Вроде и программа простая, и сутки нормально работает, а потом, после включения, раз и через 5 минут модуль сам перезагрузился… Ну не привык я к этому…

    Позже нашел возможность поддержки ESP8266 в ардуино IDE. Вот как раз тут, я и начал знакомится с Ардуино IDE :) (До этого использовал AVR-Studio, ICC-AVR)

    И оказалось, что ESP с прошивкой из под ардуино IDE ( как мне тогда показалось) работает более стабильно, чем под NodeMcu!!!

    До этого знал, что есть платформа Ардуино, есть модули, есть Си для Ардуино, но на практике не сталкивался. Как то не нужно было…

    С микроконтроллерами, начинал с 8048,8051, 52 потом PIC16F, AVR, Меги. Как хобби.
    Писал в основном на Си, меньше на асме. И ведь работало-то - абсолютно стабильно. Никаких рестартов, зависаний!

    Игорь, а как сейчас, с последними сборками NodeMcu?
    Модули все также, могут непроизвольно рестартовать?
     
    Последнее редактирование: 11 май 2017
  10. ИгорьК

    ИгорьК Гуру

    Вот поэтому у Вас и падал NodeMCU.
    Логика другая. Абсолютно. Когда ее вкуришь - ничего не падает.
    Я знаю (сталкивался) с единственным багом - реализация ssl не коннектится с Телеграмом. Но он известен в сообществе и когда нибудь ликвидируется.

    Больше не знаю что сказать.
     
    Последнее редактирование: 11 май 2017
  11. ИгорьК

    ИгорьК Гуру

    Это история из тех времен, когда сектанты Ардуино на километр боялись подходить к модулю. Ардуино IDE тогда не заваливалась - ее просто не было.

    Глядя сейчас на код Lua и имея некоторый опыт легко можно понять, что это пишет Си(шник), немедленно убивает память и делает лишние движения.
     
  12. alp69

    alp69 Форумчанин

    Поддержу Игоря. Произвольные рестарты происходят не по вине модуля или прошивки. Как правило причина кроется в кривизне написания кода и/или отсутствия нужных для кода блоков прошивки.
    Но, при прочтении сообщений об ошибках, выдаваемых Esplorer'ом, суть неправильной работы кода быстро становится ясна.
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    Способ писать NodeMCU "как на Си" используя синтаксис Lua обречен.
    Но, сказать честно, я это до конца осознал довольно поздно - с выходом Iskra JS и попыткой разобраться что это за зверь.
    Просто литературы по JS много и разной. Есть хорошие книжки. Lua здесь есть JS но очень простой и без заумных наворотов.
    Взят асинхрон и событийный подход и откинуто все что можно убрать из JS без потери функциональности. Получился NodeMCU-Lua. Компактный и простой.