ESP8266/NodeMCU Lua

Тема в разделе "Arduino & Shields", создана пользователем Securbond, 26 мар 2016.

  1. Securbond

    Securbond Гуру

    5. Подключаем два датчика для погодной станции
    BME280 и BH1750

    IMG_4253.JPG IMG_4254.JPG


    Минимальные модули: i2c, bme280, file, gpio, net, node, tmr, uart, wifi

    1. Записываем в ESP сначала прошивку с модулями, затем файлик для работы с BH1750
    Код (Javascript):

    local M = {}
    M.GY_30_address = 0x23
    M.id = 0
    M.l = 0
    M.CMD = 0x10
    M.init = false

    function M.init(sda, scl)
        i2c.setup(M.id, sda, scl, i2c.SLOW)
        init = true
    end

    local function read_data(callback)
        i2c.start(M.id)
        i2c.address(M.id, M.GY_30_address, i2c.TRANSMITTER)
        i2c.write(M.id, M.CMD)
        i2c.stop(M.id)
        i2c.start(M.id)
        i2c.address(M.id, M.GY_30_address, i2c.RECEIVER)

        tmr.create():alarm(2000, 0, function(t)
            c = i2c.read(M.id, 2)
            i2c.stop(M.id)
            local UT = c:byte(1) * 256 + c:byte(2)
            M.l = (UT*1000/12)
            t = nil
            if callback then callback(M.l) end
        end)
    end

    function M.getlux(callthen)
        if (not M.init) then
            print("init() must be called before read.")
        else
            read_data(callthen)
        end
    end

    return M

     

    2. Пишем основной скрипт.
    Код (Javascript):

    sda = 1
    scl = 2
    ls = 0

        bh1750 = require("bh1750")
        bh1750.init(sda, scl)
        bme280.init(sda, scl)

      function printlux(l)
       ls = string.format("%.2f", l/100)
       print("Lux = "..ls.." lx")
      end
       
        tmr.alarm(0, 6000, 1, function()
        local H = string.format("%.1f", (bme280.humi()/1000))
        local P, T = bme280.baro()
        P = string.format("%.1f", (P/1000*0.75))
        T = string.format("%.2f", T/100)
          print("\nTemperatre = "..T.." C \nHumidity = "..H.." %, \nPressure = "
        ..P.." mm.Hg")
         
        bh1750.getlux(printlux)  
        -- print('Heap = '..node.heap())

      end)

     

    Запускаем скрипт получаем следующее:

    bme280.JPG


    UPD: Наблюдается нестабильная работа, модуль перезагружается :confused:
    UPD2: Добавил конденсатор по питанию, модуль стал стабильно работать без перезагрузок!

    UPD 11.08.2017: Ручками ИгорьК переписана библиотека для BH1750, убраны все задержки. конечный вариант прикрепил к записи.
     

    Вложения:

    Последнее редактирование: 11 авг 2017
    ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Наблюдайте за расходом памяти. Добавьте к каждому вызову таймера
    Код (Javascript):
    print('Heap = '..node.heap())
    и смотрите что происходит.
     
  3. Securbond

    Securbond Гуру

    Проверил. С памятью всё норм, проблема была с питанием.
     
    ИгорьК нравится это.
  4. vavandemidov

    vavandemidov Нуб

    Подскажите пожалуйста, как подключить ДВА датчика ВМЕ280 одновременно на один интерфейс? Адреса датчиков разные.
     
  5. Securbond

    Securbond Гуру

    Не пробовал. Думаю, что стоит задать этот вопрос автору модуля, возможно на его странице на гитхабе Вы найдёте ответ на свой вопрос. https://github.com/vsky279/BME280/blob/master/README.md
     
  6. Мих

    Мих Нуб

    Помогите пожалуйста!
    Собрал прошивку (adc, bme280, dht, encoder, enduser_setup, file, gpio, http, i2c, mqtt, net, node, rfswitch, rtcfifo, rtcmem, rtctime, sjson, spi, tmr, tsl2561, uart, wifi.) залил в NodeMCU.
    В init.lua:
    alt=320 -- altitude of the measurement place
    sda, scl = 1, 2
    i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once
    bme280.setup()
    P, T = bme280.baro()
    print(string.format("QFE=%d.%03d", P/1000, P%1000))

    И в итоге:(
    attempt to index global 'bme280' (a nil value)

    Пляшу с бубном уже долго, а воз и ныне там((
     
  7. ИгорьК

    ИгорьК Гуру

  8. ИгорьК

    ИгорьК Гуру

    Код, я вижу, правильно списан с мануала
    А вот sda, scl = 1, 2 - вещь сомнительная.
    Это что за ноги и где находятся?
    Не исключаю, что i2c не разрешены на них. Попробуйте сначала точно как в http://nodemcu.readthedocs.io/en/master/en/modules/bme280/
    Точно - точно
     
    Последнее редактирование: 24 фев 2018
  9. ИгорьК

    ИгорьК Гуру

    Внимательно:
    SmartSelectImage_2018-02-24-20-50-57.png
     
  10. Мих

    Мих Нуб

    Простите за некорректное оформление, впервые здесь.
    Ssd1306 на этих ногах работает. И на nodemcu и esp-f12 пробовал все одно ругается( Такое ощущение не понимает библиотеки bme280 (хотя и прошивки разные лил)
    ИгорьК, а в отсутствии сего чуда- bme280 на шине I2C lua также ругается?
     
  11. ИгорьК

    ИгорьК Гуру

    Все у вас правильно сделано.
    Но в желтой рамке написано (Вы прочитали???), что между вызовом setup и чтением датчика должен быть зазор значительной величины. Возможно (в тексте не указано) требуется определенное время.
    У вас код, да, из примера, устанавливает шину и сразу вызывает чтение. Скорее всего дело в этом.
    Что надо делать?

    Код (Lua):
    sda, scl = 1, 2
    i2c.setup(0, sda, scl, i2c.SLOW)
    bme280.setup()

    tmr.create():alarm(10000, 1, function()
        local P, T = bme280.baro()
        print(string.format("QFE=%d.%03d", P/1000, P%1000))
    end)
    Запуск чтения датчика через 10 секунд.
     
  12. Мих

    Мих Нуб

    Та же ошибка:(
    ИгорьК, а если на шине I2C нет ничего (или bme280 мертв) lua будет так же ругаться?
     
  13. ИгорьК

    ИгорьК Гуру

    Не знаю.
    Отсоедините датчик и посмотрите.
     
  14. ИгорьК

    ИгорьК Гуру

    Сейчас посмотрю - найду в закромах датчик.
    Датчик присоединен:

    upload_2018-2-24_22-28-45.png

    Датчик отсоединен:

    upload_2018-2-24_22-31-1.png
     
  15. ИгорьК

    ИгорьК Гуру

    Предположение. Есть информация. что некоторые китайцы продают датчики BMP085 под видом BME280.
     
  16. ИгорьК

    ИгорьК Гуру

    Покажите скриншот перезагрузки модуля. Вот такой:

    upload_2018-2-24_22-34-38.png
     
  17. Мих

    Мих Нуб

    Ругается( ?Похоже у модуля bme280 странная логика, если нет реакции от датчика то тушите свет( Да уж!? Uarta 2-го нет, spi.SLAVE - not supported currently, корявое NodeMCU Documentation (пример:tmr.create()) после перепрошивки может отказаться коннектиться (опять прошиваешь и только потом он изволить откликаться) У разработчиков или кто они там (у других таких же китайцев на модуль BFM50 его тоже нет) нет своего SDK. Я то думал прогресс настал( Блин вот я попал...
     

    Вложения:

    • 12.jpg
      12.jpg
      Размер файла:
      309,7 КБ
      Просмотров:
      498
  18. Мих

    Мих Нуб

    ИгорьК, спасибо Вам, что с таким идиотом как я возитесь:)
     
  19. Мих

    Мих Нуб

    Ура заработало!
    Причина неправильно прошивал последние разы ESP-ку.
    Надо было так:
    х-0x000000 -nodemcu-master-22-modules-2018-02-24-15-42-52-integer.bin
    х-0x3fc000 for 4 MB-esp_init_data_default.bin
     

    Вложения:

    • 123.jpg
      123.jpg
      Размер файла:
      332,3 КБ
      Просмотров:
      533
    Последнее редактирование: 25 фев 2018
  20. ИгорьК

    ИгорьК Гуру

    Курили? :)