本帖最后由 polisher 于 2024-6-10 18:14 编辑
一、背景
养了2缸小鱼,夏季燥热必须得冷水机伺候,为了接入HA特意对温控器进行了重新设计,没什么技术含量,算是供友友们复刻方便特发此贴。温控器可带20A的负载,代码稍作调整,即可实现冷热控制。该温控器备用了很多IO口,可增加水位检测、TDS检测等功能,如友友有兴趣,我再贴上相关电路和代码。
二、成品
三、原理图
显示屏
1. 元件的选用和电路的设计主要根据手里的现有材料,友友们可自行按实际情况调整;
2. 该电路板适用于12V输入,可装入STC-1000、STC-100、STC-200、STC-8080、STC-9100等温控器中,可自行根据尺寸选择;
3. 数码管采用了FJ5422BH,非常适合温度显示,但由于码段属于非标,不能直接用ESPHome的数码管驱动组件,特对代码做了适配,请通过外部组件方式调用,请在此处下载附件(
tm1637-6c.zip
(5.77 KB, 下载次数: 5)
)
3. 工程项目分享嘉立创,方便友友们白嫖(点击这里)
4. 不妥之处,望各位友友不吝赐教。
四、主要物料
序号 | 名称 | 型号 | 描述 | 参考单价(元) | 1 | 数码管 | FJ5422BH | 4位0.5英寸 超高红 共阳 带温度符号数 | 2 | 2 | 轻触开关 | | 6*6*5mm | 0.25 | 3 | 数码管驱动 | TM1637 | SOP-20 | 1.56 | 4 | 继电器 | HF152F/012-1HST | 12V,20A | 3.5 | 5 | 螺钉式接线端子 | DB125-2.54-9P | 直插,间距2.54mm,1x9P | 5 | 6 | 螺钉式接线端子 | KF300-5.0-2P | 直插,间距5mm,1x2P | 0.54 | 7 | WiFi模块 | ESP32-C3-MINI-1 | 焊接有些难度 | 10.8 | 8 | 降压模块(LDO) | 12V-5V | 查看链接 | 2.1 | 9 | 降压模块(DCDC) | 5V-3.3V | 查看链接 | 0.47 | 10 | 温度传感器 | DS18B20防水型 | 也可以用NTC热敏电阻,代码自行调整 | 2.46 | 11 | 温控器 | STC-1000 | 这货外壳5元(阿里),整机11.5元(淘宝) | | 五、部分ESPHome代码(论坛的代码添加不会用。很好奇,论坛管理员大佬为什么不优化一下这个功能)
ESPhome代码.txt
(4.62 KB, 下载次数: 13)
captive_portal:
external_components:
- source: mycomponents
substitutions:
device_name: Wkq
RELAY_COOL: GPIO5 #制冷器继电器
RELAY_FAN: GPIO4 #风扇继电器
DS18B20_WATER: GPIO2 #水温温度传感器
DS18B20_COOL: GPIO3 #制冷器散热片温度传感器
BACKUP_IO_1: GPIO10 #备用IO口(WL)
BACKUP_IO_2: GPIO0 #备用IO口
BACKUP_IO_4: GPIO1 #备用IO口
S_DA: GPIO18 #数码管控制SDA
S_CL: GPIO19 #数码管控制SCL
globals:
# 运行状态
- id: workstate
type: bool
restore_value: no
initial_value: "false"
# 设置状态
- id: setupstate
type: bool
restore_value: no
initial_value: "false"
switch:
- platform: gpio
pin: $RELAY_COOL
name: "${device_name} cool"
id: relay_cool
- platform: gpio
pin: $RELAY_FAN
name: "${device_name} fan"
id: relay_fan
binary_sensor:
- platform: tm1637-6c
internal: True
id: key0
name: key power
tm1637_6c_id: tm1637_display
key: 8
on_click:
- if:
condition:
- lambda: 'return id(workstate) ;'
then:
- climate.control:
id: water_thermostat
mode: "OFF"
else:
- climate.control:
id: water_thermostat
mode: "COOL"
- platform: tm1637-6c
internal: True
id: key1
name: key setup
tm1637_6c_id: tm1637_display
key: 9
on_click:
- if:
condition:
- lambda: 'return id(setupstate) ;'
then:
- lambda: id(setupstate)=false;
else:
- lambda: id(setupstate)=true;
- platform: tm1637-6c
internal: True
id: key2
name: key up
tm1637_6c_id: tm1637_display
key: 10
on_click:
- if:
condition:
- lambda: 'return id(setupstate) ;'
then:
- lambda: id(water_thermostat).target_temperature=id(water_thermostat).target_temperature+0.1;
- platform: tm1637-6c
internal: True
id: key3
name: key down
tm1637_6c_id: tm1637_display
key: 11
on_click:
- if:
condition:
- lambda: 'return id(setupstate) ;'
then:
- lambda: id(water_thermostat).target_temperature=id(water_thermostat).target_temperature-0.1;
display:
platform: tm1637-6c
id: tm1637_display
clk_pin: $S_CL
dio_pin: $S_DA
length: 4
inverted: false
# F运行;|设置
update_interval: 500ms
lambda: |-
static int i = 0;
i++;
if (id(setupstate)){
//如果为设置状态,则数码管闪烁。
if ((i % 2) == 0)
it.printf("|%2.1f", id(water_thermostat).target_temperature);
else
it.print("|");
}else{
char ch = '|';
//如果制冷器继电器打开,数码管cool处显示制冷运行标识
if (id(relay_cool).state)
if (id(water_temperature).state<0)
ch = '+';
else
ch = '#';
//如果风扇继电器打开,数码管heat处显示风扇运行标识
if (id(relay_fan).state)
if (id(water_temperature).state<0)
ch = '/';
else
ch = '$';
//如果制冷器继电器与风扇继电器都打开,则数码管显示制冷与风扇运行标识
if (id(relay_fan).state && id(relay_cool).state)
if (id(water_temperature).state<0)
ch = '<';
else
ch = '&';
it.printf(0,"%c",ch); //1位数码管显示信息(运行标识、正负符号、℃)
it.printf(1,"%2.1f", abs(id(water_temperature).state)); //2、3、4位数码管显示当前温度值
}
sensor:
- platform: dallas
index: 0
id: water_temperature
dallas_id: hub1
name: "${device_name} Water Temperature"
dallas:
- pin: $DS18B20_WATER
update_interval: 1s
id: hub1
climate:
- platform: thermostat
name: "${device_name} Water Thermostat"
id: water_thermostat
entity_category: config
cool_deadband: 1
cool_overrun: 0
sensor: water_temperature
on_boot_restore_from: memory
min_cooling_off_time: 0s
min_cooling_run_time: 0s
min_idle_time: 0s
cool_action:
- switch.turn_on: relay_cool
- lambda: id(workstate)=true;
idle_action:
- switch.turn_off: relay_cool
- lambda: id(workstate)=false;
|