『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 2018|回复: 19

[经验分享] ws2812做的月牙灯增加了时钟效果

[复制链接]

74

主题

514

帖子

3162

积分

论坛元老

Rank: 8Rank: 8

积分
3162
金钱
2648
HASS币
0
发表于 2022-8-25 21:28:27 | 显示全部楼层 |阅读模式
我的月牙灯用了56个灯珠,和60不对应,而且第一个灯珠也不在12点的位置,各种不合适,无奈时钟功能暂且搁置了,这两天寻思着用最笨的方法,就是时,分单独设置,比如1点时设置第五个第六个灯珠,两点设置第十一十二个灯珠亮。



【ws2812用esphome做的月牙灯,接入homeassistant,加入时钟新功能-哔哩哔哩】 https://b23.tv/ToU9mAM
回复

使用道具 举报

7

主题

1086

帖子

3425

积分

论坛元老

Rank: 8Rank: 8

积分
3425
金钱
2339
HASS币
0
发表于 2022-8-26 09:24:09 | 显示全部楼层
你别说,这个灯还蛮好,请问大佬是否有作业抄?
回复

使用道具 举报

74

主题

514

帖子

3162

积分

论坛元老

Rank: 8Rank: 8

积分
3162
金钱
2648
HASS币
0
 楼主| 发表于 2022-8-26 10:00:08 | 显示全部楼层
隔壁的王叔叔 发表于 2022-8-26 09:24
你别说,这个灯还蛮好,请问大佬是否有作业抄?


硬件和造型从b站找,有的是,代码部分放在下边了



i2c:
  sda: D3
  scl: D4
  scan: True

time:
  - platform: homeassistant
    id: homeassistant_time

light:
  - platform: neopixelbus
    variant: WS2812
    pin: D1
    num_leds: 56
    type: GRB
    name: "Moon Light"
    restore_mode: ALWAYS_OFF
   
    effects:                                      ##效果
   
      - random:
          name: "My Slow Random Effect"
          transition_length: 30s
          update_interval: 31s
      
      - pulse:
         
      - strobe:
         
      - flicker:

      - addressable_lambda:
          name: "clock"
          update_interval: 50ms
          lambda: |-
            it.all() = Color(0, 0, 0);
            it[round(0.93333*(60-id(homeassistant_time).now().second))] = Color(255, 0, 250);
            if (id(homeassistant_time).now().minute == 0) {
               it[20] = Color(0, 255, 0);
               it[21] = Color(0, 255, 0);
             }
             if (id(homeassistant_time).now().minute == 1) {
               it[19] = Color(0, 255, 0);
               it[20] = Color(0, 255, 0);
             }
   …………此处省略1万字


- addressable_rainbow:        

      - addressable_color_wipe:

      - addressable_scan:

      - addressable_twinkle:

      - addressable_random_twinkle:

      - addressable_fireworks:

      - addressable_flicker:
          name: Flicker Effect With Custom Values
          update_interval: 16ms
          intensity: 5%
   
    default_transition_length: 3s     ##过渡长度,默认1s。    设置了这个后,开关时会渐亮/渐灭
   
    on_turn_on:                               ##以下可以忽略
      then:
        - light.turn_on:
            id:
           # transition_length: 0.5s
            brightness: 0.3                          ##亮度,最大1.0
       #     red: 83.92%
       #     green: 92.549%
      #      blue: 94.118%
            effect: clock  ##开灯时的效果。设置后每次开灯默认这个效果
         
binary_sensor:
  - platform: gpio
    pin:
      number: D2
      mode:
        input: true
        pullup: true
    name: "chumokaiguan-moonlight"
    device_class: opening
    filters:
      - delayed_on_off: 50ms #这里一定要加这个这个起到滤波的作用。
      
  - platform: gpio
    pin:
      number: D5
      inverted: yes
      mode: INPUT
    name: "keting-motion"
    device_class: motion
    id: pir501
    filters:
      - invert:
      - delayed_on: 500ms
      - delayed_off: 10s
   
      
sensor:
  - platform: bh1750
    id: illuminance
    name: "Illuminance"
    address: 0x23
    update_interval: 10s         
回复

使用道具 举报

0

主题

569

帖子

2232

积分

金牌会员

Rank: 6Rank: 6

积分
2232
金钱
1663
HASS币
0
发表于 2022-8-26 10:03:43 | 显示全部楼层
厉害了我的哥
回复

使用道具 举报

2

主题

165

帖子

1799

积分

金牌会员

Rank: 6Rank: 6

积分
1799
金钱
1634
HASS币
0
发表于 2022-8-26 18:46:49 | 显示全部楼层
顶一下  还挺实用的
回复

使用道具 举报

7

主题

1086

帖子

3425

积分

论坛元老

Rank: 8Rank: 8

积分
3425
金钱
2339
HASS币
0
发表于 2022-9-3 23:28:13 | 显示全部楼层
大佬,作业已抄的差不多,有事不解,请指教。
我用了60颗灯珠,理论上不需要你的0.933*,您的代码
            it.all() = Color(0, 0, 0);
            it[round(0.93333*(60-id(homeassistant_time).now().second))] = Color(255, 0, 250);
            if (id(homeassistant_time).now().minute == 0) {
               it[20] = Color(0, 255, 0);
               it[21] = Color(0, 255, 0);
             } 
             if (id(homeassistant_time).now().minute == 1) {
               it[19] = Color(0, 255, 0);
               it[20] = Color(0, 255, 0);
             }

这段看不懂,我将代码改成了下面这段
      - addressable_lambda:
          name: "clock"
          update_interval: 50ms
          lambda: |-
            it.all() = Color(0, 0, 0);
            it[id(homeassistant_time).now().second] = Color(255, 0, 250);
            it[(id(homeassistant_time).now().minute)-1] = Color(0, 255, 255);
            it[(id(homeassistant_time).now().hour)*5-1] = Color(255, 255, 0);

有2个问题,秒针与分针指示没问题,时针是有问题的,比如现在23点,*5之后就是115,一共60个灯珠是不对的,如何将24小时改成12小时呢,还有时针在半点应该指向中间,这行代码简单粗暴,到了准点直接跳了。
请大佬百忙之中不吝赐教。
回复

使用道具 举报

22

主题

239

帖子

1535

积分

金牌会员

Rank: 6Rank: 6

积分
1535
金钱
1296
HASS币
0
发表于 2022-9-4 00:36:51 | 显示全部楼层
请教一下。  例如  10个灯,怎么控制 亮1个,  亮2个。。  亮N个, 代码怎么写, 我想看到有多少个设备开关,显示 亮灯数量
第二, 怎么控制亮了的灯的颜色 ?
回复

使用道具 举报

74

主题

514

帖子

3162

积分

论坛元老

Rank: 8Rank: 8

积分
3162
金钱
2648
HASS币
0
 楼主| 发表于 2022-9-4 07:36:47 | 显示全部楼层
隔壁的王叔叔 发表于 2022-9-3 23:28
大佬,作业已抄的差不多,有事不解,请指教。
我用了60颗灯珠,理论上不需要你的0.933*,您的代码
这段看不 ...

60个就简单了,直接现在时间对12取余,比如现在15点或3点,取余就是3,3*5就是第15个灯
回复

使用道具 举报

74

主题

514

帖子

3162

积分

论坛元老

Rank: 8Rank: 8

积分
3162
金钱
2648
HASS币
0
 楼主| 发表于 2022-9-4 07:40:07 | 显示全部楼层
ekingfan 发表于 2022-9-4 00:36
请教一下。  例如  10个灯,怎么控制 亮1个,  亮2个。。  亮N个, 代码怎么写, 我想看到有多少个设备开关 ...

用上边lambda,第一个亮就是it[0],第5个就是[4],什么颜色就是=后边的()里边的rgb数值
回复

使用道具 举报

7

主题

1086

帖子

3425

积分

论坛元老

Rank: 8Rank: 8

积分
3425
金钱
2339
HASS币
0
发表于 2022-9-4 19:52:05 | 显示全部楼层
silas3082 发表于 2022-9-4 07:36
60个就简单了,直接现在时间对12取余,比如现在15点或3点,取余就是3,3*5就是第15个灯 ...

大佬,时针搞定了,能否实现每隔12分钟跳一个那种效果呢,模拟真实的时钟走位。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-21 16:26 , Processed in 0.381879 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表