干燥和断线要有不同电气输入
普通数字水滴板常把干燥输出与断线后的默认电平混在一起,只改YAML名称无法补出线路诊断。本例固定DFRobot SEN0121模拟湿敏板:3.3V供电时AO标称0–3.0V,表面越湿输出越高;它不是水深/湿度百分比仪,也不保证所有水质都同样响应。
在探头端加入偏置,把有效干/湿放到中间电压,而SIG或整探头插头断开时让控制器端下拉到约0V。监督范围只包含这些开路情形,不覆盖GND单独断开、内部卡死、腐蚀或短路恰好落进有效窗等全部故障。作品同时给本地灯和HA状态,不作为唯一防漏措施。
- 做到这里,你应该看到
- 能指明本设计检测哪一种断线,以及哪些故障仍可能落进有效电压。
参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现
把两只偏置电阻放在会一起拔走的探头端
新版本SEN0121插头针序有更新,按本板VCC/GND/AO标识断电追线,不照旧图线色/方向猜。VCC接3V3/J1-1、GND接J1-22;AO经R_A=100k、VCC经R_B=100k汇到编码SIG,再走线到GPIO7/J1-7。R_A/R_B必须位于可拔连接器的探头侧。
控制器GPIO7端保留R_C=100k到地和100nF到地,三个电阻均±1%/0.25W。GPIO7是S3 ADC1_CH6;GPIO4经330Ω/WP7113ID作普通LED。先≤30cm短线与单条桥USB;只让探头铜箔触水,连接器/电子部分/USB在托盘外保持干燥,不把5V送进这条3.3V回路。
| 位置 | 端点 |
|---|---|
| 探头VCC | 板3V3;经100k R_B到SIG |
| 探头AO | 经100k R_A到同一SIG |
| SIG | 编码后到GPIO7 / J1-7 |
| 控制器GPIO7 | 100k R_C及100nF到GND,必须留下 |
| GPIO4 / J1-4 | 330Ω→WP7113ID阳极;阴极GND |
- 做到这里,你应该看到
- 拔掉探头后只剩控制器本地下拉;不能把偏置误留控制器上。
参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[5] ESPHome2026.9.1 S3 ADC1 GPIO7到channel6映射[8] 指定DevKitC-1 v1.1排针、USB及存储范围[9] WP7113ID普通红LED器件手册
先算名义值,再核完整回路的实际窗口
等阻且AO能在负载下维持输出时,V_SIG=(V_AO+3.3V+0)/3;干约1.1V、较湿约2.1V,SIG/整插头开路约0V。这个推导不等于实测,AO有微安级负载、供电误差、ADC和污染/水导电性都会影响结果。必须用万用表与完整回路的真实干/湿样本核定,窗重叠或不稳定时先改探头/安装/电路,不放宽参数掩盖未知。
例程用GPIO7 ADC1、12dB、16次平均、每秒更新;检查启动Calibration/Overall Init,失败或跨界误差先修测量链,日志三位小数不是精度。固定0.90…1.35V为DRY、1.60…2.20V为WET,其他值及NaN均FAULT;中间模糊区不猜干燥。有效类别连续3次才确认,切换期间CHECKING;无ADC样本超过5秒也是FAULT。
- 做到这里,你应该看到
- 固定窗有名义来由,也有待实物核定的明确门槛。
参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现[5] ESPHome2026.9.1 S3 ADC1 GPIO7到channel6映射
完整YAML:质量状态先于漏水布尔值
环境固定Python3.12.13、ESPHome2026.9.1/IDF5.5.5,完整依赖记录随包。复制私有secrets并生成自己的32字节base64 key,先config/compile再桥USB写入;YAML和leak_logic.h不可分开复制。GPIO4有效湿常亮、有效干灭、FAULT/CHECKING半秒交替;它是应执行的本地命令,没有本站光学结果。
Input Valid与Circuit State单独发布。Wet Raw在非WET时为off,不能直接拿它表示“安全干燥”;下一节HA包装实体使用Valid控制可用性。wifi/api重启超时0s让网络断开不因此复位,本地ADC/LED继续工作,没有远程通知或离线历史补录已成功的声明。
esphome:
name: hixinwu-s07
friendly_name: Hixinwu S07
min_version: 2026.9.1
includes:
- leak_logic.h
esp32:
board: esp32-s3-devkitc-1
variant: ESP32S3
flash_size: 8MB
flash_mode: qio
flash_frequency: 80MHz
toolchain: esp-idf
framework:
type: esp-idf
version: 5.5.5
psram:
mode: octal
speed: 80MHz
logger:
baud_rate: 115200
hardware_uart: UART0
level: DEBUG
api:
encryption:
key: !secret api_key
reboot_timeout: 0s
ota:
- platform: esphome
encryption:
key: !secret api_key
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
reboot_timeout: 0s
ap:
ssid: "hixinwu-s07 Recovery"
password: !secret fallback_password
ap_timeout: 90s
captive_portal:
switch:
- platform: gpio
id: indicator
pin: GPIO4
internal: true
restore_mode: ALWAYS_OFF
sensor:
- platform: adc
id: loop_voltage
name: "Loop Voltage"
pin: GPIO7
attenuation: 12db
samples: 16
sampling_mode: avg
update_interval: 1s
on_value:
then:
- lambda: |-
s07::controller().update(x,millis());
ESP_LOGI("S07","v=%.3f state=%s; nominal bounds need real circuit qualification",x,s07::controller().label());
binary_sensor:
- platform: template
id: input_valid
name: "Input Valid"
entity_category: diagnostic
- platform: template
id: wet_report
name: "Wet Raw"
device_class: moisture
text_sensor:
- platform: template
id: circuit_state
name: "Circuit State"
interval:
- interval: 100ms
then:
- lambda: |-
auto &c=s07::controller();c.tick(millis());
if(c.led(millis()))id(indicator).turn_on();else id(indicator).turn_off();
id(input_valid).publish_state(c.valid());
id(wet_report).publish_state(c.wet());
id(circuit_state).publish_state(c.label());
参考:[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现[5] ESPHome2026.9.1 S3 ADC1 GPIO7到channel6映射[8] 指定DevKitC-1 v1.1排针、USB及存储范围
确认、故障、陈旧与恢复使用同一份代码
下面leak_logic.h既进入真实固件,也用于主机合成电压检查。FAULT立即关闭Valid;新的DRY/WET类别要连续3次,恢复也一样,避免一次边界抖动被说成正常。时间差采用uint32差值,5秒看的是ADC回调新鲜度,不是远端探头内部自检。
主机实际检查理想干/湿/开路、模糊/NaN、三次确认、无样本/陈旧、恢复和回绕;不模拟AO输出阻抗、分压误差、ADC或水导电性。真实水触发延迟还包括探头、1秒更新、平均和确认,不能声称毫秒级防漏。
// SPDX-License-Identifier: MIT
#pragma once
#include <stdint.h>
#include <math.h>
namespace s07 {
enum class Kind {FAULT,DRY,WET,CHECKING};
inline Kind classify(float v){
if(!isfinite(v))return Kind::FAULT;
if(v>=0.90f&&v<=1.35f)return Kind::DRY;
if(v>=1.60f&&v<=2.20f)return Kind::WET;
return Kind::FAULT;
}
struct Controller{
Kind state=Kind::CHECKING,candidate=Kind::CHECKING;uint8_t count=0;uint32_t last=0;bool seen=false;
void update(float voltage,uint32_t now){
last=now;seen=true;Kind next=classify(voltage);
if(next==Kind::FAULT){state=Kind::FAULT;candidate=next;count=0;return;}
if(next!=candidate){candidate=next;count=1;}else if(count<3)++count;
state=count>=3?candidate:Kind::CHECKING;
}
void tick(uint32_t now){if((uint32_t)(now-last)>5000){state=Kind::FAULT;candidate=Kind::FAULT;count=0;}}
bool valid()const{return state==Kind::DRY||state==Kind::WET;}
bool wet()const{return state==Kind::WET;}
const char* label()const{return state==Kind::DRY?"DRY":state==Kind::WET?"WET":state==Kind::FAULT?"FAULT":"CHECKING";}
bool led(uint32_t now)const{return wet()||(!valid()&&((now/500)%2));}
};
inline Controller& controller(){static Controller value;return value;}
}
- 做到这里,你应该看到
- 同一模型不允许FAULT/CHECKING被包装成正常dry。
参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现
HA把故障显示成不可用,保留本地提示
用H01步骤添加ESPHome真实IP/key,核对Loop Voltage、Input Valid、Wet Raw、Circuit State的实际entity_id。把完整ha-package.yaml放HA packages,合并已有homeassistant/packages入口后执行HA自己的配置检查与重载。模板中的实体名是示例,若实际ID不同先替换。
包装Leak只有Input Valid=on才可用;FAULT/CHECKING或节点离线时unavailable,避免原始Wet Raw的off被解释为没漏。先在开发者工具观察这条链,再另测用户自己的通知路径;本文仅做package语法检查,没有真实HA集成、通知、自动化或手机结果。
# Check actual source entity IDs in your HA before enabling this package.
template:
- binary_sensor:
- name: "Hixinwu S07 Leak"
unique_id: hixinwu_s07_leak_checked
device_class: moisture
availability: "{{ is_state('binary_sensor.hixinwu_s07_input_valid', 'on') }}"
state: "{{ is_state('binary_sensor.hixinwu_s07_wet_raw', 'on') }}"
- 做到这里,你应该看到
- 故障时看包装Leak=unavailable与Circuit State,不只看原始off。
参考:[6] HA Core2026.10.2模板binary_sensor状态与availability[7] HA Core2026.10.2 availability计算与实体可用性
先用确定电阻输入验分类,再把真实探头接回
断电移除探头支路,保留控制器100k与100nF,分压上端接3V3、下端接GND、中点到GPIO7。表中已计100k与下端并联;每次改线断电或预装明确低压开关。输入桩只检ADC/分类/HA路径,不证明真实水质或探头有效。
然后恢复探头端R_A/R_B,记录真实干燥、受控少量自来水触铜箔、擦干/自然干燥恢复。已有有效样本后操作断电预装的SIG支路SPST,应下一ADC更新变FAULT、故障闪、包装不可用;闭合后连续3个有效样本恢复。另做冷启动缺探头,不能把它代替已有样本后开路。高纯水、污染和腐蚀会改变输出,真实窗不合格时不能填通过。
| 输入桩 | 上/下端电阻±1% | 名义GPIO7(计本地100k) | 应确认 |
|---|---|---|---|
| 干 | 20k /10k | 约1.03V | 3次后DRY |
| 湿 | 10k /15k | 约1.87V | 3次后WET |
| 模糊 | 12k /10k | 约1.42V | FAULT |
| 开路 | 无额外上/下端 | 本地100k下拉约0V | FAULT |
- 做到这里,你应该看到
- 电阻桩和真实触水是两个验收层,断线有具体开关与输入。
参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现
若拔线仍显示干,先查电阻位置与实体选择
先看是否把R_A/R_B留在了控制器端、是否操作的真是SIG、是否误看Wet Raw而非包装实体;永远0看共地/ADC端点/开关,一直FAULT拿表比较真实电压与Calibration日志。不要把未知窗扩大到所有电压,不用重刷或改水滴阈值掩盖线路错误。恢复基准为断电回到表中电路与原完整YAML,再桥USB重写。
另验断Wi-Fi/停止HA:本地仍提示,网络恢复后的实体当前状态不等于过去通知都送达。本站实际构建与同源主机检查单独留证,所有触水/断线/本地灯/HA动作尚未执行,CSV为空。本项目不作为唯一防漏措施。
clang++ -std=c++17 -Wall -Wextra -Werror host_check.cpp -o /tmp/s07-host
/tmp/s07-host参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现[6] HA Core2026.10.2模板binary_sensor状态与availability[7] HA Core2026.10.2 availability计算与实体可用性[8] 指定DevKitC-1 v1.1排针、USB及存储范围
资料来源与版本说明
实际读取固定版本源码/器件资料,构建与主机逻辑分别留证。本站未完成烧录、GPIO/ADC/光学/传感器或HA运行;电路名义值与软件命令不冒充实测。资料核对日期:。资料核对、程序构建与实板测试分别记录,不互相替代。
- DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界
- DFRobot SEN0121当前产品:新插头针序与湿润输出方向
- ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询
- ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现
- ESPHome2026.9.1 S3 ADC1 GPIO7到channel6映射
- HA Core2026.10.2模板binary_sensor状态与availability
- HA Core2026.10.2 availability计算与实体可用性
- 指定DevKitC-1 v1.1排针、USB及存储范围
- WP7113ID普通红LED器件手册