本帖最后由 ghostist 于 2022-4-18 15:22 编辑
囧大秒加精
弄得我不好意思了
好像这是第一个精华
想了想好像PCB里没什么隐私
索性放出来
WATER_DISPENSER Ver1.00.PcbDoc.zip
(949.94 KB, 下载次数: 14)
【前情提要】https://bbs.hassbian.com/thread-15725-1-1.html
当时没什么人关注
最后自己定了一个方案:自制硬件、获取饮水机信号、控制水泵、自动补水
这个方案就是为了“优雅”,不外置丑陋的液位传感器
【方案说明】
1、饮水机AC220供电,有两个NTC(和本项目无关),一个霍尔信号(5V 重点,图3),一个水泵控制信号(MOS控制),两个继电器(和本项目无关)
2、自制硬件,附上原理图(嗯...这里用到的封装信息有一些包含了公司信息,所以暂时不放出源文件了)
稍微讲一下
2.1、输入有DC12V(从饮水机里取的)、原始水泵(电机)驱动信号、原始水泵霍尔信号、新增水泵霍尔信号、按键;输出就一个新增水泵的控制信号
2.2、原始水泵霍尔信号为5V电平,使用BAV99钳位到3.3V,进入8266
2.3、霍尔信号经过一个或门,或门另一个输入为RC充电电路,原因为一开始我想用esp01实现,esp01对部分IO上电时候要求不能是低电平,而霍尔传感器信号虽然是有上拉电阻的,但实测还是低电平信号(这个上拉是水泵要求的)
2.4、从饮水机取12V再自己转5V使用是因为水泵需要12V驱动,这个水泵可以长时间工作,pdd 9.9包邮买的5V驱动的水泵,抽大概4L水就烫到不能碰,不能连续工作
2.5、按键接到gpio0和gpio2,烧录的时候也可以用(因为我不知道gpio0是不是可以正常用,所以接了个gpio2)
2.6、原始水泵驱动信号,驱动的时候触发我这边的光耦,8266可以获取到状态
之后画PCB 立创白嫖
3、esphome部分老规矩 先上code
esphome:
name: water-dispenser
platform: ESP8266
board: d1
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
password: "57ef428d5a8f31a3c495e1f84d41b406"
wifi:
ssid: "Vaneber_2.4G"
password: "nishengri"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Water-Dispenser Fallback Hotspot"
password: "1223334444"
globals:
- id: up_water_now #replenishment_water的total值不能直接调用,所以建立了这个全局变量
type: float
restore_value: no
- id: up_water_last
type: float
initial_value: "0.0"
restore_value: no
- id: replenishment_water_remaining
type: float
restore_value: no
sensor:
#水箱用水量统计
- platform: pulse_meter
pin: GPIO5
unit_of_measurement: 'mL/s'
name: 'drink water speed'
id: drink_water
internal_filter: 13us
accuracy_decimals: 2
internal: false #开放到HA
timeout: 1s
filters:
- multiply: 0.00091667 #原测量单位为pulse/min 水泵0.055g(mL)/pulse,相乘得到ml/min,再/60得到mL/s
on_value_range: #抽不到水的时候触发自动化,此值为经过filter的
below: 3.0 #原来为5 改为3是因为在85°以上的时候 出水本来就慢 5~6ml/s左右
then:
if:
condition:
binary_sensor.is_on: internal_pump #条件:水泵还是开启的(缺水时 理论上是先测不到流量,再水泵停止;正常供水时,应该是水泵先停,流量再为0)
then:
- switch.turn_on: outside_pump
total:
name: "drink water total"
unit_of_measurement: "L"
accuracy_decimals: 2
filters: #水泵0.055g(mL)/pulse,total的单位为pulse,相乘得到mL单位,再/1000得到L
- lambda: |-
x = x * 0.000055;
x = 2.0 - x;
return x ;
#水桶用水量统计
- platform: pulse_meter
pin: GPIO4
unit_of_measurement: 'mL/s'
name: 'replenishment water speed'
id: replenishment_water
internal_filter: 13us
accuracy_decimals: 2
internal: false
timeout: 1s
filters:
- multiply: 0.00091667
on_value_range: #抽不到水的时候 关闭水泵,此值为经过filter的
below: 5.0
then:
if:
condition:
for:
time: 800ms
condition:
sensor.in_range:
id: replenishment_water
below: 10.0
then:
- switch.turn_off: outside_pump
total:
name: "replenishment water total"
unit_of_measurement: "L"
accuracy_decimals: 2
filters:
- lambda: |-
x = x * 0.000055;
id(up_water_now) = x;
id(replenishment_water_remaining) = 19.0-x;
return x ;
- platform: template
name: "replenishment water remaining"
unit_of_measurement: "L"
accuracy_decimals: 2
lambda: |-
return id(replenishment_water_remaining);
update_interval: 1s
binary_sensor:
#内置水泵工况
- platform: gpio
pin:
number: GPIO12
inverted: true
name: "internal pump"
id: internal_pump
internal: true #仅内部使用,不开放到HA
#按键
- platform: gpio
pin:
number: GPIO2
inverted: true
mode:
input: true
pullup: true
name: "water dispenser button"
internal: true #仅内部使用,不开放到HA
on_multi_click:
- timing:
- ON for at most 1s
- OFF for at least 0.5s
then:
- switch.toggle: outside_pump
- logger.log: "[Single Click] toggle pump"
- timing:
- ON for 1s to 3s
- OFF for at least 0.5s
then:
- pulse_meter.set_total_pulses: #清空的是脉冲数
id: drink_water
value: '0'
- logger.log: "[Single Long Click] set drink water total value to 2.0"
- timing:
- ON for at most 1s
- OFF for at most 0.3s
- ON for at most 1s
- OFF for at least 0.2s
then:
- globals.set:
id: up_water_last
value: '0.0'
- pulse_meter.set_total_pulses: #清空的是脉冲数
id: replenishment_water
value: '0'
- logger.log: "[Double Click] set replenishment water remaining value to 19.0"
switch:
#外置水泵开关 开放到HA 可以手动补水
- platform: gpio
pin: GPIO13
name: "outside pump"
id: outside_pump
on_turn_on: #打开后,本次加水超过2.0L,自动停止
- wait_until:
condition:
lambda: |-
return id(up_water_now)-id(up_water_last) > 2.0;
timeout: 143s #13mL/s+的流速,143秒即可达到2L
- switch.turn_off: outside_pump
on_turn_off:
- pulse_meter.set_total_pulses:
id: drink_water #重置水箱水量
value: '0'
- lambda: |-
id(up_water_last) = id(up_water_now);
time:
- platform: sntp
id: my_time
大部分都在代码里注释了,几点说明一下:
3.1、使用pulse_meter而不是pulse_counter,因为后者的瞬时流量是每个update_time才会上报(平均),而前者在每个脉冲来的时候都会刷新;另外前者的total具有重置功能,后者没有
3.2、大概逻辑是:检测到原水泵流量小&&水泵驱动信号还在=水箱没水了---->打开外置补水泵的开关---->此时开始统计加了多少水,达到2L,关掉水泵、重置水箱
3.3、因为里面加了个开关,开关单击开关水泵,长按重置水箱、双击重置外部水桶
【安装&成品】
【todo】
HA前端做个图形展示的界面
【说明】
本打算完全开源的,包括原理图 PCB啥的,但是上面有些公司信息 放出来还得删掉,意义也不是很大
根据截图在立创EDA搜索元器件很快就可以画好
PCB对大家也没啥价值吧,毕竟大家也不会用到我这个水泵
这里只是提供一个思路,大家玩玩就好
【感谢】
媳妇把吸奶器的吸气管子贡献给我了
|