『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 3391|回复: 18

[基础教程] 基于esphome+自制硬件的即热饮水机自动补水方案

[复制链接]

39

主题

2076

帖子

7781

积分

元老级技术达人

积分
7781
金钱
5690
HASS币
110
发表于 2022-4-18 15:12:20 | 显示全部楼层 |阅读模式
本帖最后由 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控制),两个继电器(和本项目无关)
6a61cf5f1a72b000a18493eb980d0b2.jpg 3189354b9c4f65226e54390954cbbf7.jpg c4264cf4d617b1056a01494f091a7d6.jpg
2、自制硬件,附上原理图(嗯...这里用到的封装信息有一些包含了公司信息,所以暂时不放出源文件了)
微信截图_20220418121502.png
稍微讲一下
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 立创白嫖
微信截图_20220418121535.png 微信截图_20220418121548.png 微信截图_20220418121602.png

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、因为里面加了个开关,开关单击开关水泵,长按重置水箱、双击重置外部水桶

【安装&成品】
e52046678d9c522163c66fa27c4db8f.jpg bd1a335d90d59a83ac464af002a432c.jpg


【todo】
HA前端做个图形展示的界面

【说明】
本打算完全开源的,包括原理图 PCB啥的,但是上面有些公司信息 放出来还得删掉,意义也不是很大
根据截图在立创EDA搜索元器件很快就可以画好
PCB对大家也没啥价值吧,毕竟大家也不会用到我这个水泵
这里只是提供一个思路,大家玩玩就好

【感谢】
媳妇把吸奶器的吸气管子贡献给我了




评分

参与人数 3金钱 +35 HASS币 +20 收起 理由
daem + 5 虽然看不懂,但感觉很厉害的样子。.
wormshow + 10 膜拜大神!
+ 20 + 20 厉害了word楼主!

查看全部评分

回复

使用道具 举报

27

主题

2103

帖子

8552

积分

论坛元老

Rank: 8Rank: 8

积分
8552
金钱
6444
HASS币
30

论坛元老

发表于 2022-4-18 15:37:57 | 显示全部楼层
论新装修,管线机的必要性
回复

使用道具 举报

27

主题

2103

帖子

8552

积分

论坛元老

Rank: 8Rank: 8

积分
8552
金钱
6444
HASS币
30

论坛元老

发表于 2022-4-18 15:53:05 | 显示全部楼层
这种热水器24小时运行得多少电呀
回复

使用道具 举报

39

主题

2076

帖子

7781

积分

元老级技术达人

积分
7781
金钱
5690
HASS币
110
 楼主| 发表于 2022-4-18 16:07:12 | 显示全部楼层
情非殇 发表于 2022-4-18 15:53
这种热水器24小时运行得多少电呀

即热的呀 喝多少 烧多少
因为不一定是烧开 所以都加“大自然的搬运工”
回复

使用道具 举报

9

主题

534

帖子

4436

积分

元老级技术达人

积分
4436
金钱
3892
HASS币
60
发表于 2022-4-18 18:03:08 | 显示全部楼层
感谢分享,有个疑问,这种泵抽水量准确吗?如果水箱里面原来没有用完,再手动加水会不会溢出? 是不是需要再加个判断?
回复

使用道具 举报

27

主题

2103

帖子

8552

积分

论坛元老

Rank: 8Rank: 8

积分
8552
金钱
6444
HASS币
30

论坛元老

发表于 2022-4-18 19:10:59 | 显示全部楼层
ghostist 发表于 2022-4-18 16:07
即热的呀 喝多少 烧多少
因为不一定是烧开 所以都加“大自然的搬运工”

卧槽,看错了,哈哈哈
回复

使用道具 举报

8

主题

158

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
金钱
1041
HASS币
0
发表于 2022-4-18 20:57:38 | 显示全部楼层
谢谢分享
回复

使用道具 举报

39

主题

2076

帖子

7781

积分

元老级技术达人

积分
7781
金钱
5690
HASS币
110
 楼主| 发表于 2022-4-18 22:34:17 | 显示全部楼层
sangood 发表于 2022-4-18 18:03
感谢分享,有个疑问,这种泵抽水量准确吗?如果水箱里面原来没有用完,再手动加水会不会溢出? 是不是需要 ...

水量还是比较准确的
另外我触发加水是水箱没水才会触发,加2L不会溢出
回复

使用道具 举报

23

主题

660

帖子

3108

积分

论坛元老

Rank: 8Rank: 8

积分
3108
金钱
2448
HASS币
10
发表于 2022-4-19 02:10:08 | 显示全部楼层
我改了两个,是低水量全自动烧水,然后冷却,加入即热饮水机的。
两个方案有点差异,但是都完美运行了很久,一个一年多,一个快半年。
如果不用烧水,那就简单多了。要是直连纯水桶(有足够压力),直接在水箱加个浮球水阀直连就行了。。。
回复

使用道具 举报

39

主题

2076

帖子

7781

积分

元老级技术达人

积分
7781
金钱
5690
HASS币
110
 楼主| 发表于 2022-4-19 08:57:37 | 显示全部楼层
wshc1216 发表于 2022-4-19 02:10
我改了两个,是低水量全自动烧水,然后冷却,加入即热饮水机的。
两个方案有点差异,但是都完美运行了很久 ...

之前看过你分享的流
我这个自动化逻辑比较简单,直接在esphome里就实现了(也避免HA NR失效导致补水失败)
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-17 14:01 , Processed in 0.595788 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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