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.
    Одновременно может быть включено несколько выключателей и там же прийти какая-то команда от брокера.
    Плюс в этот момент, например, идет медленное включение света будильником.
    Вся эта бодяга одновременно вызывает лавину публикации на брокер.

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

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