ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Waterius脉冲计数算法全解:NAMUR、干簧管与霍尔传感器精准识别水表信号

2026/8/23 11:59:52 拓冰建站 浏览量
Waterius脉冲计数算法全解:NAMUR、干簧管与霍尔传感器精准识别水表信号 Waterius脉冲计数算法全解NAMUR、干簧管与霍尔传感器精准识别水表信号【免费下载链接】wateriusПередача показаний воды по Wi-Fi. Watermeter Wi-Fi transmitter.项目地址: https://gitcode.com/gh_mirrors/wa/wateriusWateriusВатериус是一款通过 Wi-Fi 自动抄送水表、燃气表、电表脉冲数据的开源智能终端。它的核心难点之一是如何让一颗 8 位 MCUATtiny85精准识别水表脉冲信号的四种来源——NAMUR 干簧管、干簧管离散触点、电子脉冲和霍尔传感器。本文将完整拆解 Waterius 的脉冲计数算法从输入电路分压、ADC 阈值判别到 250ms 状态机去抖帮你彻底理解它不需要知道水表输出类型就能自动适配的底层原理。Waterius 硬件架构两颗芯片如何分工Waterius 采用双芯低功耗架构ATtiny857/8 脚芯片负责常时监听两个脉冲输入、计数并写入 EEPROM。它在休眠模式下功耗极低靠 3 节 AA 电池可工作数年ESP8266Wi-Fi 模块仅在唤醒时上电负责通过 I2C 读取 ATtiny85 的数据并通过 Wi-Fi 上报。两颗芯片通过 I2C 总线通信输入信号经过分压电阻后送入 ATtiny85 的模拟比较器/ADC 引脚。完整的电路原理图可在 Board/scheme.png 中查看输入部分对应原理图右上角的 IN1/IN2 支路每个输入端串一个 3k3 电阻到 VCCNAMUR 触点串联一个 300Ω 电阻到 GND。四种脉冲传感器类型Waterius 如何区分ATtiny85 固件中定义了 CounterType 枚举与 ESP8266 侧的 枚举定义 保持一一对应类型枚举值典型应用识别原理NAMUR干簧管继电器0水表脉冲输出ADC 分压判别默认类型DISCRETE离散/干簧管1干接点输出、燃气表数字引脚电平判别ELECTRONIC电子脉冲2电子燃气表、电表内部上拉 下降沿中断HALL霍尔传感器3磁簧开关/霍尔式引脚电平 主动供电其中 NAMUR干簧管是水表最常见的脉冲输出方式表内磁铁驱动干簧管输出端再串联一只 1.5kΩ闭合或 5.5kΩ断开的电阻形成典型的分压电路。NAMUR 干簧管识别算法ADC 阈值分压判别这是 Waterius 脉冲识别中最精巧的部分。由于 NAMUR 干簧管的断开并不是开路而是呈现 5.5kΩ 左右的高阻态简单的高低电平无法判断固件因此采用 ADC 比较器读数进行四档判别。在 Attiny85/src/counter.h 中针对不同硬件版本定义了三组阈值LIMIT_CLOSED读数低于此值 → 判定为短路触点直接闭合如干簧管直连LIMIT_NAMUR_CLOSED低于此值且高于短路阈值→ NAMUR 闭合约 1.5kΩ 分压LIMIT_NAMUR_OPEN低于此值 → NAMUR 断开约 5.5kΩ 分压高于所有阈值 → 线路断开断路故障。例如 1.0 版硬件上短路约 104、NAMUR 闭合约 130、NAMUR 断开约 230对应阈值分别取 115、150、800。固件通过 value2state() 函数 将 ADC 读数映射为CLOSE、NAMUR_CLOSE、NAMUR_OPEN、OPEN四种状态并持续记录闭合时的 ADC 值adc字段随数据一起上报方便诊断输入回路是否健康。这种设计让 Waterius 即使面对不知道是干簧管还是 NAMUR的水表也能正确工作——两种闭合状态都会被判定为有效脉冲。250ms 状态机脉冲去抖的完整时序ADC 读数只是原始信号真正的脉冲判定由 discrete() 状态机 完成。核心思想是移位寄存器 时序模式匹配采样周期ATtiny85 的看门狗定时器以约 250ms 为周期触发采样main.cpp 的 counting_1ms() 函数同时引脚电平变化FRONT 事件可提前唤醒采样构建电平序列每次采样把当前是否闭合结果1闭合0断开左移进 8 位字节levels相当于保留最近 2 秒的状态历史上升沿检测当levels低 2 位为11连续两次采样闭合且此前无脉冲 → 判定脉冲开始两次确认有效滤除毛刺脉冲结束当levels低 3 位为000连续 750ms 断开→ 确认一个完整脉冲计数 1。即当前固件版本采用的判据是250ms 闭合 750ms 断开 1 个有效脉冲main.cpp 版本记录 中 v33 版本说明。这个两次确认闭合 三次确认断开的模式能有效抑制机械触点的抖动与 EMI 干扰。脉冲触发后固件还会把计数写入 EEPROM 环形缓冲counting() 函数写入频率限制为每分钟一次以保护闪存寿命——即使电池被拔、Wi-Fi 断网数据也不会丢失。霍尔传感器主动供电 低功耗唤醒霍尔传感器HALL 类型与前三类的最大区别是它需要外部供电。Waterius 的巧妙之处在于当某一路被配置为霍尔模式时该路第二个输入通道的电源脚被复用为传感器供电脚。在 CounterB::set_type() 函数 中可以看到切换为 HALL 模式时供电脚置为输出并拉高等待 30μs 让传感器稳定若霍尔传感器没有专用电源脚_power 0xFF该类型自动降级为 NONE防止误配置。hall() 采样函数 采用按需供电策略平时切断传感器电源仅在检测到引脚状态变化后才开启活跃状态并启用下降沿中断连续约 5 秒on_time/off_time累计到 200 个 25ms 节拍无新脉冲后自动关闭供电。这让霍尔方案在电池供电场景下依然省电。电子脉冲输入上拉 下降沿中断电子式燃气表、电表通常输出 TTL 电平脉冲对应ELECTRONIC类型。electronic() 函数 的处理方式最简单直接开启引脚内部上拉输入拉低即为有效状态从闭合翻转为断开时返回一次脉冲并同步记录 ADC 值用于诊断。Web 设置页通过 input_detect.html / input_electro_detect.html 页面 引导用户滴放水或触发传感器完成输入类型自动检测配置结果通过 I2C 写入 ATtiny85 的 EEPROM重启后无需重新配置。总结Waterius 脉冲计数算法的设计要点阈值分压判别用 ADC 而非数字 IO 识别 NAMUR 干簧管的高阻断开态天然兼容 NAMUR 与干簧管两种水表输出时序状态机去抖250ms 采样 两次确认闭合、三次确认断开的移位寄存器模式抗抖动能力强传感器类型可配置NAMUR / 干簧管 / 电子脉冲 / 霍尔 四种类型随时切换霍尔通道复用电源脚实现主动供电数据不丢失EEPROM 环形缓冲 限速写入断电、断网均不丢脉冲。如果你想动手复现或修改算法核心代码都在 Attiny85/src/ 目录中其中 counter.h 是四类脉冲识别的全部实现main.cpp 包含采样调度与 EEPROM 持久化逻辑。【免费下载链接】wateriusПередача показаний воды по Wi-Fi. Watermeter Wi-Fi transmitter.项目地址: https://gitcode.com/gh_mirrors/wa/waterius创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考