如何实时忽略噪声值 解决电压报警程序指示灯闪烁问题
解决方案
你原有逻辑的核心问题是:单次读数跨越报警阈值就立刻切换灯效,因此单点噪声跳变就会导致指示灯状态频繁切换,出现闪烁。可通过以下几种实时可用的方案解决问题:
方案1:迟滞(滞环)阈值策略
这是工业报警场景最常用的防误触发方案,无额外延迟,只需要给每个报警设置触发、解除两个阈值即可:
- 高报警(绿灯):触发阈值保持4.27V,新增解除阈值(可根据你的噪声幅度调整,比如设为4.1V)。当前绿灯已亮起时,只有电压低于解除阈值才会灭灯,电压介于4.1V~4.27V区间时保持绿灯状态不变。
- 低报警(红灯):触发阈值保持-2.56V,新增解除阈值(比如设为-2.4V)。当前红灯已亮起时,只有电压高于解除阈值才会灭灯,电压介于-2.56V~-2.4V区间时保持红灯状态不变。
方案2:防抖计数确认
如果存在连续2-3个点的噪声,可以叠加计数防抖逻辑:读数满足状态切换条件时不立刻切换,只有连续N个读数都满足切换条件时才执行状态切换。N可以根据采样率调整,比如采样率1Hz时设为2,即可过滤所有单点、双点噪声。
优化后可直接使用的代码
以下代码组合了迟滞阈值+防抖计数逻辑,完全适配你的场景,可直接解决样本中945点导致的闪烁问题:
high_alarm_trig = 4.27 # 绿灯触发阈值 high_alarm_release = 4.1 # 绿灯解除阈值,可根据实际噪声幅度调整 low_alarm_trig = -2.56 # 红灯触发阈值 low_alarm_release = -2.4 # 红灯解除阈值 Q = 0.009765625 # 状态变量 current_light_state = "off" # 可选值 off/green/red stable_count = 0 STABLE_THRESHOLD = 2 # 连续2个读数符合条件才切换状态,可按需调整 for i in range(120): volt_bit = my_daq.next_reading() volts = volt_bit * Q - 5 # 计算期望的目标状态 target_state = current_light_state if current_light_state == "green": if volts < high_alarm_release: target_state = "off" elif current_light_state == "red": if volts > low_alarm_release: target_state = "off" else: if volts > high_alarm_trig: target_state = "green" elif volts < low_alarm_trig: target_state = "red" # 防抖逻辑 if target_state == current_light_state: stable_count = 0 else: stable_count += 1 if stable_count >= STABLE_THRESHOLD: current_light_state = target_state stable_count = 0 # 执行灯效切换 if current_light_state == "green": bstick.set_color(index=6, name="green") elif current_light_state == "red": bstick.set_color(index=3, name="red") else: lights_off()
内容的提问来源于stack exchange,提问作者hoshimani
相关产品推荐
相关产品推荐

