前边的esphome教程里讲过怎么使用esp-01s制作智能开关、智能彩灯控制器、温湿度检测仪、土壤湿度检测仪等等,今天呢我们再讲讲人体传感器。
目前主流的人体传感器检测元件不外呼红外和微波两种,像安防系统中用到的双鉴探头、多元三鉴探头,都是用的这个。下图就是被动红外模块和微波模块。
PS:讲解下被动红外的概念,探测器本身不发射任何能量而只被动探测、接收来自环境的红外辐射。一旦有人体红外线辐射进来,经光学系统聚焦后热释电器件就会产生突变电信号。与被动红外相对应的是主动红外,安防中用的红外对射就是主动红外。
该红外传感器是5V-12V供电,输出3.3V高电平(切记不要使用3.3V供电,会带不起来),它有两种触发模式:
1、当检测到有人活动时,会持续输出高电平,等延时时间一结束就变为低电平(公共区域的感应照明就是这个模式);
2、当检测到有人活动时,会输出高电平,在延时时间段内,如果有人体在其感应范围活动,将一直保持高电平输出,直到人体离开检测范围,才输出低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
PS:我们需要用到的是模式2,原理:通过ESP 监测模块输出引脚,当有高电平时(即有人活动时),触发相应动作(比如控制一个灯开启;夜间触发报警)。
话不多说,上代码:
esphome:
name: pir_sensor ##这里的名称一定要与你建立这个模块时的名称相同;
platform: ESP8266 ##这里不能变;
board: esp01_1m ##这里不能变;
wifi:
ssid: "test-wifi" ## wifi账号;
password: "12345678" ## wifi密码;
manual_ip:
static_ip: 192.168.123.198 ##固定此设备IP地址为192.168.123.198;
gateway: 192.168.123.1 ##路由器、网关地址;
subnet: 255.255.255.0 ##子网掩码;
# Example configuration entry
debug:
# Logger must be at least debug (default)
logger:
level: debug
# Enable Home Assistant API
api:
password: "1" ## api密码,用于链接ha验证;
ota:
password: "1" ## ota密码,用于后续在线升级;
web_server: ## web控制,添加了这2行,就可以在网页端打开设备ip;
port: 80
switch:
- platform: gpio
name: "PIR light relay"
pin: GPIO2 ##使用GPIO-0
id: relay
binary_sensor:
- platform: gpio
pin: GPIO0 ##使用GPIO-0
name: "PIR Sensor"
device_ class: motion ##传感器类型
id: pir_motion ##设置传感器ID
on_press: ##如果触发,则执行继电器开合的动作
- switch.turn_on: relay
- platform: template ##引入自动化模板
name: temp_motion ##模板名称
lambda: 'return id(pir_motion).state;'
filters:
- delayed_off: 2min ##若触发红外传感器,则延时2min后关闭继电器
on_release:
- switch.turn_off: relay
上面程序用到自动化模板控件Template,它的作用在于触发红外传感器时,能够自动将继电器打开 ,延时一段时间后自动关闭,如果光使用relay,是达不到自动关闭的效果的。
目前只测试了下自动延时的效果,其实还可以改成if_else、while和wait_until的触发模式,也就是说,不需延时,只要检测到人体就一直保持触发状态,让继电器一直闭合(这里需要将红外模块设置成连续触发模式)
这个可以用于卫生间、起床小夜灯的场景,当检测到人体活动时,一直保持触发状态,让灯一直开着。
下面以if_else代码为例:
##前面配置部分省略
switch:
- platform: gpio
name: "PIR light relay"
pin: GPIO2 ##使用GPIO-0
id: relay
binary_sensor:
- platform: gpio
pin: GPIO0 ##使用GPIO-0
name: "PIR Sensor"
device_ class: motion ##传感器类型
id: pir_motion ##设置传感器ID
on_press: ##如果触发,则执行继电器开合的动作
- switch.turn_on: relay
- platform: template ##引入自动化模板
name: temp_motion ##模板名称
on_press:
then:
- if:
condition:
lambda: 'return id(pir_motion).state;'
then:
- logger.log: "Detected somebody activity"
- switch.turn_on: relay
##这里也可以加延时语句,这样就跟上面的一样了
else:
- logger.log: "There is no one around"
- switch.turn_off: relay
如果只是单纯当人体传感器,用来当安防探头用的话,直接这样写就好:
binary_sensor:
- platform: gpio
pin: GPIO0 ##使用GPIO-0
name: "PIR Sensor"
device_ class: motion
PS:当然你按最后这个写,然后在homeassistant的自动化中再关联灯也是可以的。总之「条条大道通罗马」。
烧录及homeassistant中的操作见前边的文章。下边为homeassistant中的显示情况。
PS:上述模块,可单用一个,也可以两个都有(两个都用会更准确,减少误报率)。
本人实际使用中,发现蹲厕所时,总是要动一下才行。本来出个恭,结果顺带打了一套太极拳;这种事情「是可忍,孰不可忍也」。于是我又用了下边这个模块,毫米波雷达。
PS:人体存在感应器就用的这玩意儿,不过那个频率更高,79G的(人体存在感应器就是人在微动的情况下就能检测到,比如呼吸时)。
涂鸦智能和绿米是有成品卖的,价格在400多。不过这个模块也不便宜,见下图。
PS:关于esphome系列,目前先讲到这里吧;如果后续有太另类的东西,再开讲吧。
-- -- -- -- -- -- END -- -- -- -- -- --
我是小白,智能家居爱好者、一卡通行业从业者、曾经的建筑智能化从业者。致力为开源智能家居平台添砖加瓦。