ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. SergeiL

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

    Да нет там багов.
    Работают штук восемь ESP, уже более полутора лет, без единого рестарта или зависания. ;)
     
  2. ИгорьК

    ИгорьК Гуру

    Там действительно все устойчиво работает. Но начало позже :) Поэтому и подсел на Lua.

    У Lua NodeMCU как раз не все в порядке. Бывают иногда странные "провалы в памяти". За удобство приходится платить :)
     
    Последнее редактирование: 21 авг 2018
  3. Mitrandir

    Mitrandir Гуру

    Как-нибудь можно снять галку автоматического запуска фаила после загрузки?
     

    Вложения:

  4. ИгорьК

    ИгорьК Гуру

    С ней не понятно. На одном компе она есть, на другом нет.
     
  5. Mitrandir

    Mitrandir Гуру

    может от версии зависит?
    у меня v0.2.0-rc5
     
  6. ИгорьК

    ИгорьК Гуру

    Может быть. ESPlorer с обновлениями винды стал очень проблемным.
     
  7. ИгорьК

    ИгорьК Гуру

    Mitrandir нравится это.
  8. Securbond

    Securbond Гуру

    Игорь подскажите... В начале темы Вы проверяли подключение к WiFi перед публикацией в брокер, но начиная со страницы 14 темы, где вы описываете скелет программы, я эту проверку не обнаружил. Нужно ли добавлять эту функцию в скелет программы или и так все прекрасно работает ?
     
  9. ИгорьК

    ИгорьК Гуру

    Там должна идти проверка фага dat.broker.
    Флаг сбрасывается в объекте mqtt по событию on("offline") и устанавливается по событию on( "connect").
    В целом, этого достаточно. Но в теле программы можно проверить и wifi, прежде чем вызывать попытку публикации. Не исключен вариант, когда wifi отвалился, модуль mqtt еще не успел установить флаг, а в этот момент происходит попытка публикации. Кончится это, скорее всего, просто утечкой памяти, если не включен костыль.
    То есть, проверишь - хуже не будет.
     
    Securbond нравится это.
  10. Securbond

    Securbond Гуру

    Игорь, подскажите... значение данных с датчика температуры накапливается в таблице, что видно из вывода в COM,
    tempDS.JPG

    на мой взгляд это не правильно, ведь если датчик один, то и значение в таблице temp = {} должны обновляться, а не накапливаться .....

    код на всякий случай ... (Ваш код :))
    Код (Java):
    do
    temp = {}    -- склад температуры
    pin = 4        -- нога датчиков
    del = 750    -- задержка чтения температуры

    -- callback функция обработки значений
    function myWork()
        -- нашли датчиков:
        print("Got DS18b20: "..#temp)
        -- значения датчиков
        table.foreach(temp, print)
        -- kill'em all:
        ds = nil
        package.loaded["ds18b20m"]=nil
        topub.temDS = temp[1]
        dofile('
    pubnow.lua')

       
    --[[
        Здесь можно вызывать функции, которые обеспечат
        дальнейшую обработку значений датчиков.

        Модуль датчиков выгружен,
        а значения остались в таблице temp.
    -]]

    end

    ds = require('
    ds18b20m')
    -- Запрос температуры с передачей
    -- таблицы, callback функции, номера пина
    -- и времени задержки
    ds.getTemp(temp, myWork, pin, del )


        -- Или создать таймер и читать температуру:
    tmr.create():alarm(20000, 1, function()
        ds = require('
    ds18b20m')
        ds.getTemp(temp, myWork, pin, del )
    end)

    end
     
  11. ИгорьК

    ИгорьК Гуру

    Все зависит от задачи.
    Накапливаться не должны - при отправке на брокер они изымаются.
     
  12. ИгорьК

    ИгорьК Гуру

    Кстати, тема эта - "азы программирования", а не "готовые проекты". То что возникают вопросы и по сути - это есть то что нужно.
     
  13. Securbond

    Securbond Гуру

    Уже приходит понимание работы с таблицами.. Постараюсь понять куда и какую строку добавить, что бы чистить таблицу после передачи значений в основное тело программы. (Всётаки сейчас они копятся в таблице temp = {} и каждые 20 секунд функция пишет, что нашла на один датчик больше :confused:
     
  14. ИгорьК

    ИгорьК Гуру

    temp = {} - и таблица чистая.

    Там в модуле датчика наверняка закомментированы другие способы формирования выходной таблицы.
     
  15. Securbond

    Securbond Гуру

    Вроде победил..
    1. table.insert(topub, {'tempDS', temp[1]}) -- Добавил добавление температуры в таблицу
    2. temp = {} --Добавил в pubnow.lua, после отправки данных на брокер, для обнуления таблицы данных.

    Не уверен что все это правильно. но на данном этапе работает. :)
     
  16. ИгорьК

    ИгорьК Гуру


    Вот здесь: https://igorkandaurov.com/2017/08/16/esp-8266-отправка-многих-данных-на-брокер-mqtt/
     
    Securbond нравится это.
  17. ИгорьК

    ИгорьК Гуру

  18. ИгорьК

    ИгорьК Гуру

    Или не очищать до определенного предела, если эти данные зачем-то нужны. Сделай проверку на количество записей #temp.
     
  19. ИгорьК

    ИгорьК Гуру

    Там в чем смысл. Если в таблицу пишут разные части нелинейной большой программы то начинаются затыки.

    Логика в том, что все что может и должно - кидает записи в таблицу, а одна часть, забирает(путем удаления) и публикует.
    Публикация прекращается когда все вычищено и записей в таблице нет.

    Например, есть странное устройство - датчик температуры/влажности etc. плюс сигнализация.

    Идет публикация многих данных и в этот момент срабатывает сигнализация.

    Асинхрон просто кидает соответствующую запись в таблицу и проверяет флаг публикации. Если сейчас идет публикация - информация будет доставлена. Если нет - вызывается публикация.

    Просто и коротко.
     
    Последнее редактирование: 2 сен 2018
  20. ИгорьК

    ИгорьК Гуру

    Наиболее важно это в устройстве управления освещением, в частности nooLite.
    Одновременно может быть включено несколько выключателей и там же прийти какая-то команда от брокера.
    Плюс в этот момент, например, идет медленное включение света будильником.
    Вся эта бодяга одновременно вызывает лавину публикации на брокер.

    Разгребается просто - каждый элемент (все асинхронно) кидает в таблицу свои данные а поток публикации все вычишает.

    Надеюсь разъяснил странную логику накопления данных в таблице от одного датчика :)
    Просто прикинь, как справиться с одновременными попытками публикации как-то по-другому.