• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 работает. Всё равно пустует :)

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