• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение Ещё один зародыш умного дома...

Balancer

New member
Я, где-то, с пол-года в очень-очень фоновом режиме (по часу в месяц :D) занимаюсь проработкой «умного дома». Ряд чисто прикладных мелких задач, которые сложно описать чем-то иным, кроме этого громкого умного слова :)

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

Расписывать всё «от печки» оформляя что-то типа статьи — жалко времени (да и очень многие мысли ещё чётко не сформированы), поэтому, если коммьюнити не против, я просто буду время от времени флудить на тему хода работ и уже по необходимости делать экскурс к старым размышлениям. Ну и, конечно, на вопросы отвечать — на то он и форум.

Начну с последней мелочи и зайду к ней со стороны :) Блин, не получается всё равно без экскурса в область идей :)

База моего «умного дома» планируется разнообразной. По квартире (да и, в общем, за её пределами :)) будут раскиданы пассивные узлы — ноды самых разных типов. От привычных всем измерителей температуры или наличия газов до синтезаторов речи и дисплеев. Связывать их между собой будут активные узлы (тоже, в общем, ноды — я не думал о строгой терминологии). В роли сенсоров может быть зоопарк от ATTiny85+NRF24L01 до ESP8266. Активные узлы — от ESP8266 до *Pi и нормальных домашних (или внешних) серверов.

Но это лирика завтрашнего дня.

Пока же экспериментирую периодически с нодами-сенсорами. Разбираюсь с тонкостями конкретных изделий, вспоминаю, с какого конца держать паяльник (до этого не паял в заметных масштабах более 20 лет)...
 

Balancer

New member
Последнее, чем занимался в этом направлении — модулем управления RGB-светодиодной гирляндой. Гирлянда в умном доме может нести ряд интересных вспомогательных функций. Типа, подвесить за окном и будить зимним утром сине-голубым светом, разрушающим мелатонин и создающим бодрое настроение. Может красным светом привлечь внимание к какой-то проблеме, о которой детальнее рассказано на дисплее коммуникатора в периоды, когда звук будет отключен (дети спят). А может и просто крутить красивые эффекты на праздниках, для чего изначально и рассчитана :)

Гирлянда на WS2812, мозги — на ESP8266 в варианте ESP-01 (ничего, что я ссылки сразу на Ali даю? Это те лоты, что я сам заказывал).





Мозги, в принципе, можно и попроще поставить, но гирлянда всё равно жрёт много и питать придётся от розетки. Так что можно не экономить, а, заодно, повысить эффективность разработки, используя NodeMCU (на ESP8266 сейчас я исключительно по неё пишу).

Вообще, гирлянду я цеплял к ESP8266 давно, сразу после прихода гирлянды в январе, проблем никаких не было. Правда, эффекты под ESP8266 я пока реализовал только совсем простейшие и там надо бы концепцию совсем менять. Но вот что не нравится с ESP-01 — это необходимость вешать её на проводках. Ибо её 2x4 контакты нельзя воткнуть корректно в беспаечную макетную плату. Так что приходится или мучиться с проводками, или паять на полноценной макетке (в т.ч. в варианте переходника), или заказывать переходник на макетку. Но 370 рублей платить за такую мелочь жаба всё душила (с ценой просто оверкилл какой-то). Но не додушила. Колхозить кривой самопай хотелось меньше. Заказал, таки, пришла :D



Сразу соорудил такую штуковину:



Из приметных для моей практики мелочей:

— Питание от отдельного макетного micro-USB через преобразователь 5В в 3.3В. Раньше я обычно просто макетный источник питания использовал, либо пользовался девелоперскими вариантами ESP8266, у которых сразу с USB питание.

— Не поленился и вместо привычных перетыкаемых проводков воткнул кнопочки Reset и Prog (Flash).

— Наличие питания от относительно мощного внешнего 5В позволило сразу воткнуть питание лентой в плату. А то жрёт лента много и питать её от стабилизаторов девелоперских плат недопустимо.

Получился, в общем, вполне автономный девайс, который, в принципе, можно обновлять по воздуху. Но это пока не доведено — работает, но очень неудобно. Я хочу, вообще, сделать что-то типа онлайн-IDE, как ESPlorer, но для браузера и по воздуху, а не по кабелю.

А потом можно будет уже и распаять на паяльной макетке полноценно.

Не думаю, что с сырых кусков тестового кода будет какой-то прок, но для полноты описания добавлю:
Код:
-- pin4 = gpio2 esp-01

local num_leds = 60
local mxy = 255 -- max bright

local data = { }

for pos=0,num_leds
do
    table.insert(data, string.char(mxy,0,0))
end

ws2812.writergb(4, table.concat(data))
data = nil

pos_stop = 0
iter = 1
color = {
    string.char(    0,     0,   mxy),
    string.char(    0,   mxy,     0),
    string.char(    0, mxy/2, mxy/2),
    string.char(  mxy,     0,     0),
    string.char(mxy/2,     0, mxy/2),
    string.char(mxy/2, mxy/2,     0),
    string.char(mxy/2, mxy/2,  mxy/2),
}

time_sum = 0;

tmr.alarm(1, 30, 1, function()
    local now = tmr.now() 
    local data = { }

    for i=0, pos_stop do
        table.insert(data, color[iter])
    end

    ws2812.writergb(4, table.concat(data))

    pos_stop = pos_stop + 1
    if pos_stop >= num_leds then
       tmr.wdclr()
       print("next color; time=", time_sum)
       time_sum = 0
       now = tmr.now()
        pos_stop = 0
        iter = iter + 1
        if(iter>#color) then
           print("restart")
            iter = 1
            print(node.heap())
        end
    end

    data = nil
    time_sum = time_sum + (tmr.now()-now)
end)
Сигнальный провод светодиодной ленте вешается на GPIO2. Код заполняет в цикле ленту разными цветами. Сейчас в каждом внутреннем цикле заполняется нужными цветами массив и собирается в строку перед передачей ленте во внешнем цикле. Так получается намного быстрее, чем конкатенировать строку в каждом внутреннем цикле.

Быстрое выключение ленты:
Код:
local num_leds = 60

tmr.stop(1)
ws2812.writergb(4, string.rep(string.char(0,0,0), num_leds) .. string.char(1,1,1))
Бывает полезно, чтобы сходу погасить ленту, когда она чем-то мешает. Плюс такой вызов у меня ставится в init.lua, так что ленту можно погасить сразу reset'ом. Запуск пока ручной, но можно будет попробовать повесить его запуск на кнопку на GPIO0, которая сейчас в роли PROG работает. Всё равно пустует :)

Ну, в общем, пока хватит, думаю. Надеюсь продолжить позже....
 
Сверху Снизу