跳转到内容

脉冲计数传感器

脉冲计数传感器允许您计算任何引脚上信号的脉冲数和频率。

在 ESP32 上,此传感器甚至非常精确,因为它使用 ESP32 上的硬件 脉冲计数外设。但是,由于使用脉冲计数外设,最多只能使用 8 个通道!

# 示例配置条目
sensor:
- platform: pulse_counter
pin: GPIOXX
name: "脉冲计数器"
  • pin (必需, 引脚): 用于计算脉冲的引脚。

  • count_mode (可选): 配置计数器在检测到上升沿/下降沿时的行为。

    • rising_edge (可选): 检测到上升沿时要执行的操作。可选值为 DISABLEINCREMENTDECREMENT。默认为 INCREMENT

    • falling_edge (可选): 检测到下降沿时要执行的操作。可选值为 DISABLEINCREMENTDECREMENT。默认为 DISABLE

  • use_pcnt (可选, 布尔值): 使用硬件 PCNT 脉冲计数器。仅 ESP32 支持。默认为 true

  • internal_filter (可选, 时间): 如果检测到短于此时间的脉冲,则将其丢弃且不计入脉冲。默认为 13us。在 ESP32 上使用硬件脉冲计数器时,此值不能高于 13us,对于 ESP8266 或使用 use_pcnt: false 时,您也可以使用更大的间隔。如果启用此功能,请将 count_mode 设置为在下降沿而不是前沿增加。对于用于计量功耗的 S0 脉冲表,50-100 ms 是一个合理的值。

  • update_interval (可选, 时间): 检查传感器的时间间隔。默认为 60s

  • total (可选): 报告脉冲总数。

  • 传感器的所有其他选项。

NOTE

请参阅 积分传感器 以了解如何随时间累计脉冲计数值。

传感器默认使用”pulses/min”(脉冲/分钟)作为测量单位。您可以使用 传感器过滤器 来更改此单位。例如,如果您使用脉冲计数器和光电二极管来计算功率表上的光脉冲,可以执行以下操作:

# 示例配置条目
sensor:
- platform: pulse_counter
pin: GPIOXX
unit_of_measurement: 'kW'
name: '家庭功率表'
filters:
- multiply: 0.06 # (60s/1000 每千瓦时脉冲数)

当配置了 total 传感器时,pulse_counter 还会报告测量的总脉冲数。在功率表上使用时,这可用于测量总消耗能量(以 kWh 为单位)。

# 示例配置条目
sensor:
- platform: pulse_counter
pin: GPIOXX
unit_of_measurement: 'kW'
name: '家庭功率表'
filters:
- multiply: 0.06 # (60s/1000 每千瓦时脉冲数)
total:
unit_of_measurement: 'kWh'
name: '家庭电能表'
filters:
- multiply: 0.001 # (1/1000 每千瓦时脉冲数)

使用此动作,您可以重置/设置总脉冲计数。如果您希望 total 传感器与您尝试匹配的仪表上的读数一致,这会很有用。

# 使用此动作从 home assistant 设置脉冲计数器总数:
api:
actions:
- action: set_pulse_total
variables:
new_pulse_total: int
then:
- pulse_counter.set_total_pulses:
id: pulse_counter_id
value: !lambda 'return new_pulse_total;'

NOTE

此值是原始脉冲计数,而不是应用过滤器后看到的值。

如果您想计算来自简单干簧管的脉冲,最简单的方法是利用内部上拉/下拉电阻。

您可以将开关连接在 GPIO 引脚和 GND 之间;在这种情况下,将引脚设置为 input、pullup 和 inverted:

# 干簧管连接在 GPIO 和 GND 之间
sensor:
- platform: pulse_counter
pin:
number: 12
inverted: true
mode:
input: true
pullup: true
name: "脉冲计数器"

如果将其连接在 GPIO 引脚和 +3.3V 之间,将引脚设置为 input、pulldown:

# 干簧管连接在 GPIO 和 +3.3V 之间
sensor:
- platform: pulse_counter
pin:
number: 12
mode:
input: true
pulldown: true
name: "脉冲计数器"

最安全的方法是使用 GPIO + GND,因为这样可以避免意外短路导线的可能性。