一行代码都不用写,搞定LEDSTICK或LED灯带

作者:店长大人

0X00

这两天想利用HA (Homeassistant) 智能家居平台监控下猫砂喷子,把我家喵星人的拉屎习惯了解下,于是找@Spoony购入了一个人体热释电模块,偶然又发现了一个叫做LEDSTICK的DIY产品,感觉不错,遂同时入手。LEDSTICK到手后感觉太棒了,简直爱不释手,放在机箱里太浪费了,还是折腾下比较有意思。

LEDSTICK的RGB灯带其实是附属功能,它的主要功能在产品说明书里写的很详细,此处不再多说。这篇文章主要是采用ESP8266+ESPhome来零代码驱动LEDSTICK的8颗LED灯,同样原理完全可以移植到ARGB灯带中。当然ESPhome无缝衔接HA,同样也可以用HA控制。

LEDSTICK产品:

0X01

材料清单:
树莓派
ESP8266/NODEMCU
杜邦线
LEDSTICK

0X02

在树莓派中安装ESPhome:
安装方法极为简单,可参看我之前的帖子:
https://www.quwj.com/2020/01/20/ha-transforms-the-fish-tank-iii-upgrade-it-with-esp8266.html
我们按上面的文章中的教程新添加一个esp8266配置,如果已有在用的8266,那就可以直接修改。

电路驱动原理:
在进入代码书写阶段之前,我们要先了解下这个LED灯带到底是怎么驱动的。这样才能举一反三,将知识应用到其他同类产品上。
这8颗RGB灯珠其实是WS2812B. 这个帖子或许能帮助我们更容易理解这款灯珠的性能:
https://blog.csdn.net/tangxing1212/article/details/42964417

这里,我们要注意的是:
1:接口,这款产品预留的是D_RGB接口,三针,分别是VCC, DIN, GND。VCC接5V,GND接地,DIN口要接我们的MCU(ESP8266)的GPIO口。驱动时DIN输入一个由多段24位字符组成的信号。用来将颜色信号发送给灯带,灯带自带的IC会自动将信号解码为对应颜色并显示出来。

2:级联逻辑。由于该WS2812B支持单珠编程,当多颗灯珠级联时,我们在上位机代码中设置了对应的灯珠级联个数N,MCU每次发送出来的数据都是 N个24bit数据组合在一起的。当第一个灯珠接收到这个数据链以后,会自动将第一个24bit数据消耗,然后送到第二颗灯珠时数据链还剩N-1个24bit数据,然后第二颗灯珠再消耗1个24bit数据。以此循环。这样也就意味这个每个灯珠都可以自定义颜色。同样,级联的灯珠越多,随之带来的也是对MCU资源的消耗。我用Ardunio uno驱动过。大概8k的RAM,灯珠级联到3位数还勉强可以,再多了就要溢出了。

ESPhome 对应的驱动库:

1:基础版
因为是零代码。我们不需要写任何代码,直接在ESPhome中引入官方写好的库,做好配置即可。库地址:https://esphome.io/components/light/fastled.html

这里用到的是ESPhome中的FastLED库,用第一个模块Clockless

其中配置完全可以复制粘贴到你的ESP8266配置中,只需要修改下灯珠的IC类型 “chipest”参数,我们要采用WS2812B,并修改下GPIO端口,设置为你想使用的即可。此处我设置的是D1口。连接电路时,这个要接到LEDSTICK的DIN口。

这样的配置是个基础版,它可以实现让LEDSTICK的8颗灯按照你希望的颜色去点亮或关闭,但一点也不炫酷。接下里我们进阶一下,把各种炫彩效果也加上。

2:进阶版
此处,我们参看ESPhome的官方文档:https://esphome.io/components/light/index.html#light-effects
在这里我们可以看到很多可选的效果。如图:

这些配置里有随机效果,频闪,彩虹,流水,烟花等等。可以根据自己的喜欢添加。其中很多参数都是可以自己设置的,具体参看模块要求即可。其方法举例如下:

light:
- platform: ...
# ...
effects:
- addressable_random_twinkle:
- addressable_random_twinkle:
name: Random Twinkle Effect With Custom Values
twinkle_probability: 5%
progress_interval: 32ms

附上我的部分配置文件:

light:

  - platform: fastled_clockless
    chipset: WS2812B
    pin: D1
    num_leds: 8
    rgb_order: RGB
    name: "LEDSTICK" 
    
    effects:
      - random:
          name: Random Effect With Custom Values
          transition_length: 5s
          update_interval: 7s
          
      - 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
              
      - flicker:
          name: Flicker Effect With Custom Values
          alpha: 95%
          intensity: 1.5%

      - addressable_rainbow:
          name: Rainbow Effect With Custom Values
          speed: 10
          width: 50    
          
      - addressable_color_wipe:
          name: Color Wipe Effect With Custom Values
          colors:
            - red: 100%
              green: 100%
              blue: 100%
              num_leds: 4
            - red: 0%
              green: 0%
              blue: 0%
              num_leds: 4
          add_led_interval: 100ms
          reverse: False    
          
      - addressable_scan:
          name: Scan Effect With Custom Values
          move_interval: 100ms
          scan_width: 1
        
      - addressable_twinkle:
          name: Twinkle Effect With Custom Values
          twinkle_probability: 5%
          progress_interval: 4ms
          
      - addressable_random_twinkle:
          name: Random Twinkle Effect With Custom Values
          twinkle_probability: 5%
          progress_interval: 32ms
          
      - addressable_fireworks:
          name: Fireworks Effect With Custom Values
          update_interval: 32ms
          spark_probability: 10%
          use_random_color: false
          fade_out_rate: 120
          
      - addressable_flicker:
          name: Flickers Effect With Custom Values
          update_interval: 16ms
          intensity: 5%    

0x03

烧录配置并连接电路
我们先在ESP8266上面看看效果,先不接入HA。在ESP8266的配置中,我们要加入web_server组件,以方便我们远程登录esp8266进行操作。因此,ESP8266的配置中需加入以下代码:

# Example configuration entry
web_server:
port: 80

详细文档请参看:https://esphome.io/components/web_server.html

配置烧录到ESP8266中,然后将ESP8266与LEDSTICK连接。配置烧录可以参考之前的帖子,此处不再赘述。MD顺便吐槽下我的树莓派zero w,我是把HA跑在zero里面的铁头娃,编译一个配置文件你猜zero需要多久?1个多小时!!!!哈哈哈!其他树莓派都有大的用处,Zero能跑起来就行。
如图:

0x04

使用ESPhome网页按钮操作LEDSTICK灯:
ESP8266上载好配置后,给他们供电。浏览器输入:ESP8266的内网ip地址后,然后可以进行操作:

0x05

好吧,我错了。因为Esphome自带的网页服务器CSS/JS的限制,在ESP8266网页中只能打开关闭这个灯,不能装B的炫彩,那只好我们把这个ESP8266配置到HA中。看看它在HA中的效果。具体配置方式请查看:https://www.quwj.com/2020/01/20/ha-transforms-the-fish-tank-iii-upgrade-it-with-esp8266.html
现在HA直接集成了,添加成功后,我们把这个灯的实体添加到UI前端。如图:

0x06

写在最后,LEDSTICK这款产品的设计还是不错的。我个人觉得,还完全有二次开发的潜质,这个主控芯片应该完全支持对RGB灯的编程,开发者可以考虑除了外接主板实现同步色彩外,也可以用自身带的MCU实现对板载8颗RGB的驱动,实现自发光,哈哈哈!



坐沙发

发表评论

你的邮件地址不会公开


*