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

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

  1. ИгорьК

    ИгорьК Гуру

    Первый пост читали?
     
  2. Neu

    Neu Нерд

    Ага. Только там ни слова о том, как слезть с Ардуино ИДЭ
     
  3. ИгорьК

    ИгорьК Гуру

    Что написано в шаге 1?
     
    Neu нравится это.
  4. Neu

    Neu Нерд

    Оппа... Прошу извинений, ткнул ссылку, прочитал... а на занятие 2 и не обратил внимание :). Все, спасибо! Изучаю...
     
  5. ИгорьК

    ИгорьК Гуру

    Там три занятия.
     
  6. Neu

    Neu Нерд

    Отлично.
    При беглом осмотре не увидел ответа на вопрос: а можно ли откатиться обратно на совместимую с Ардуино прошивку? И, попутно, среди поддерживаемых прошивкой модулей не нашел nRF24. Значит ли
    это, что nRF'ка не будет работать в этом случае (хотя SPI при этом есть...)?
     
  7. ИгорьК

    ИгорьК Гуру

    Ардуино Иде каждый раз перепрошивает плату полностью, насколько я знаю. Поэтому и "откат" как явление отсутствует.
    Могу ошибаться - не пробовал. Уточните у кого-нибудь еще.
    С NRF модуль не работает: библиотеки не встречал.
    Понимаете, ESP-8266 не является контроллером общего назначения. Он предназначен для определенного круга задач.
     
  8. Neu

    Neu Нерд

    Т.е. нужно будет просто заново прошить ардуиновской прошивкой?
    Жаль. Но если в NodeMCU есть SPI, значит теоретическая возможность обращаться напрямую к регистрам nRF все же есть? Или вообще никак?
    Уточните, плиз, что вы имеете ввиду под этой фразой?
     
  9. ИгорьК

    ИгорьК Гуру

    Полагаю так.

    Теоретическая есть. Но я не встречал. Да и не искал, честно говоря.
    Применяю НС-12 для связи.
    Проще говоря - у него ограниченное количество ног.
     
  10. Neu

    Neu Нерд

    Так ведь и его нет в списке поддерживаемых модулей... Или вы самостоятельно их подружили?
    Это да. Я планирую использовать WeMOS как беспроводной ретранслятор: от контроллеров на радиоканале - в tcp/ip. По-моему, вполне по фэн-шую ЕСПшному задача :).
     
  11. ИгорьК

    ИгорьК Гуру

    НС-12 работает по uart элементарными командами.
     
  12. ИгорьК

    ИгорьК Гуру

    С NRF Вы его вряд ли подождите. NRF сам по себе строптивый модуль. Если с ним связываться, то надо покупать только в брендовых магазинах.
     
  13. ИгорьК

    ИгорьК Гуру

    Callback - это просто.

    Вот код.
    callback.lua :
    Код (Lua):
    do
    function callbk(data)
        print("Now Start Callback Function!")
        print(string.format("%.02f", data))
    end

    function getrand(call)
        local sum = 0
        for i = 1, 5000 do
            sum = sum + math.random()
            --print(sum)
        end
        if call then call(sum)end
    end

    getrand(callbk)
    end
    Вот пояснения:
    callback03.png


    Вот еще пример:

    upload_2018-4-16_15-15-29.png

    =========================================================

    Для закрепления материала напишем собственную библиотеку работы с датчиком DS18b20. Оригинал библиотеки от NodeMCU - здесь.

    Замечу, что библиотека от NodeMCU обновлена 5 месяцев назад, и очень специфическим образом. Раньше она представляла собой чрезвычайно линейное явление в стиле Си. Ее (старую, непринципиально исправленную мной) можно увидеть в этом посте.

    Но время идет - callback рулит, и мы сами поймем и напишем библиотеку.
    (Давно не смотрел эту библу у NodeMCU. ИМХО, тот кто ее делал, похоже, обкурился нипадцеки. )

    Вспомним, что при работе с датчиком следует делать ряд вещей:
    1. инициализировать шину и получить адреса датчиков (достаточно одного раза);
    2. сделать запрос температуры;
    3. подождать некоторое время: от 50 до 750 мс;
    4. считать температуру из ячеек датчика.
    Таким образом нам нужно несколько самостоятельных функций, которые обеспечат эту работу.

    Вот ссылка на файл библиотеки. Предлагаю загрузить его, а потом рассматривать с участием картинок-пояснений.

    callback04.png

    Начинаем разбираться - как принимается запрос температуры:
    callback051.png

    Как работает функция опроса адресов:
    callback06.png

    Как работает функция запроса температуры. Она же включает таймер и через него вызывает функцию обработки результатов:

    callback07.png

    Ну и, в заключение, как работает функция чтения температуры:

    callback08.png

    А вот как это все применяется:

    Код (Lua):
    do
    temp = {}
    pin = 4
    del = 750

    function myWork()
        print("Got DS18b20: "..#temp)
        table.foreach(temp, print)
        ds = nil
        package.loaded["ds18b20m"]=nil
    end

    ds = require('ds18b20m')
    ds.getTemp(temp, myWork, pin, del )

    end
    С пояснениями:

    Код (Lua):
    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
    --[[
        Здесь можно вызывать функции, которые обеспечат
        дальнейшую обработку значений датчиков.

        Модуль датчиков выгружен,
        а значения остались в таблице 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

    Подведем итог по callback.

    В первом примере достаточно просто объясняется что это такое, однако практическая польза не очевидна - вызов функции форматирования и печати результата можно было бы сделать и напрямую из функции добычии рандомных значений.
    Однако здесь хорошо видно как просто вызывается callback.

    В примере с модулем опроса датчика температуры, на мой взгляд, становится ясна суть callback - мы можем по-разному обрабатывать результат асинхронной функции.
    Модуль всегда один и "тормознутый" по сути явления - способы реакции на его вызов - любые.

    Идем Дальше.
     
    Последнее редактирование: 16 апр 2018
    Ujine нравится это.
  14. Neu

    Neu Нерд

    Немного офтопика:
    Игорь, подскажите, вы как спец успевший с обеими модулями (nRF24L01 и HC-12) поработать можете какие-то ключевые их достоинства/недостатки отметить, исходя из практики, а не из тех. хар-к?
     
  15. ИгорьК

    ИгорьК Гуру

    Ответ, навскидку, долго не думая.
    HC-12:
    + по uart; просто; работает из коробки без плясок; большая дальность
    - 433 МГц - зашумленный; нет шифрования

    NRF:
    + есть шифрование
    - SPI; 80 - 85% - левак, партии между собой, обычно, не ладят; требователен по питанию
     
    Последнее редактирование: 11 авг 2017
    Neu нравится это.
  16. Neu

    Neu Нерд

    Я так понял, что HC-12 - это, грубо говоря, полный аналог полудуплексной рации: на одном канале один передает - все слушают. А nRF24 на одном канале может "1 к 6", благодаря "трубам". Только вот никак не могу четко уловить преимущество этих труб...
    Например, какая будет разница между вариантами, в случае, если требуется звезда "1 к 12"?
    Для HC-12 получается способов два: 1.1. каждый сидит на своем канале, центр звезды обходит каналы с опросом; 1.2. все сидят на одном канале, сессии приема-передачи каким-либо образом синхронизируются. Для nRF24 тоже вроде как два способа: 2.1. аналогично каждому - свой канал (1 канал - 1 труба); 2.2. всего два канала, по 6 труб в каждом.
    Будет ли преимущество у 2.2 перед 2.1 и если да, в чем оно проявиться? Немного потыкав nRF24 могу предположить, что как минимум - меньшее время реагирования, т.к. чтобы канал переключить надо будет переинициализировать модуль.
    И будет ли преимущество у 2.2 над обоими способами HC-12?
     
  17. ИгорьК

    ИгорьК Гуру

    Ну Вы назадавали... Лучше/хуже, преимущества/недостатки - понятие всегда относительное, и зависит от того что надо сделать в итоге, в т.ч. и от умения писать код.
    Обоими модулями можно решить аналогичные задачи. Принципиальное ограничение одно - HC-12 дальнобойнее. Но даже здесь - бывают дальнобойные NRF.
     
  18. Neu

    Neu Нерд

    Игорь, спасибо
     
  19. DetSimen

    DetSimen Guest

    а зато в С вот так можно строки копировать (и стрелять себе в ногу)

    char *strcopy(char *src, char *dest)
    {
    while (*dest++ = *src++) ;
    return dest;
    }

    За лаконичность он и нраица.
     
  20. ИгорьК

    ИгорьК Гуру

    Не понять нам, простым смертым, красоту вышеизложенного. Потому как сие действо в Луа решается :
    Код (Lua):
    strb = stra
    И проверяется:
    Код (Lua):
    do
    local stra = "abcde"
    local strb = a
    print(stra, strb)
    stra = "edcba"
    print(stra, strb)
    end
    Ни красоты ни ни шарма...:(
     
    Ujine нравится это.