es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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]
Tags:  ,

Answer

  1. Avatar for 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:

    high_alarm = 4.27
    low_alarm = -2.56
    Q = 0.009765625
    
    last_high_reading = low_alarm
    
    for i in range(120):
        volt_bit = my_daq.next_reading()
        volts = volt_bit * Q - 5
    
        if volts > high_alarm:
            # recordar la última lectura que estaba por encima del high_alarm
            last_high_reading = max(last_high_reading, volts)
            # luz verde encendida
            bstick.set_color(index=6, name="green")
        elif volts <= high_alarm and volts >= low_alarm:
            # apagar la alarma solo si la lectura actual está por debajo de la última lectura alta
            if volts < last_high_reading:
                lights_off()
            else:
                # luz verde encendida
                bstick.set_color(index=6, name="green")
        elif volts < low_alarm:
            # luz roja encendida
            bstick.set_color(index=3, name="red")
    

    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.

Comments are closed.