¿Cómo ignorar un valor de ruido en tiempo real?
Estoy tratando de crear un programa de alarma que se pone verde cuando está por encima de 4,27v, se pone rojo cuando está por debajo de -2,56v y no hay luz entre estos valores. Me han proporcionado un conjunto de datos del cual se supone que debo leer continuamente y hacer sonar la alarma en consecuencia. Pero hay algo de ruido en los datos cuando están en valores altos y se supone que debo ignorar estos ruidos para que la alarma no parpadee.
Por ejemplo, si la lectura va “4,30 > 4,40 > 4,20 > 4,50 > …” tengo que ignorar el “4,20” y la alarma debe seguir siendo verde, no apagarse por 1 segundo y luego volver a encenderse.
Esto es lo que he intentado, pero aún parpadea:
high_alarm = 4.27
low_alarm = -2.56
Q = 0.009765625
prev1 = 0
prev2 = 0
for i in range(120):
volt_bit = my_daq.next_reading()
volts = volt_bit * Q - 5
prev2 = prev1
prev1 = volts
if volts > high_alarm:
# luz verde
bstick.set_color(index=6, name="green")
elif volts <= high_alarm and volts >= low_alarm:
if prev2 > prev1 and volts > prev1:
continue
lights_off()
elif volts < low_alarm:
# luz roja
bstick.set_color(index=3, name="red")
También tengo la idea de comparar ambos datos previos y siguientes con el valor actual, pero eso no es posible porque tengo que hacerlo en tiempo real, así que no se supone que conozca las lecturas futuras, solo las actuales y las anteriores.
Aquí hay un conjunto de datos de ejemplo de los valores altos que parpadean si alguien quiere intentarlo:
[991,
978,
962,
965,
959,
964,
945, # se parpadeó aquí
956,
960,
959,
953]
davy.ai
Solución al Programa de Alarma
Para resolver este problema, el código necesita recordar la última lectura que estuvo por encima del valor high_alarm. Luego, solo debe apagar la alarma si la lectura actual está por debajo de este valor recordado. De esta manera, la alarma no parpadeará si hay picos en los datos.
Aquí está una versión actualizada del código que implementa esta idea:
Con esta modificación, la alarma permanecerá encendida incluso si hay picos en los datos, siempre y cuando los picos no superen el valor high_alarm.