传感器与可信数据 / 传感器应用发布 内容更新

桌面漏水提醒器:传感器断线也要看得出来

给固定SEN0121加探头端偏置与本地下拉,用有效电压窗区分干、湿和SIG/整插头断线,保留本地灯与HA不可用状态。

读完能做什么
给固定SEN0121加探头端偏置与本地下拉,用有效电压窗区分干、湿和SIG/整插头断线,保留本地灯与HA不可用状态。
开始之前
按文中真实前置完成桥USB、模块核对及基本数据/HA集成,再制作本例。
所需器材
S3 DevKitC-1 v1.1 N8R8、DFRobot Gravity SEN0121模拟水滴板/按本板针序、100kΩ±1%0.25W×3,100nF陶瓷电容、WP7113ID普通LED+330Ω±5%0.25W、分类输入用20k/10k/15k/12kΩ±1%电阻及SIG支路低压SPST、≤30cm三线、万用表、浅托盘与少量自来水
版本组合
框架:ESPHome2026.9.1 / ESP-IDF5.5.5Python:3.12.13 / macOS arm64HA参考:Core2026.10.2;runtime pending回路:三100k±1%,GPIO7 ADC1/12dB/16样本
适用范围

官方ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8,Flash8MB、OPI PSRAM;SEN0121只供3.3V;AO编码后GPIO7/J1-7,GPIO4普通LED;只监督SIG线/整插头开路,非全部内部/供电线故障。

这篇验证到了哪一步

资料核对已通过
docs/esp32-evidence/sensors-expanded.md#s07;逐项来源与范围核查验证日期:
构建 / 配置已通过
docs/esp32-evidence/sensors-expanded-esphome-builds.json;实际完整编译Exit0,输入/生成CPP/日志/固件SHA另列。对象:ESP32-S3-DevKitC-1 v1.1 N8R8版本:ESPHome2026.9.1 / ESP-IDF5.5.5验证日期:
仿真不适用
未做器件/芯片/调度仿真;仅以相同C++头文件执行合成输入主机检查,范围另列。
本站实板待验证
无本站烧录、真实传感器/ADC/实体灯或HA运行;observations.csv为空。

构建通过只说明指定环境中的代码或配置通过检查;实物功能、功耗和稳定性以对应的实板记录为准。

01 / 传感器应用

干燥和断线要有不同电气输入

普通数字水滴板常把干燥输出与断线后的默认电平混在一起,只改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:校准/失败/采样实现

02 / 传感器应用

把两只偏置电阻放在会一起拔走的探头端

新版本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
控制器GPIO7100k R_C及100nF到GND,必须留下
GPIO4 / J1-4330Ω→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器件手册

03 / 传感器应用

先算名义值,再核完整回路的实际窗口

等阻且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映射

04 / 传感器应用

完整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及存储范围

05 / 传感器应用

确认、故障、陈旧与恢复使用同一份代码

下面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:校准/失败/采样实现

06 / 传感器应用

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计算与实体可用性

07 / 传感器应用

先用确定电阻输入验分类,再把真实探头接回

断电移除探头支路,保留控制器100k与100nF,分压上端接3V3、下端接GND、中点到GPIO7。表中已计100k与下端并联;每次改线断电或预装明确低压开关。输入桩只检ADC/分类/HA路径,不证明真实水质或探头有效。

然后恢复探头端R_A/R_B,记录真实干燥、受控少量自来水触铜箔、擦干/自然干燥恢复。已有有效样本后操作断电预装的SIG支路SPST,应下一ADC更新变FAULT、故障闪、包装不可用;闭合后连续3个有效样本恢复。另做冷启动缺探头,不能把它代替已有样本后开路。高纯水、污染和腐蚀会改变输出,真实窗不合格时不能填通过。

输入桩上/下端电阻±1%名义GPIO7(计本地100k)应确认
干20k /10k约1.03V3次后DRY
湿10k /15k约1.87V3次后WET
模糊12k /10k约1.42VFAULT
开路无额外上/下端本地100k下拉约0VFAULT
做到这里,你应该看到
电阻桩和真实触水是两个验收层,断线有具体开关与输入。

参考:[1] DFRobot SEN0121厂家手册:3.3V、AO范围、引脚和防水边界[2] DFRobot SEN0121当前产品:新插头针序与湿润输出方向[3] ESPHome2026.9.1 ADC schema:12dB、samples、avg与轮询[4] ESPHome2026.9.1 ESP32 ADC:校准/失败/采样实现

08 / 传感器应用

若拔线仍显示干,先查电阻位置与实体选择

先看是否把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及存储范围

BACK TO THE SOURCE

资料来源与版本说明

实际读取固定版本源码/器件资料,构建与主机逻辑分别留证。本站未完成烧录、GPIO/ADC/光学/传感器或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:校准/失败/采样实现
  5. ESPHome2026.9.1 S3 ADC1 GPIO7到channel6映射
  6. HA Core2026.10.2模板binary_sensor状态与availability
  7. HA Core2026.10.2 availability计算与实体可用性
  8. 指定DevKitC-1 v1.1排针、USB及存储范围
  9. WP7113ID普通红LED器件手册