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

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

  1. AlsPro

    AlsPro Нерд

    Спасибо за развернутый ответ, но первых четырех может не быть! 5-й все равно не подключится! Даже если его подключать первым после прошивки esp32.
     
  2. alp69

    alp69 Форумчанин

    Возможно с 5-м проблемы по железу. Видел, что он цепляется к другим станциям...
    Попробуйте всех шестерых клиентов перепрошить одинаковой прошивкой и цеплять их в сеть с одинаковыми параметрами (режимами).
    Неплохо было бы выложить все данные по каждому клиенту при их поочередном подключении и опросу (ip, Mac, mode - это минимум). https://nodemcu.readthedocs.io/en/master/modules/wifi/#wifi-module
    P.S. поправил ссылку.
     
  3. alp69

    alp69 Форумчанин

    Покажите, какими командами подключаете клиентов
     
  4. AlsPro

    AlsPro Нерд

    Все 6 прошиты одинаковой прошивкой. Я вечером выложу кусочки кода, приду с работы домой.
     
  5. SImt11

    SImt11 Нуб

    Здравствуйте! Подскажите как данные wth.co2 из askMHZ19.lua передать в main.lua
    Пробовал присваивать глобальным переменным, не завелось. Через return то же не получилось.
     
  6. DCat

    DCat Нерд

    Коллеги еспишники помогите словом и делом )) Только начал изучение Lua и столкнулся вот с какой штукой. Делаю климатический датчик на Wemos D1 mini. Пока что подключил аналоговый датчик освещенности TEMT6000 и I2C температуру влажность HTU21D. Все это барахлишко будет гнать данные в домашний MQTT брокер. Саму программную часть решил реализовать двумя модулями один init.lua там все мясо и functionLib.lua туда все вспомогательные функции пойдут нужные для работы. При инициализации формируется таблица функций и глобальная таблица параметров и дальше уже с ними работаю. Вроде такая схема работает, но столкнулся с проблемой.
    При выполнении функции опроса сенсоров сначала измеряется освещенность, публикуется в mqtt и потом температура и следом публикуется в mqtt. Так вот при публикации публикуется только один параметр. Такое ощущение что первый успевший. Комментирую температуру, публикуется освещенность и наоборот хотя функция вызывается с разными параметрами.
    Есть у меня ощущение, что не хватает знаний матчасти и где-то накосячил ) Подскажите в какую сторону копать и изучать. Буду очень признателен за помощь.
    Вот код:
    init.lua
    Код (C++):
    - КОМНАТА
    -- конфигурация климатического датчика
    conf = {}
    conf.timeCall = 60 -- интервал опроса датчиков (секунды)
    --Wifi
    conf.wifissid = 'DCat_WiFi' -- имя WiFi сети
    conf.wifipwd = '123456' -- пароль WiFi сети
    --I2C
    conf.scl = 1 -- пин I2C scl
    conf.sda = 2 -- пин I2C sda
    --MQTT
    conf.mqttServerIP = '192.168.1.51' --адрес сервера MQTT
    conf.mqttServerPort = 1883 --порт сервера MQTT
    conf.mqttClientId = 'ClimatSensor_Room' --id клиента MQTT
    conf.mqttClientUser ='mqtt' --логин клиента MQTT
    conf.mqttClientPwd = '123456' --пароль клиента MQTT
    -- топики MQTT
    conf.topicTemperature = 'climat/temperature/room' --топик температуры
    conf.topicHumidity = 'climat/humidity/room' --топик влажности
    conf.topicLight = 'climat/light/room' --топик освещенности
    --ПИНЫ
    conf.analogPin = 0 --аналоговый пин

    --функция опроса сенсоров
    function callSensors()
        --измеряем освещенность и публикуем в MQTT
        liteValue = adc.read(0, 0)
        funcTab.publicMQTT(conf, conf.topicLight, liteValue)
        --измеряем температуру и публикуем в MQTT
        temperature = funcTab.htu21dTemprature(conf)
        funcTab.publicMQTT(conf, conf.topicTemperature, temperature)
    end

    do
        --получаем библиотеку функций funcTab
        require('functionLib')
        --подключаемся к WiFi сети
        funcTab.connectWiFi(conf)
        --запускаем таймер опроса датчиков
        tmr.create():alarm(15000, tmr.ALARM_AUTO, callSensors)
    end
    и functionLib.lua
    Код (C++):
    funcTab = {}

    -- функция подключения WiFi
    function funcTab.connectWiFi(conf)
        print('WiFi connect ...')
        wifi.setmode(wifi.STATION)  -- Режим - клиент
        wifi.sta.clearconfig()  
        local scfg = {} -- Установки - через таблицу, создаем ее
        scfg.auto = true -- Связь восстанавливается сама
        scfg.save = true -- Настройки будут сохранены во флэш, после перезагрузки все заработает само
        scfg.ssid = conf.wifissid -- WiFi
        scfg.pwd = conf.wifipwd -- 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

    --функция публикации в MQTT брокер
    function funcTab.publicMQTT (conf, topic, data)
       m = mqtt.Client(conf.mqttClientId, 120, conf.mqttClientUser, conf.mqttClientPwd)
        m:connect(conf.mqttServerIP, conf.mqttServerPort, 0, function(client)
        --print("MQTT connected")
        --публикуем инфу в топик  
        client:publish(topic, data, 0, 0, function(client) print("MQTT sent: " .. topic) end)
        end,
        --функция ошибки
        function(client, reason)
        print("failed reason: " .. reason)
        end)
        m:close();
    end

    --функция получения температуры с htu21d
    function funcTab.htu21dTemprature (conf)
        dev_addr = 0x40 -- адрес I2C htu21d (по даташиту)
        reg_addr = 0xF3 -- регистр температуры
        local id = 0
        i2c.setup(id, conf.sda, conf.scl, i2c.SLOW)
        i2c.start(id)
        i2c.address(id, dev_addr, i2c.TRANSMITTER)
        i2c.write(id, reg_addr)
        i2c.stop(id)
        tmr.delay(50000)
        i2c.start(id)
        i2c.address(id, dev_addr ,i2c.RECEIVER)
        tempData = i2c.read(id,3)
        i2c.stop(id)

        --переводим данные в цельсия
        local h, l
        h, l = string.byte(tempData, 1, 2, 3)
        raw = bit.bor(bit.lshift(h ,8),l)
        raw = bit.band(raw,0xFFFC)
        realTemp = -46.85+(172.72*raw/65535)
        return realTemp
    end

    return funcTab
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Чтобы предметно поговорить, подскажите, кроме Lua вы с чем-то работаете?
    Просто если это ваш лично написанный код - он отличный. Если это откуда-то переписано - дайте ссылку.

    Хотелось бы и услышать короткое объяснение, почему все написано именно так.

    Собственно, я практически мало с чем согласен здесь, но логика в коде видна и начинающие так не пишут, ИМХО.

    Пытаюсь понять, насколько глубоко надо говорить об этом коде.
     
    SergeiL нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Нет, я на пенсии. Хочу прихожу, хочу - нет. И больше никаких проектов.
     
  9. SergeiL

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

    По проектам, я - аналогично.
     
  10. alp69

    alp69 Форумчанин

    Если здесь писАть Вам - ответ можно будет ожидать? Или в личку? Или на мыло?
     
  11. alp69

    alp69 Форумчанин

    Обьявляете функцию m = mqtt.Client(conf.mqttClientId, 120, conf.mqttClientUser, conf.mqttClientPwd), а публикуете почему то client:рublish(topic, data, 0, 0, function(client) print("MQTT sent: " .. topic) end)
    Точка с запятой по-моему тут лишняя --> m:close();
     
    Последнее редактирование: 17 апр 2020
    DCat нравится это.
  12. ИгорьК

    ИгорьК Гуру

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

    ИгорьК Гуру

    Здесь все верно про client.
    Точка с запятой роли не играет - факультативный разделитель.

    В коде видна, с одной стороны, логика какого-то языка программирования (python?), но нет понимания принципа работы ESP-8266/ESP32. Поэтому асинхронные операции осуществляются без учёта успеха предыдущих.
    Да и в целом эта логика перегружает память нипадецки.
     
    DCat нравится это.
  14. alp69

    alp69 Форумчанин

    Щас пилю водосчетчик. За основу взял Ваш. Отловил одну из причин утечки памяти (не в Вашем коде).
    Если подписываться на топики mqtt по маске "/#", то память начинает течь довольно шустро.
     
  15. ИгорьК

    ИгорьК Гуру

    Не думаю. Дело, скорее, не в этом, а в обработке входящих событий.

    У меня все устройства подписаны с применением "#", утечки не замечаю.

    Кстати, последние прошивки работают очень стабильно, как мне видится.
     
    Последнее редактирование: 17 апр 2020
  16. alp69

    alp69 Форумчанин

    Вылавливал два дня методом исключения. Оно.
     
  17. ИгорьК

    ИгорьК Гуру

    Не знаю что сказать. Мой опыт с этим не соглашается категорически.
     
  18. ИгорьК

    ИгорьК Гуру

    Записи в регистре считаете, наряду с кучей?
     
  19. alp69

    alp69 Форумчанин

    Пока не дошел до этого уровня знаний. Просто метод исключения.
     
  20. ИгорьК

    ИгорьК Гуру

    Воткните куда-нибудь в периодическом вызове:
    Код (Lua):
    local count = 0
    for _ in ipairs(debug.getregistry()) do  count = count + 1 end
    print(count)