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

 找回密码
 立即注册
查看: 16532|回复: 81

[硬件DIY] ESPHOME接入太阳能热水器自动控制器

  [复制链接]

3

主题

56

帖子

402

积分

论坛分享达人

积分
402
金钱
341
HASS币
20
QQ
发表于 2022-11-18 16:44:28 | 显示全部楼层 |阅读模式
本帖最后由 zbsyouran 于 2022-11-25 19:48 编辑

前段时间逛论坛看到一个网友问怎么用ESPHOME获取太阳能热水器的温度和水位,正好我也刚给家里的太阳能热水器加了个控制器,索性做一个吧。
我为了节省成本,用的合宙的ESP32C3的板子,12.9包邮确实不错,但是有坑,ESPHOM编译起来太坑了,而且某宝店铺配的pinout示意图竟然都是错的,最后在官网资料里找到正确的,害得我来回改了好几次,真是天坑。这个板子,就是便宜,搞LuatOS还不错。
目前基本完美,使用原控制器自带的4线传感器,跟原控制器同步显示水温、水位、上水反馈、加热反馈,同时能控制自动上水、自动加热且互不影响
功能。水温显示与原控制器相差±2℃,追求完美的话可以在代码里细调。水位显示的话,我这个传感器跟市面上的好像不太一样,阻值跟网上的资料
不一致,但用在我的代码里是正确的,目前看显示准确,后期在代码里加上温度补偿会更精准。
如果需要同时测量浴室的温湿度显示的话,直接接一个DHT11就好了,空闲许多IO可用,我接了个BMP280集成AHT20,能同时显示浴室温度、湿度和
大气压,虽然没什么卵用...

成品演示:【ESP32太阳能热水器接入HomeAssistant成品演示】https://www.bilibili.com/video/B ... 62a51ae934524bc0475

2022.11.25更新:V1.2版打板文件,更新了个小BUG,I2C接口可以用默认的4,5接口了, 之前修改到了RX,TX,有BUG。
Gerber_PCB_太阳能热水器ESP32C3接入HA_V1.2.zip (167.88 KB, 下载次数: 52)

这是HA显示页面,可控制同时有反馈。
微信截图_20221118141913.png

组装后与控制器相连。这里需要注意下接线位置,我在代码里和原理图里都详细说明了接线位置,同时要测量控制器的
单片机引脚输出电压,我这个控制器输出4V左右,控制引脚、LED指示和反馈引脚都加了限流电阻,但也需要根据不同
的控制器输出电压更换限流电阻。

(注意!!!控制器内有220V强电!谨慎操作!一切操作在断电后执行!!!)
(注意!!!控制器内有220V强电!谨慎操作!一切操作在断电后执行!!!)
(注意!!!控制器内有220V强电!谨慎操作!一切操作在断电后执行!!!)

测量和接线需要基本电路知识方可操作,安全起见,在测量时可用闲置路由器等12V电源接出2跟正负极连接到控制器内12V接线处,
这样可以不用接220V就能让控制器开机,方便我们接线和实验。(不同控制器的变压器输出电压不一定是12V,以实物测量为准。)
IMG_20221116_224357.jpg IMG_20221116_224457.jpg

固定在右侧刚好放下,我这个控制器内部空间不小。为了布线整齐,ESP32C3和转接板之间没有用排母,直接焊接的。
三个接线端子,其中两个接传感器的是2X2P圆排针和圆排母,某宝找了一圈就几家卖双排弯针且很贵,立创商城也很
贵,我索性就用普通的了,好在控制器空间够大也不影响接线。我用的是第二版,第三版已经改成正确的端子了,(
下面3D图中的就是)。
IMG_20221116_231019.jpg

转接板的立创EDA的3D图。
微信截图_20221118142757.png


原理图,很简单,2个ADC分压电路,1个模拟开关切换传感器输入设备,画的简陋望大神轻拍。
微信截图_20221118144518.png
打板文件可以在下面链接里的立创开源广场下载,BOM表也在,推荐有动手能力的可以试试。
V1.1 ESP32太阳能热水器接入Homeassistant - 嘉立创EDA开源硬件平台 (oshwhub.com)

ESPHOME代码:
esphome:
    name: "esp32c3-solar"
    platformio_options:
        board_build.flash_mode: dio
        board_build.mcu: esp32c3
esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf
    version: recommended
    # Custom sdkconfig options
    sdkconfig_options:
      CONFIG_COMPILER_OPTIMIZATION_SIZE: y
    # Advanced tweaking options
    advanced:
      ignore_efuse_mac_crc: false

logger:
    hardware_uart: USB_SERIAL_JTAG
    level: DEBUG # defaults to DEBUG, NONE ERROR WARN INFO DEBUG VERBOSE VERY_VERBOSE# Enable Home Assistant API
api:
  encryption:
    key: "QOzVYQ5D0uTaxu+rGfVmG9HgJ55oiatKDFythKbXyg4="

ota:
  password: "0efa16a5fd81d0596ef310af99fd0d8a"

wifi:
  ssid: XGBB
  password: xgbb2325158

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32C3 Fallback Hotspot"
    password: "Wm2xW9axwnZU"

i2c:
  sda: 20
  scl: 21
  scan: true
  id: bus_a

switch:
  - platform: gpio
    pin: 3 ##接自动上水按键触发端
    name: "1上水开关"
    id: water
    on_turn_on: ##创建瞬时开关
    - delay: 200ms
    - switch.turn_off: water
    inverted: true

  - platform: gpio
    pin: 5 ##接自动加热按键触发端
    name: "2加热开关"
    id: heating
    on_turn_on: ##创建瞬时开关
    - delay: 200ms
    - switch.turn_off: heating
    inverted: true

  - platform: gpio
    pin: 6 ##CH440G模拟开关SET端
    name: "3CH440G_SET"
    id: CH440G_SET
    #inverted: true

binary_sensor: #二进制传感器,获取状态
  - platform: gpio
    name: "4上水反馈" #接单片机上水控制脚
    pin:
      number: 18
      mode:
        input: true
        pulldown: true
    device_class: opening

  - platform: gpio
    name: "5加热反馈" #接单片机加热控制脚
    pin:
      number: 10
      mode:
        input: true
        pulldown: true
    device_class: opening

sensor: 
  - platform: bmp280
    temperature:
      name: "1 BMP280 temperature"
      oversampling: 16x
    pressure:
      name: "2 BMP280 pressure"
    update_interval: 5s
  
  - platform: aht10
    temperature:
      name: "1 AHT20 temperature"
    humidity:
      name: "1 AHT20 humidity"
    update_interval: 10s
 
  - platform: ntc  # 》水温检测参数《
    sensor: resistance_sensor #
    calibration:
      b_constant: 3435 #NTC的B值
      reference_temperature: 25°C #NTC标称温度参数
      reference_resistance: 10kOhm #NTC标称温度阻值
    name: "6solar_水温"
    #device_class: "battery" #更改设备类型
    accuracy_decimals: 1 #更改小数点位数

  # Example source sensors:
  - platform: resistance
    id: resistance_sensor
    sensor: source_sensor
    configuration: DOWNSTREAM
    resistor: 5.024kOhm #分压电阻阻值
    #name: "9solar_水温阻值"

  - platform: adc
    id: source_sensor
    pin: GPIO4
    #name: "10ADC水温_采样电压"
    update_interval: never  # never update
    #accuracy_decimals: 0 #更改小数点位数
    attenuation: 11db

  - platform: adc  # 》水位检测参数《
    id: solar_level
    pin: GPIO0
    name: "7solar_水位"
    unit_of_measurement: "%" #更改测量单位
    accuracy_decimals: 0 #更改小数点位数
    attenuation: 6db #ADC衰减值
    update_interval: never  # never update
    filters:
    - multiply: 66.13 #ADC电压比例设置(66.13为合宙ESP32C3放大比例,合宙ESP32C3的ADC默认衰减0DB满量程电压为0.83V,(ESP32理应为1.1V,不知为何我这个合宙ESP32是0.8V))
    - lambda: |-  #水位逻辑判断
        if ( x <= 49 ) {
        return x = 100;    
        } else if (x <= 62.5) {
        return x = 80;
        } else if (x <= 76.3) {
        return x = 50;
        } else if (x <= 88.68) {
        return x = 25;
        } else {
        return x = 0;
        }

interval:
  - interval: 60s 
    then:
      - switch.turn_on: CH440G_SET
      - component.update: source_sensor
      - component.update: solar_level
      - switch.turn_off: CH440G_SET

##水温检测串联电阻阻值设置为5.1kohm,10k_b3435传感器在-10℃时阻值为43.12kohm,在110℃时阻值为0.761kohm,
#此时采样电压在-10℃时为2.957v,在110℃时为0.435v。#(此参数为ESP32设计,ADC采样电压范围在未设置衰减时
#为0-1.1V;使用ESP8266核心板时需更改分压电阻以匹配其0-1V#采样电压范围;nodemcu则为0-3.3V(A0引脚已有分压电阻。)

##水位检测串联电阻阻值设置为150kohm,水位传感器在0%时阻值大约在45kohm-∞ohm浮动,此时采样电压为0.76V-1.1V;
#20%时阻值大约在25kohm-45kohm浮动,此时采样电压为0.47V-0.76V;50%时阻值大约在15kohm-25kohm浮动,此时采样
#电压为0.3V-0.47V;80%时阻值大约在5kohm-15kohm浮动,此时采样电压为0.1V-0.3V;100%时阻值大约在0.5kohm-5kohm
#浮动,此时采样电压为0.01V-0.1V;(实际显示时根据multiply参数等比放大并计算后显示为百分比)

    











IMG_20221116_224511.jpg

评分

参与人数 5金钱 +58 HASS币 +20 收起 理由
book123 + 8 论坛有你更精彩!
Smilence + 5
dscao + 20 感谢楼主分享!
daem + 5 大神666!
+ 20 + 20 高手,这是高手!

查看全部评分

回复

使用道具 举报

27

主题

2143

帖子

8930

积分

论坛元老

Rank: 8Rank: 8

积分
8930
金钱
6782
HASS币
30

论坛元老

发表于 2022-11-18 17:00:45 | 显示全部楼层
请教下,adc - 热敏电阻,从0开始是什么思路,如何搭配设计计算分压电阻阻值啥的
回复

使用道具 举报

3

主题

56

帖子

402

积分

论坛分享达人

积分
402
金钱
341
HASS币
20
QQ
 楼主| 发表于 2022-11-18 17:14:50 | 显示全部楼层
情非殇 发表于 2022-11-18 17:00
请教下,adc - 热敏电阻,从0开始是什么思路,如何搭配设计计算分压电阻阻值啥的 ...

就,2个电阻分压嘛。先确定电源,ESP上一般取3.3V或者5V;再确定并联电阻也就是传感器的阻值范围,再再确定ADC采样电压范围,ESP8266是0-1V,ESP32上是0-1.1V,但可以设置衰减最大到3.3V,另外不同的开发板都不一样,比如8266 nodemcu的板子自带分压电阻,可以直接测量到0-3.3V;然后计算串联电阻阻值就行了,下面图里是个简单的计算器,很方便就能计算。 微信截图_20221118170819.png
回复

使用道具 举报

1

主题

72

帖子

884

积分

高级会员

Rank: 4

积分
884
金钱
812
HASS币
0
发表于 2022-11-18 20:44:43 | 显示全部楼层
来了来了,给力啊
回复

使用道具 举报

27

主题

2143

帖子

8930

积分

论坛元老

Rank: 8Rank: 8

积分
8930
金钱
6782
HASS币
30

论坛元老

发表于 2022-11-18 20:59:28 | 显示全部楼层
本帖最后由 情非殇 于 2022-11-18 21:15 编辑
zbsyouran 发表于 2022-11-18 17:14
就,2个电阻分压嘛。先确定电源,ESP上一般取3.3V或者5V;再确定并联电阻也就是传感器的阻值范围,再再确 ...

谢谢,我最近也是打算搞一下热水器,打算把所有板子拆了重新设计,但是热敏这块没想好怎么弄,结果等来了抄作业了,
请教几个细节,

1)热敏阻值范围就靠加热热水和换上冷水去测试是吧,毕竟这东西好像不好拆

2)您原理图是vcc-分压电阻-2个同样的adc引脚S2A,是画错了么,,我看esphome文档adc示例图是vcc-分压电阻-adc-热敏电阻-gnd这样

3)ntc-calibration里的B值/温度参数/温度阻值,这3个参数,如何跟自己的实际对应呢

4)还有分压电阻值5.024k为啥能这么精确,是因为万用表比较屌么
回复

使用道具 举报

1

主题

72

帖子

884

积分

高级会员

Rank: 4

积分
884
金钱
812
HASS币
0
发表于 2022-11-18 21:10:59 | 显示全部楼层
大佬,我用的ESP12F,只有一个adc口,有什么办法可以同时测量水位和水温?
回复

使用道具 举报

27

主题

2143

帖子

8930

积分

论坛元老

Rank: 8Rank: 8

积分
8930
金钱
6782
HASS币
30

论坛元老

发表于 2022-11-18 21:16:39 | 显示全部楼层
daem 发表于 2022-11-18 21:10
大佬,我用的ESP12F,只有一个adc口,有什么办法可以同时测量水位和水温?

没办法呀,换esp32才会有更多的adc引脚,esp8266就是只有1个adc
回复

使用道具 举报

3

主题

56

帖子

402

积分

论坛分享达人

积分
402
金钱
341
HASS币
20
QQ
 楼主| 发表于 2022-11-18 21:27:45 | 显示全部楼层
daem 发表于 2022-11-18 21:10
大佬,我用的ESP12F,只有一个adc口,有什么办法可以同时测量水位和水温?

呃,理论上是有办法,一个adc的话,分时测量嘛,一种是用模拟开关切换,增加一个模拟开关就行了,另一种办法,水位和水温共用一个引脚,引出两个gpio引脚作为3.3v电源分别开关应该也可以。
回复

使用道具 举报

3

主题

56

帖子

402

积分

论坛分享达人

积分
402
金钱
341
HASS币
20
QQ
 楼主| 发表于 2022-11-18 21:42:53 | 显示全部楼层
情非殇 发表于 2022-11-18 20:59
谢谢,我最近也是打算搞一下热水器,打算把所有板子拆了重新设计,但是热敏这块没想好怎么弄,结果等来了 ...

客气了客气了我也是萌新还在学习中哈!
1) 热敏电阻的话,现在太阳能热水器传感器都是通用的,大部分的参数都是10k NTC 3950k值左右的负温度系数热敏电阻,这个东西随便一搜就有各个温度的阻值表,而且ESPHOME有这个NTC传感器平台,直接代入写参数就行了。
2) 这个没有画错,原理图里得这么画,因为下边那个S2A是接到模拟开关上的,转到PCB的时候就是对的了。
3) NTC的这三个参数,B值是固定的,温度参数也是固定的,你查一下NTC负温度系数电阻的资料就懂了,比如10k NTC 3950k的意思就是这个热敏电阻在25℃时的阻值是10k,3950代表一个温度曲线,不同B值的0℃和100℃是不一样的阻值,虽然它们在25℃时都是10k。我是手动测量的传感器阻值,凉水时测一个阻值,60℃时测一个阻值,再对比NTC的表格找到合适B值的填进去就行了,比如我家里这个传感器跟B值3435k的ntc曲线符合,就填的3435k。
4) 对的,因为水温要求精度比较高么,所以我在贴片以前量的分压电阻阻值,我用的5.1K,但是买的是10%的电阻,肯定有误差,手动量最准确。我用的是4位半的表,比较准确。
回复

使用道具 举报

27

主题

2143

帖子

8930

积分

论坛元老

Rank: 8Rank: 8

积分
8930
金钱
6782
HASS币
30

论坛元老

发表于 2022-11-18 21:51:06 | 显示全部楼层
zbsyouran 发表于 2022-11-18 21:42
客气了客气了我也是萌新还在学习中哈!
1) 热敏电阻的话,现在太阳能热水器传感器都是通用的,大部分的 ...

感谢大佬讲解,基础知识基本了解的差不多了
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 11:08 , Processed in 1.323708 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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