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

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

  1. nkYellOw

    nkYellOw Нерд

    Я плачу уже. Остановись. Азы программирования на платформе nodemcu

    Там только быдлокод проверяется, можете ссылку себе сохранить. У меня для этого среда разработки есть
     
    Последнее редактирование: 26 ноя 2018
  2. ИгорьК

    ИгорьК Гуру

    А ведь не зря я эту тему создал и ловил помои ушатами :)

    Сей пост свидетельствует о ...
     
  3. parovoZZ

    parovoZZ Гуру

    а я как-то по-другому написал?
     
  4. parovoZZ

    parovoZZ Гуру

    ну?
     
  5. ИгорьК

    ИгорьК Гуру

    О том что вы в теме. Мало кому запросто так от нечего делать придет в голову находить этот инструмент.
    А помнится, вы во-всю критиковали скриптовые языки на мк и приводили всякие аргументы против.
     
  6. parovoZZ

    parovoZZ Гуру

    Я в теме, да не в теме. Так, от безделья зашел.
    надо все же до конца читать мои посты. Для embedded программирования я против.
     
  7. ИгорьК

    ИгорьК Гуру

    И я против. А для дома - в самый раз.
     
  8. ИгорьК

    ИгорьК Гуру

    35. Редактирование кода на устройстве.
    Живительный источник: https://github.com/joysfera/nodemcu-web-ide
    Забираем отсюда файл и называем ide.lua . Запускаем на выполнение. Все. Теперь заходим по адресу модуля и наслаждаемся созданием, редактированием и даже исполнением скриптов на нем.

    Вместе с тем, лучше окружить свою работу несколькими удобняшками, а именно.

    А). init.lua:
    Код (Lua):
    local runfile = "setglobals.lua"
    -- Читаем нулевую ячейку памяти часов и сравниваем с числом 501,
    -- число есть!
    if rtcmem.read32(0) == 501 then
        print("Start Server!")
        rtcmem.write32(0, 0)
        -- Запускаем webide
        dofile("ide.lua")
    else
        print("Try Run "..runfile)
        tmr.create():alarm(1000, 0, function()
            if runfile and file.exists(runfile) then
                dofile(runfile)
            -- Если нет самого стартового файла или просто ссылки на него,
            -- опять запускаем webide!
            elseif file.exists("ide.lua") then
                print("\nNo "..runfile.. "! Start IDE")
                dofile("ide.lua")
            end
        end)
    end
    init.lua проверяет две вещи:
    1. есть ли в ячейке памяти часов за номером 0 число 501, если есть - затирает его и запускает web ide.lua
    2. есть ли файл setglobals.lua, если нет, проверяет ide.lua и опять запускает его. Нет и этого - ничего не делает.
    Б) комплект из четырех файлов с общим началом mqtt... вместе с первой частью init.lua обеспечивает перезапуск ide на готовом устройстве по команде от брокера. Программа приостанавливает работу, публикует свой ip-адрес и перегружается в режиме web ide.

    mqttset.lua:
    Код (Lua):
    -- Это, обычно, устанавливается в setglobals.lua
    if not dat then dat = {} end
    if not dat.clnt then dat.clnt = 'newproject' end
    print('\nMQTT Client: '.. dat.clnt)
    --
    -- Объект соединения с брокером:
    m = mqtt.Client( dat.clnt, 60, dat.clnt, 'pass')
    -- Клиент сдох - отражается в топике "клиент/state"
    m:lwt(dat.clnt..'/state', "OFF", 0, 1)

    -- Если связь с брокером потеряна - делаем:
    m:on("offline", function(con)
        dat.broker = false
        dofile('mqttget.lua')
    end)
    -- На приход (обычно управляющего) сообщения от брокера:
    m:on("message", function(conn, topic, dt)
        -- Удаляем все лишнее в длинном топике
        topic = string.gsub(topic, dat.clnt..'/com/','' )
        print('Got broker:',topic, dt)
        -- Втыкаем пришедшее в таблицу вида {топик, данные}
        if not btbl then btbl = {} end
        btbl[#btbl+1] = {topic,dt}
        -- Анализируем пришедшее
        dofile('mqttanalise.lua')
    end)
    -- Все подготовили, за дело:
    dofile('mqttget.lua')
    mqttget.lua:
    Код (Lua):
    do
        -- Это, обычно, устанавливается в setglobals.lua
        if not dat.brok then dat.brok = 'iot.eclipse.org' end
        --
        -- Закрываем соединение, если оно есть
        if m then m:close()end

        -- Обязательно объявлять переменную заранее для рекурсии
        local conbr
        -- И срезу ее определять
        conbr = function(getmq)
            -- Есть wifi
            if wifi.sta.status() == 5 then
                -- Убиваем постоянный таймер
                tmr.stop(getmq)
                tmr.unregister(getmq)
                getmq = nil
                -- Вызываем соединение с брокером
                m:connect(dat.brok, 1883, 0, 0,
                -- Успех соединения
                function(con)
                    -- Флаг брокера
                    dat.broker = true
                    print("Connected to "..dat.brok)
                    -- Массовая подписка на командные топики
                    m:subscribe(dat.clnt..'/com/#',0)
                    -- Публикация о том, что жив и здоров
                    m:publish(dat.clnt..'/state', "ON", 0, 1)
                    -- Все сделано - бьемся апстену насмерть
                    conbr = nil
                end,
                -- Соединение не установилось:
                function(con, reason)
                    print('Fail mqtt! reason:', reason)
                    -- Самовызываемся на уровне файла
                    dofile('mqttget.lua')
                end)
            else
                -- Нет wifi - ждем
                print("Wating for WiFi")
            end
        end

        -- Таймер ожидания wifi и что делать с его появлением
        tmr.create():alarm(5000, 1, function(t)
            conbr(t)
        end)
    end
    mqttanalise.lua:
    Код (Lua):
    do
        local itm
        print('analise:', #btbl)
        if btbl and #btbl ~= 0 then
            while #btbl ~= 0 do
                itm = table.remove(btbl)
                table.foreach(btbl, print)
                -- Здесь определяем, что пора запускать ide
                if itm[1] == 'ide' and itm[2] == 'ON'then
                    -- Для запуска пишем в ячейку 0 число 501
                    -- это число читает файл init.lua и принимает решение о запуске ide
                    rtcmem.write32(0, 501)
                    -- в таблицу topob
                    if not topub then topub = {} end
                    -- вставляем ip-адрес устройства,
                    table.insert(topub, {'ip', wifi.sta.getip()})
                    -- вызываем публикацию,
                    dofile 'mqttpub.lua'
                    -- даем ей время 1,5 секунды и перезаргружаем устройство.
                    tmr.create():alarm(1500, 0, function() node.restart() end)
                end
            end
            brbl = nil
        end
    end
    mqttpub.lua:
    Код (Lua):
    do
        if not topub then topub = {} end
        local tp, punow
        table.insert(topub, {'heap', node.heap()})

        punow = function()
            if topub and #topub ~= 0 and wifi.sta.getip() and dat.broker then
                tp = table.remove(topub)
                tp[2] = tp[2] or ""
                tp[3] = tp[2] == "" and "1" or "0"
                m:publish(dat.clnt..'/'..tp[1], tp[2], 2, tp[3], punow)
            else
                print('Published!')
                tp, punow = nil, nil
            end
        end
        punow()
    end
    Файлы без комментариев - в приложении.
     

    Вложения:

    • AmperkaIDE.zip
      Размер файла:
      4,9 КБ
      Просмотров:
      450
    Последнее редактирование: 24 дек 2018
  9. ИгорьК

    ИгорьК Гуру

    Как же это работает?

    Идея заключается в том, что, при программной перезагрузке, в ESP-8266 бывают таким места, которые сохраняют ранее заложенную информацию.
    Прочитав ее при старте модуля, можно решить, как дальше его грузить.

    init.lua и занимается проверкой ячейки памяти "0" на наличие волшебного числа 501. Есть - грузит ide, нет - грузит то что задано.

    В прошивке обязательно должны присутствовать модули rtcmem и rtctime:

    upload_2018-12-24_14-47-8.png

    Ясный пень, начальные загрузки и настройки удобнее делать через ESPlorer.
    Затем устройство водружается на рабочее место и заступает на вахту.

    Когда вам надо допилить его сознание, запускаете MqttSpy и подписываетесь на устройство (на вашем брокере):

    upload_2018-12-24_14-25-3.png


    Увидели:

    upload_2018-12-24_14-26-51.png

    Даем команду на запуск IDE:

    upload_2018-12-24_14-28-8.png

    Ответ:

    upload_2018-12-24_14-30-23.png

    Заходим:

    upload_2018-12-24_14-31-11.png

    Сразу комментируем первую строку в файле init.lua и сохраняем его:

    upload_2018-12-24_14-33-19.png

    Теперь, что бы мы не делали со всеми остальными файлами, как бы что ни сбоило, до тех пор, пока не будет раскомментирована первая строка, устройство будет каждый раз запускать Lua IDE и вы будете продолжать редактировать на нем файлы.

    Как все закончено - раскомментируете первую строку init lua, сохраняете и перегружаете устройство через web интерфейс.

    На практике это решение можно увидеть в теме управления котлом а также в настройках подсветки кровати.

    Удачи!
     
    Последнее редактирование: 25 дек 2018
    alp69 нравится это.
  10. ИгорьК

    ИгорьК Гуру

    1.1. Как завести модуль в сеть.

    Прежде чем завести модуль в сеть, его над прошить прошивкой Lua!!! См. пункт 1.

    После чего:

    upload_2018-12-26_10-14-49.png

    upload_2018-12-26_10-19-1.png

    Пояснения:

    Код (Lua):
    do
        -- Режим - клиент
        wifi.setmode(wifi.STATION)
        -- Чистим конфиг после "экспериментов"
        wifi.sta.clearconfig()
        -- Установки - через таблицу, создаем ее
        local scfg = {}
        scfg.auto = true -- Связь восстанавливается сама
        scfg.save = true -- Настройки будут сохранены во флэш, после перезагрузки все заработает само
        scfg.ssid = 'Моя_Точка_Доступа' -- WiFi
        scfg.pwd = 'Мой_Пароль' -- Password
        wifi.sta.config(scfg) -- Конфигурируем установки wifi
        wifi.sta.connect() -- Пошло соединение
        -- Проверяем результат через 15 секунд, потому как иногда
        -- для новой настройки нужно много времени
        tmr.create():alarm(15000, tmr.ALARM_SINGLE, function() print('\n', wifi.sta.getip()) end)
    end
    Для работы:
    Код (Lua):
    do
        wifi.setmode(wifi.STATION)
        wifi.sta.clearconfig()
        local scfg = {}
        scfg.auto = true
        scfg.save = true
        scfg.ssid = 'Моя_Точка_Доступа' -- WiFi
        scfg.pwd = 'Мой_Пароль' -- Password
        wifi.sta.config(scfg)
        wifi.sta.connect()
        tmr.create():alarm(15000, tmr.ALARM_SINGLE, function() print('\n', wifi.sta.getip()) end)
    end
     
    Последнее редактирование: 28 янв 2019
    tpolimer и alp69 нравится это.
  11. olegkaras

    olegkaras Нуб

    Доброго времени. У вас есть пример управление симистором ? Нужно регулировать яркость лампы + передавать температуру с ds18d2.
    ESPLorer на XP будет работать ?
     
    Последнее редактирование: 12 янв 2019
  12. ИгорьК

    ИгорьК Гуру

    Есть Java - работать будет.

    Нет такого примера.
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Работает прекрасно.
     
  14. Securbond

    Securbond Гуру

    Тут в скрипте фигурирует переменная btbl, а в конце скрипта обнуляем brbl. Опечатка ? или осознанная проверка на внимательность :D
     
  15. ИгорьК

    ИгорьК Гуру

    Опечатка.
     
  16. olegkaras

    olegkaras Нуб

    Как запустить ESPLorer на хр ? У меня не получается.
     
  17. Securbond

    Securbond Гуру

    Возможно нужно сначала Java установить или обновить...
     
  18. olegkaras

    olegkaras Нуб

    Эта java ни в какую не устанавливается , и при попытке установить ни каких сообщений не выдает.
     
  19. Airbus

    Airbus Радиохулиган Модератор

    Windows XP Home .Ява 8 update 151.ESPlorer v0.2.0-rc6.И всё отлично работает
     
  20. Vladimir11

    Vladimir11 Нерд

    Запускал на XP SP3, для Java инсталятор jre-7u79-windows-i586