Arduino, ESP8266, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. ИгорьК

    ИгорьК Давно здесь

  2. Securbond

    Securbond Гик

    Если я правильно понял, то функция printlux нужна для того, чтобы ждать полученных значений от библиотеки и не тормозить работу остального кода....
     
  3. ИгорьК

    ИгорьК Давно здесь

    Не ждать, а обработать полученное значение и пнуть его куда надо.
     
    Securbond нравится это.
  4. ИгорьК

    ИгорьК Давно здесь

    60. Еще один DS18b20.
    Модуль:
    Код (Lua):
    local M={}
    M.adrtbl = {}
    M.pin = 4
    M.del = 750

    function M.getaddrs(ttable, call)
        ow.setup(M.pin)
        ow.reset_search(M.pin)
        repeat
            local adr = ow.search(M.pin)
            if(adr ~= nil) then
                table.insert(M.adrtbl, adr)
            end
        until (adr == nil)
        ow.reset_search(M.pin)
        M.askTemp(ttable, call)
    end

    function M.askTemp(ttable, call)
        ow.setup(M.pin)
        for _, v in pairs(M.adrtbl) do
            ow.reset(M.pin)
            ow.select(M.pin, v)
            ow.write(M.pin, 0x44, 1)
        end
        v = nil

        tmr.create():alarm(M.del, tmr.ALARM_SINGLE, function (t)
            M.readResult(ttable, call)
            t = nil
        end)
    end

    function M.readResult(ttable, call)
        local data, crc, t
        for _, v in pairs(M.adrtbl) do
            ow.reset(M.pin)
            ow.select(M.pin, v)
            ow.write(M.pin,0xBE,1)
            data = string.char(ow.read(M.pin))
            for i = 1, 8 do
                data = data .. string.char(ow.read(M.pin))
            end
            crc = ow.crc8(string.sub(data,1,8))
            if (crc == data:byte(9)) then
                t = (data:byte(1) + data:byte(2) * 256)
                if (t > 32767) then t = t - 65536 end
                t = t * 625 /10000
                table.insert(ttable, t)
            end
        end
        if call then call(ttable) end
    end

    function M.getTemp(ttable, call, pin, del)
        if #M.adrtbl == 0 then
            M.pin = pin or M.pin
            M.del = del or M.del
            M.getaddrs(ttable, call)
        else
            M.askTemp(ttable, call)
        end
    end
    return M

    Применение:
    Код (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        -- нога датчиков, можно не передавать, если 4
    del = 750    -- задержка чтения температуры, можно не передавать если 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')
    ds.getTemp(temp, myWork, pin, del )

    --[[
        -- Или создать таймер и читать температуру:
    tmr.create():alarm(20000, 1, function()
        ds = require('ds18b20m')
        ds.getTemp(temp, myWork, pin, del )
    end)
    --]]

    end

    Разъяснения.
     
    Последнее редактирование: 11 авг 2017
  5. Securbond

    Securbond Гик

    Спасибо топикстартеру. Домучил погодную станцию. Работает замечательно. Как нибудь сделаю тему со всеми файлами, 3Д моделью станции (будки для датчиков) и пояснениями что и куда. Что бы каждый мог повторить. Осталось развести плату и сделать корпус под модуль.
    Ну и пара фото
    IMG_4266.JPG IMG_4264.PNG image.jpg
     
    ИгорьК нравится это.
  6. obuhanoe

    obuhanoe Гик

    Добрый день.
    Очень заинтересовала тема, включая язык Lua.
    Но у меня нет Rasberry Pi, но есть мини компьютер с Win10, который брался как медиацентр к 4К телевизору.
    Можно ли все это развернуть на Windows (OpenHub и mosquitto)?

    Спасибо.
     
  7. rkit

    rkit Гуру

    Можно, почему нет. Находите порты любого софта на винду, читаете инструкцию, да устаналиваете.
     
  8. obuhanoe

    obuhanoe Гик

    Порты это OpenHub и mosquitto для windows?
     
  9. rkit

    rkit Гуру

    Да. И вообще чего угодно. Практически весь софт под linux есть и в винде.
     
    obuhanoe нравится это.
  10. obuhanoe

    obuhanoe Гик

    Спасибо, понял.
     
  11. obuhanoe

    obuhanoe Гик

    Добрый день.
    Решил все таки реализовывать на raspberry pi2 - установил RASPBIAN STRETCH WITH DESKTOP, начал устанавливать по инструкции от kmaximv - дошел до mosquitto и на пункте
    Код (Text):
    sudo apt-get install mosquitto
    получаю вот такую информацию (скриншот) и не пойму что необходимо сделать дальше?
    Обновить libsssl до версии больше 1.0.1, libwebsockets3 до больше 1.2 и libmosquitto1 ?
    Или проблема в отложенных битых пакетах (held)?
    Спасибо P_20170823_074356.jpg
     
  12. ИгорьК

    ИгорьК Давно здесь

  13. obuhanoe

    obuhanoe Гик

    Проверю вечером. Но в теме проблема как я понял, что между 2 терминалами нет связи.
    А я пока до терминалов еще и не добрался.
     
  14. obuhanoe

    obuhanoe Гик

    Не получилось разобраться - тема не помогла.
    Прошу помощи, что нужно сделать ? Если установить libwebsockets3 и libssl - то я не могу найти примеры в интернете.
    Спасибо.
     
  15. ИгорьК

    ИгорьК Давно здесь

    Понимаете, вот я лично устанавливал переустанавливал опенхаб с москитом раз семь точно, причем от первой до третьей малины - проблем не было.
    Поиск по форумам быстро тоже ничего не дал.
    Либо у вас дистрибутив битый, либо именно этот дистрибутив проблемный - попробуйте поискать предыдущий Jessie. Там 100% все устанавливается по инструкции.
     
  16. obuhanoe

    obuhanoe Гик

    Добрый день. А можете подсказать?
    Нашел только тут версию 8.9 она подойдет?
    https://www.debian.org/releases/jessie/debian-installer/
    полный набор CD
    Это он?
    Спасибо.
     
  17. ИгорьК

    ИгорьК Давно здесь

  18. obuhanoe

    obuhanoe Гик

  19. ИгорьК

    ИгорьК Давно здесь

    На заметку.
    Когда работаешь с прерываниями на GPIO - gpio.trig(), то после ресета, судя по всему, прерывания не сбрасываются.

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

    Как бороться. В скрипте перед назначением прерывания отменять его:

    Код (Lua):
    -- отменяем
    gpio.trig(buttonPin, gpio.INTR_DOWN)
    -- вновь назначаем
    gpio.trig(buttonPin, gpio.INTR_DOWN,function()...
    -- так работает и после ресета по любой причине
     
     
    Последнее редактирование: 25 авг 2017
    alp69 нравится это.
  20. Securbond

    Securbond Гик

    На днях устанавливал OH на чистую 2ую малину. Проблем с москитом не возникло. Были проблемы с новой версией аддонов 1.10, откатился на старые 1.8.3, всё заработало.