本帖最后由 shaula 于 2022-4-27 22:14 编辑
家里装了电动的开窗器、电动雨篷,一直想用雨量、风速传感器来自动化。坛子里关于雨量传感器,基本都是用雨水板接一块模数转换小板,然后把小板的DO接到ESP8266或ESP32的引脚,做一个binary_sensor,传入小板的开关量。这样做有个问题,小板上的可变电阻不精确,并且只有开关量,无法实现感知雨量大小。而关于风速传感器,坛子里虽然有,但讲解不多。现将本人经验分享如下:
一、硬件
ESP32或ESP8266一块;雨水板子一块(模数小板没有应该也可以,但我是接了小板的);0-5V两线风速传感器(风杯)一个;INA219电源监控模块一个
二、软件
ESPHOME
三、接线
雨量传感器小板的AO接ESP32的ADC脚(我用GPIO34),DO接ESP32的GPIO引脚(我是接GPIO25)。风速传感器输出正极接INA219的VIN+,负极接VIN-并到ESP32的GND。INA219的SCL、SDA接ESP32的GPIO22、21引脚。雨量传感器小板、INA219上的VCC、GND分别并到ESP32 的3.3V和GND引脚。
四、ESPHOME代码
i2c: #声明I2C引脚位置
sda: 21
scl: 22
scan: true
binary_sensor: #binary sensor这一段是监控小板传入的开关量信号,如果不需要小板的开关量,可以去掉
- platform: gpio
name: "water_sensor"
pin:
number: GPIO25
mode:
input: true
pullup: true
inverted: True #如果不定义反转为下拉模式,则开关正好相反
filters:
- delayed_on: 100ms
- delayed_off: 100ms
switch: #跟binary_sensor同一引脚设定为开关,解决下面根据雨量模拟量自动控制binary_sensor开和关的问题,相当于数模双控开关
- platform: gpio
pin:
number: GPIO25
inverted: True
name: "relay1" #雨量开关
id: switch1
sensor:
- platform: ina219
shunt_resistance: 0.1 ohm
current:
name: "windspeed_sensor"
accuracy_decimals: 1 #默认是3,改为1后HA仪表盘上实体显示为小数点后一位,否则数据会抖动
filters:
- offset: 0.00019 # 我这里风杯不转时,读数是-0.00019,所以加了一个常数让它变0
- lambda: return x * (32.4/0.2) ; #风杯最大风速是32.4米/秒,分母是我测试出来跟实际情况相差不大的值,可能不精确
unit_of_measurement: "米/秒"
icon: "mdi:sign-direction"
max_voltage: 5V
max_current: 2A #这里的5V是风杯最大电压,电流是乱填的,具体作用我还没搞懂
update_interval: 1s
- platform: adc
pin: GPIO34
name: "rain_data"
attenuation: auto #这个不加上,ADC只能读到上限1.1伏
update_interval: 1s
filters: #因为模拟值波动较大,所以要加滤波器,配合较短的取样周期(1秒),可以提升稳定和精度
- sliding_window_moving_average:
window_size: 15
send_every: 15
on_value_range: #这段自动化,电压数值2.0和1.95也是自己摸索出来的,可以根据自身情况修改数值
- above: 2.0
then:
switch.turn_off: switch1
- below: 1.95
then:
switch.turn_on: switch1
声明:本人纯小白一个,搞法律的,啥编程微电子都不懂,靠瞎摸搞出来的,关于HA当中如何优化控制逻辑,有空再分享。大概思路是:因为风速传感器类似脉冲,为了防止突然一阵风就执行关雨篷命令,我用了两个辅助元素,一个计时,一个计数。再用一段自动化,当风速数据变化时触发,风速达到多少值后,计数加1,当在1小时之内,计数超过多少时,执行关雨篷命令,如果超过1小时,则重置计数器。
|