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

в 2:34, , рубрики: DIY, diy или сделай сам, esp8266, smart home, ws2811, ws2812b, гирлянда, Интернет вещей, микроконтроллеры, Новый Год, сделай сам, умный дом

Скоро Новый год, но вот настроение по разным причинам порой бывает не самым новогодним и тут на помощь приходит в том числе и новогодняя иллюминация. Хочу рассказать о своем опыте с адресными светодиодными гирляндами и лентами. Америку вряд ли открою, но вышло красиво и недорого.

Красочные адресные светодиоды на новый год без программирования и пайки - 1
Рассмотрю два варианта — отдельно без существующей домашней автоматизации и работу в связке с “умным домом”.

По адресным светодиодным лентам появилось довольно много структурированной информации и поэтому можно легко сделать осознанный выбор. Например, перед покупкой я внимательно просмотрел соответствующие видео с каналов DrZzs (на англ.) и The Hook Up (на англ.) и сделал выводы о стоимости необходимых лент — ведь результат работы работы лент в моем случае один — красочная подсветка.
Остановил свой выбор на двух недорогих вариантах из Китая:

  1. WS2812B ленте — 300 светодиодов — 5 метров.
  2. WS2811 гирлянде — 50 светодиодов x 3 куска — примерно 10 метров (3 x 3,3 м)

Красочные адресные светодиоды на новый год без программирования и пайки - 2
Адресные пиксели в офисном интерьере

В обоих случаях для питания моих лент требуется 5 вольт. По мощности я не считал, а установил имеющийся и доступный по цене существующий блок питания Mean Well RS-150-5.

Красочные адресные светодиоды на новый год без программирования и пайки - 3
Блок питания Mean Well RS-150-5

И самая важная часть для управления новогодней программой — контроллер. Я выбрал микроконтроллер ESP8266 китайского производителя Espressif Systems, то есть в моем случае использовал недорогую плату LOLIN (WEMOS) D1 mini.

Красочные адресные светодиоды на новый год без программирования и пайки - 4
LOLIN (WEMOS) D1 mini в термоусадке, подключенный к ленте на ёлке

Hardware

По лентам и гирляндам очень широкий выбор — есть большое число разных чипсетов и надо смотреть чтобы контроллер поддерживал ленты, которые собираетесь покупать.
Моей задачей было использовать адресные пиксельные ленты в составе автоматизации на базе open-source платформы Home Assistant. Самый доступный для этого вариант — использовать ESP8266. Существует большая база совместимых контроллеров заводского изготовления (раздел LED Controller), составленная авторами прошивки Tasmota.
На мой взгляд Tasmota хорошая прошивка, но для управляемых пикселей и шаговых двигателей не очень подходит.

Красочные адресные светодиоды на новый год без программирования и пайки - 5
LOLIN (WEMOS) D1 mini, подключенный к гирлянде

Software

Вариант без домашней автоматизации

Если хотите быстрый старт “без регистрации и смс”, то самое разумное решение это прошивка ESP8266 проектом WLED (WiFi Lighting Effects Driver). У прошивки есть собственное приложение которое позволяет легко управлять светодиодами, а также огромный список предустановленных эффектов для адресных лент и гирлянд. Также WLED поддерживает множество протоколов управления, в том числе и MQTT, если в этом есть необходимость.
Пайка для подключения ленты к WEMOS не требуется.

Красочные адресные светодиоды на новый год без программирования и пайки - 6
Интерфейс WLED (WiFi Lighting Effects Driver)

Адресная иллюминация в составе умного дома на базе Home Assistant

Надо заметить, что у WLED совсем недавно (в декабре 2019 года) появилась полноценная интеграция для Home Assistant.
Но, поскольку я занимался гирляндами еще в ноябре, до появления этой интеграции, связь Home Assistant <--> WLED по MQTT мне показалась глючной.

Красочные адресные светодиоды на новый год без программирования и пайки - 7
Панель управления ESPHome

Для Home Assistant существует нативная прошивка ESPHome, которая работает с Home Assistant без MQTT и она также поддерживает адресные светодиоды.

Вот список поддерживаемых чипсетов.

Clockless:
NEOPIXEL
WS2811
WS2811_400 (WS2811 with a clock rate of 400kHz)
WS2812B
WS2812
WS2813
WS2852
APA104
APA106
GW6205
GW6205_400 (GW6205 with a clock rate of 400kHz)
LPD1886
LPD1886_8BIT (LPD1886 with 8-bit color channel values)
PL9823
SK6812
SK6822
TM1803
TM1804
TM1809
TM1829
UCS1903B
UCS1903
UCS1904
UCS2903

SPI:
APA102
DOTSTAR
LPD8806
P9813
SK9822
SM16716
WS2801
WS2803

Поскольку я использую образ Hass.io, то для компиляции прошивок использовал самый простой для этого вариант — дополнение ESPHome Hass.io Add-On.

Красочные адресные светодиоды на новый год без программирования и пайки - 8
Окно редактора прошивки ESPHome

Получившиеся прошивки гирлянды и ленты:

ws2811_string.yaml

substitutions:
  devicename: ws2811_string
  upper_devicename: WS2811 string 

esphome:
  name: $devicename
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: "XXX"
  password: "XXX"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "WS2811 string Fallback Hotspot"
    password: "XXX"

captive_portal:

web_server:
  port: 80
  css_url: http://192.168.15.10:8123/local/webserver-v1.min.css #не отображаются состояния из-за отсутсвия сети или доступа к сайту разработчика https://github.com/esphome/issues/issues/648
  js_url: http://192.168.15.10:8123/local/webserver-v1.min.js

# Enable Home Assistant API
api:

# Enable OTA Access
ota:

# Enable verbose logging over serial
logger:

light:
  - platform: fastled_clockless
    chipset: WS2811
    pin: D4
    num_leds: 150
    name: "Гирлянда WS2811"
    effects:
      - addressable_rainbow:
          name: Rainbow Effect With Custom Values
          speed: 30
          width: 150
      - addressable_color_wipe:
          name: Color Wipe Effect With Custom Values
          colors:
            - red: 10%
              green: 10%
              blue: 100%
              num_leds: 1
            - red: 0%
              green: 0%
              blue: 0%
              num_leds: 1
          add_led_interval: 100ms
          reverse: False
      - random:
          name: "My Fast Random Effect"
          transition_length: 4s
          update_interval: 5s
      - strobe:
          name: Strobe Effect With Custom Values
          colors:
            - state: True
              brightness: 100%
              red: 100%
              green: 90%
              blue: 0%
              duration: 500ms
            - state: False
              duration: 250ms
            - state: True
              brightness: 100%
              red: 0%
              green: 100%
              blue: 0%
              duration: 500ms
      - addressable_scan:
          name: Scan Effect With Custom Values
          move_interval: 60ms
      - addressable_fireworks:
          name: Fireworks Effect With Custom Values
          update_interval: 32ms
          spark_probability: 10%
          use_random_color: false
          fade_out_rate: 120

# Общие данные по устройству
sensor:
  - platform: uptime
    id: uptime_sec
  - platform: wifi_signal
    name: ${upper_devicename} WiFi Signal
    id: wifis_signal
    update_interval: 900s

text_sensor:
  - platform: template
    name: ${upper_devicename} Uptime
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 113s
  - platform: template
    name: ${upper_devicename} Wifi Strength
    icon: "mdi:wifi"
    lambda: |-
      if (id(wifis_signal).state > -50 ) {
        return {"Excellent"};
      } else if (id(wifis_signal).state > -60) {
        return {"Good"};
      } else if (id(wifis_signal).state > -70) {
        return {"Fair"};
      } else if (id(wifis_signal).state < -70) {
        return {"Weak"};
      } else {
        return {"None"};
      }
    update_interval: 900s
  - platform: version
    name: ${upper_devicename} Version
  - platform: template
    name: ${upper_devicename} MAC Address
    lambda: 'return {WiFi.macAddress().c_str()};'
    icon: mdi:fingerprint
    update_interval: 1d

switch:
  - platform: restart
    name: ${upper_devicename} Restart

ws2811_strip.yaml

substitutions:
  devicename: ws2811_strip
  upper_devicename: WS2811 strip 

esphome:
  name: $devicename
  platform: ESP8266
  board: d1_mini_lite

wifi:
  ssid: "XXX"
  password: "XXX"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "WS2811 strip Fallback Hotspot"
    password: "XXX"

captive_portal:

web_server:
  port: 80
  css_url: http://192.168.15.10:8123/local/webserver-v1.min.css #не отображаются состояния из-за отсутсвия сети или доступа к сайту разработчика https://github.com/esphome/issues/issues/648
  js_url: http://192.168.15.10:8123/local/webserver-v1.min.js

# Enable Home Assistant API
api:

# Enable OTA Access
ota:

# Enable verbose logging over serial
logger:

light:
  - platform: fastled_clockless
    chipset: WS2811
    pin: D4
    num_leds: 300
    rgb_order: GRB
    name: "Ёлка WS2811"
    effects:
      - addressable_rainbow:
          name: Rainbow Effect With Custom Values
          speed: 30
          width: 300
      - addressable_color_wipe:
          name: Color Wipe Effect With Custom Values
          colors:
            - red: 10%
              green: 10%
              blue: 100%
              num_leds: 1
            - red: 0%
              green: 0%
              blue: 0%
              num_leds: 1
          add_led_interval: 100ms
          reverse: False
      - random:
          name: "My Fast Random Effect"
          transition_length: 4s
          update_interval: 5s
      - strobe:
          name: Strobe Effect With Custom Values
          colors:
            - state: True
              brightness: 100%
              red: 100%
              green: 90%
              blue: 0%
              duration: 500ms
            - state: False
              duration: 250ms
            - state: True
              brightness: 100%
              red: 0%
              green: 100%
              blue: 0%
              duration: 500ms
      - addressable_scan:
          name: Scan Effect With Custom Values
          move_interval: 60ms
      - addressable_fireworks:
          name: Fireworks Effect With Custom Values
          update_interval: 32ms
          spark_probability: 10%
          use_random_color: false
          fade_out_rate: 120

# Общие данные по устройству
sensor:
  - platform: uptime
    id: uptime_sec
  - platform: wifi_signal
    name: ${upper_devicename} WiFi Signal
    id: wifis_signal
    update_interval: 900s

text_sensor:
  - platform: template
    name: ${upper_devicename} Uptime
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 113s
  - platform: template
    name: ${upper_devicename} Wifi Strength
    icon: "mdi:wifi"
    lambda: |-
      if (id(wifis_signal).state > -50 ) {
        return {"Excellent"};
      } else if (id(wifis_signal).state > -60) {
        return {"Good"};
      } else if (id(wifis_signal).state > -70) {
        return {"Fair"};
      } else if (id(wifis_signal).state < -70) {
        return {"Weak"};
      } else {
        return {"None"};
      }
    update_interval: 900s
  - platform: version
    name: ${upper_devicename} Version
  - platform: template
    name: ${upper_devicename} MAC Address
    lambda: 'return {WiFi.macAddress().c_str()};'
    icon: mdi:fingerprint
    update_interval: 1d

switch:
  - platform: restart
    name: ${upper_devicename} Restart

После добавления получившихся устройств в Home Assistant в интерфейсе можно видеть и задавать варианты эффектов.

Красочные адресные светодиоды на новый год без программирования и пайки - 9
Интерфейс Home Assistant

Также эффекты можно использовать и в автоматизациях. Например при открытии двери 30 секунд один эффект, 10 секунд другой эффект, а потом выключение, чтобы не отвлекал. Но есть условие: включение только когда на улице уже полумрак.

automations.yaml

###################################################
#                                                 #
#     WS2811 эффекты: гирлянда и елка             #
#                                                 #
###################################################

- alias: WS2811 string
  trigger:
    - platform: state
      entity_id: binary_sensor.dver
      from: 'off'
      to: 'on'
  condition:
    - condition: numeric_state
      entity_id: 'sensor.osveshchennost_u_okna'
      below: 1500 #ниже
  action:
    - service: homeassistant.turn_on
      data:
         entity_id: group.new_year #light.girlianda_ws2811
         brightness: 255
         effect: Rainbow Effect With Custom Values
    - delay: '00:00:25'
    - service: homeassistant.turn_on
      data:
         entity_id: group.new_year
         brightness: 255
         effect: Color Wipe Effect With Custom Values
    - delay: '00:00:13'
    - service: homeassistant.turn_off
      entity_id: group.new_year

- alias: Table lamp ON
  trigger:
    - platform: state
      entity_id: binary_sensor.dver
      from: 'off'
      to: 'on'
  condition:
    - condition: numeric_state
      entity_id: 'sensor.osveshchennost_u_okna'
      below: 90 #ниже
  action:
    - service: homeassistant.turn_on
      entity_id: switch.potolochnaia_lampa

- alias: Table lamp OFF
  trigger:
    - platform: state
      entity_id: binary_sensor.dver
      from: 'on'
      to: 'off'
  condition: []
  action:
    - service: homeassistant.turn_off
      entity_id: switch.potolochnaia_lampa

Красочные адресные светодиоды на новый год без программирования и пайки - 10
Ёлка с адресной светодиодной лентой

Итог

Как можно увидеть при некоторой сноровке можно недорого организовать новогоднее освещение и вписать его в существующую систему “умного дома” или использовать отдельно без домашней автоматизации, используя отдельное приложение на смартфоне.

Дополнительные подробности можно найти на GitHub.

Автор: Михаил Шардин,
23 декабря 2019 г.

Автор: Михаил

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js