找回密码
 立即注册

微信扫码登录

搜索
查看: 28749|回复: 13

简单好用、可靠、低成本的卫生间灯光自动化方案

[复制链接]

16

主题

119

回帖

1129

积分

金牌会员

积分
1129
金钱
994
HASS币
0
发表于 2021-5-18 18:40:07 | 显示全部楼层 |阅读模式
本帖最后由 roc634 于 2021-5-18 22:11 编辑

可能是目前论坛最简单实用的卫生间灯光方案,接受反驳。


本方案主要使用ESP8266和APDS9960红外手势传感模块,采用ESPHome,基于计数的方式控制继电器来实现灯光自动化。由于手势模块可以检测运动方向,因此将手势模块贴在合适的位置(最好是在手臂部位,因为这个部位在进出门时离门框最近),就可以准确识别是进门还是出门,通过计数就可以完美实现灯光自动化。因为使用NodeMCU来独立完成检测和控制,可脱网独立使用,也可用作手扫开关或者挥手开关,用于其它进出门的情况,比如厨房,阳台,其它房间等等等等。此外,还可以添加其他传感器和继电器,通过传感器的配合,检测在卫生间内的使用场景,增加控制自动冲水与否,以及冲水时间,是否需要打开加压泵,排气扇,等等其他多种用途。如果家庭成员较多,还可以通过在HA中分析数据,了解家人的卫生间使用情况,错峰如厕,还可以实现更多联动等等等等。等等等等……

卫生间灯光方案可以说是一个家中最高频的使用场景,自动化的需求是相当强烈的,论坛里也有很多朋友做过不同的尝试,我也一直想学习借鉴一下,但是看着都很复杂,有点为了自动化而自动化的倾向,反而把问题搞麻烦了。前段时间有点空,就想折腾一下卫生间的灯光方案。由于人体存在的检测目前没有很成熟的方案,基于计数的方案应该是最简单可行的,而用手势传感器模块应该是可以实现的,经过两个多月的使用,发现效果挺好,于是有了下文,权当抛砖引玉。

首先说一下我的要求, 那就是尽可能地简单,包括设备简单和使用简单。如果需要一大堆器件,用起来还相当麻烦,绝对会被我淘汰,也肯定不会在这里分享。我对卫生间的使用需求相对简单,每天最重大的占用一是拉屎,二是洗澡,最长也就一二十分钟。除此以外就是撒泡尿,除非老人过来住我们上卫生间才会虚掩一下门,不然我们都没有小心翼翼关好门,再操作一番马桶,然后才撒尿的习惯,一般就是走进去解决,然后走出来。

APDS9960是我目前能找到感应距离最大的手势模块了,模块的资料里说最大感应距离是20cm,貌似不太能达到,不过10多cm还是没问题的。所以这里有个前提,就是这就要求你家的卫生间门不是很宽的那种,或者你需要在进出时稍稍靠着贴有传感器的那个门边走,这个习惯一般很快就可以自然养成。由于是基于计数,所以理论是只要是以传感器能感应到的方式进出门,无论是单人运动,还是多人运动,都不会造成错乱,放心玩就是了。


对于经常频繁进出的情形,比如搬东西,拖地等,可以用于在传感器上多扫一下,模拟多一个进门的动作,或者出门时侧身出来,离传感器远一点,让它感应不到有人出门,这样计数不会归0,也就不会关灯了。然后在需要关灯的时候用手挥一下,模拟一个出门的动作就行了。


下面是器件的连接示意图。为了连接方便,我买的是NodeMCU,理论上所有的ESP8266都可以,只要有I2C接口。
2021-5-18 16-30-39.jpg

需要根据我仅有的经验说明一下,以下两图是我买的两个APDS9960,最初买的是右边这个,但是发现用不了,不知道是不是质量,还是芯片型号的原因。在网上搜索了,有老外说有的模块需要改源代码里的id,还有说要改红外灯的功率之类的,我试了也没成功,外加本人只是小白,只有重新买一种模块,发现左边这种是可以直接用的。

未标题-1.jpg
至于继电器模块,建议买下图的固态继电器模块,这种模块触发的时候没有噪声,不烦人。
2021-5-18 17-28-33.png

至于安装的位置。APDS9960需要粘在门框上,其它的器件可以放在一起。如果你的卫生间灯开关有零火线,线盒空间也够的话,完全可以塞到线盒里,否则,将所有这些器件装在灯里或者附近也是没有问题的。APDS9960和NodeMCU之间的线就需要根据你的具体情况来选长度了,一般找个闲置的四芯USB线就可以了。


下面是我在用的ESPHome代码,简单地说一下逻辑:设一个全局变量用于计数,进门加1,出门减1,当这个变量归0时关灯。同时,为避免出现由于感应不到出门,全局变量没有归0而造成不关灯,设一段脚本计时,20分钟内没有进出门动作就关灯,这个时间可以根据你洗澡或者拉屎的习惯调整。APDS9960可以感应多种手势,但是贴在门框上一般就只会用到上下左右四个中的两个,根据你的安装方向修改就行了。最后,考虑到NodeMCU长时间运行有时可能会出现各种奇怪的问题,需要通过重启解决,为此我设置为每天5点5分重启一次,提前防止问题出现。由于我的卫生间光线不好,因此是全天需要开灯的,如果你的卫生间只需要晚上开灯,或者需要添加延时,以及开头提到的其他更加丰富的功能,就请根据自己的需要修改行了。


有简单的注释,可以根据需要修改。
esphome:
  name: washroom
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "你的wifi名"
  password: "wifi密码"

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


captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

i2c:
  scl: D1
  sda: D2
  scan: True
  
globals:
  - id: washroom_person_count  #用于计数的全局变量
    type: int
    restore_value: no
    initial_value: '0'
    
script:
  - id: auto_turn_off  #用作安全的自动关灯脚本。进门触发,20分钟内无动作则归0关灯
    mode: restart
    then:
      - delay: 20min
      - lambda: |-
          if (id(washroom_person_count) > 0) {
            id(washroom_person_count) = 0;
            id(washroom_light).turn_off();
            }

apds9960:
  address: 0x39
  update_interval: 60s
  
binary_sensor:
  - platform: apds9960  #进门加1,计数为1时开灯
    direction: RIGHT   #进门检测到的手势根据安装情况有差异,按实际情况设置
    name: "washroom_enter"
    on_press:
      then:
        - lambda: |-
            id(washroom_person_count) += 1;
            if (id(washroom_person_count) == 1) {
              id(washroom_light).turn_on();
            }
        - script.execute: auto_turn_off
  - platform: apds9960  #出门减1,计数为0时关灯,不可为负数
    direction: LEFT   #出门检测到的手势根据安装情况有差异,按实际情况设置
    name: "washroom_exit"
    on_press:
      then:
        - lambda: |-
            id(washroom_person_count) -= 1;
        - if:
            condition:
              lambda: 'return id(washroom_person_count) == 0;'
            then:
              - switch.turn_off: washroom_light
              - script.stop: auto_turn_off
        - if:
            condition:
              lambda: 'return id(washroom_person_count) < 0;'
            then:
              - lambda: |-
                  id(washroom_person_count) = 0;
switch:
  - platform: gpio
    pin: D3
    name: "washroom_light"
    id: washroom_light
  - platform: restart  #用于重启NodeMCU
    name: "washroom_restart"
    id: washroom_restart
    
time:
  - platform: sntp
    on_time:
      - cron: '* 5 5 * * *'  #每天5点5分重启
        then:
          - switch.toggle: washroom_restart



实际上,脱网也是可以用的。但是追求完美主义的人可能需要改一下。主要是esphome在连不上wifi或者api时会默认15分钟重启一次,这个应该不太会影响使用,因为我断电后再通电,也是可以马上可以感应开灯的。但是如果不想让模块频繁重启,可以设置一下,将超时时间设为0s禁止,另外自动重启的功能也可以设置一个合适的超时时间来达到目的,或者用interval,或者on_boot配合delay延时等来实现。详细请看esphome的相关网页说明。

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-10-15 03:24 , Processed in 0.056693 second(s), 11 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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