本帖最后由 roc634 于 2021-5-18 22:11 编辑
可能是目前论坛最简单实用的卫生间灯光方案,接受反驳。
本方案主要使用ESP8266和APDS9960红外手势传感模块,采用ESPHome,基于计数的方式控制继电器来实现灯光自动化。由于手势模块可以检测运动方向,因此将手势模块贴在合适的位置(最好是在手臂部位,因为这个部位在进出门时离门框最近),就可以准确识别是进门还是出门,通过计数就可以完美实现灯光自动化。因为使用NodeMCU来独立完成检测和控制,可脱网独立使用,也可用作手扫开关或者挥手开关,用于其它进出门的情况,比如厨房,阳台,其它房间等等等等。此外,还可以添加其他传感器和继电器,通过传感器的配合,检测在卫生间内的使用场景,增加控制自动冲水与否,以及冲水时间,是否需要打开加压泵,排气扇,等等其他多种用途。如果家庭成员较多,还可以通过在HA中分析数据,了解家人的卫生间使用情况,错峰如厕,还可以实现更多联动等等等等。等等等等……
卫生间灯光方案可以说是一个家中最高频的使用场景,自动化的需求是相当强烈的,论坛里也有很多朋友做过不同的尝试,我也一直想学习借鉴一下,但是看着都很复杂,有点为了自动化而自动化的倾向,反而把问题搞麻烦了。前段时间有点空,就想折腾一下卫生间的灯光方案。由于人体存在的检测目前没有很成熟的方案,基于计数的方案应该是最简单可行的,而用手势传感器模块应该是可以实现的,经过两个多月的使用,发现效果挺好,于是有了下文,权当抛砖引玉。
首先说一下我的要求, 那就是尽可能地简单,包括设备简单和使用简单。如果需要一大堆器件,用起来还相当麻烦,绝对会被我淘汰,也肯定不会在这里分享。我对卫生间的使用需求相对简单,每天最重大的占用一是拉屎,二是洗澡,最长也就一二十分钟。除此以外就是撒泡尿,除非老人过来住我们上卫生间才会虚掩一下门,不然我们都没有小心翼翼关好门,再操作一番马桶,然后才撒尿的习惯,一般就是走进去解决,然后走出来。
APDS9960是我目前能找到感应距离最大的手势模块了,模块的资料里说最大感应距离是20cm,貌似不太能达到,不过10多cm还是没问题的。所以这里有个前提,就是这就要求你家的卫生间门不是很宽的那种,或者你需要在进出时稍稍靠着贴有传感器的那个门边走,这个习惯一般很快就可以自然养成。由于是基于计数,所以理论是只要是以传感器能感应到的方式进出门,无论是单人运动,还是多人运动,都不会造成错乱,放心玩就是了。
对于经常频繁进出的情形,比如搬东西,拖地等,可以用于在传感器上多扫一下,模拟多一个进门的动作,或者出门时侧身出来,离传感器远一点,让它感应不到有人出门,这样计数不会归0,也就不会关灯了。然后在需要关灯的时候用手挥一下,模拟一个出门的动作就行了。
下面是器件的连接示意图。为了连接方便,我买的是NodeMCU,理论上所有的ESP8266都可以,只要有I2C接口。
需要根据我仅有的经验说明一下,以下两图是我买的两个APDS9960,最初买的是右边这个,但是发现用不了,不知道是不是质量,还是芯片型号的原因。在网上搜索了,有老外说有的模块需要改源代码里的id,还有说要改红外灯的功率之类的,我试了也没成功,外加本人只是小白,只有重新买一种模块,发现左边这种是可以直接用的。
至于继电器模块,建议买下图的固态继电器模块,这种模块触发的时候没有噪声,不烦人。
至于安装的位置。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的相关网页说明。
|