La variable no se recupera como se desea (LED)

0

Estoy cambiando una variable con una tasa predeterminada. Cuando mi variable se vuelve demasiado grande, la coloco de nuevo al valor más alto que quiero hacer, y cambio el signo en la tasa para hacer que el cambio vaya en la otra dirección.

x += rate;
if (x > 255){
  rate = -rate;
  x = 255;
}
if (x < 0) {
  rate = -rate;
  x = 0;
}

Sin embargo (cuando ejecuto este código y uso la variable para controlar el brillo de algunos LED), una vez que x llega a mi umbral más alto o por encima de este, se restablece al valor más bajo y vuelve a subir.

Ninguno de los otros códigos manipula o usa x, a menos que cuando esté configurando los valores CRGB con x en una matriz de LED. Este código se ejecuta en void (bucle).

    
pregunta pdustin101

1 respuesta

1

Si \ $ x \ $ es una variable de byte (uint8_t, por ejemplo), entonces tiene sentido que su código no funcione. Además, su código supone un valor firmado. Ese puede ser otro problema. Sin embargo, los compiladores de C también pueden violar las reglas. Intenta algo como esto:

if ( x > (255 - rate) ) {
    rate= -rate; /* not sure why you want to do that */
    x= 255;
} else
    x += rate;

Una lógica similar se aplicaría en la dirección negativa, creo.

Esto le permite mantenerlo como una variable de byte, aunque debe pensar detenidamente aquí. Si x es una variable de byte y está firmada, entonces incluso el código anterior no funcionará correctamente. El valor máximo es 127, entonces. No 255.

Supongamos que quieres x como uint8_t. Y desea que esto suba y luego hacia abajo y luego hacia arriba y luego hacia abajo, etc. Ahora tiene otro problema. Eso es que la tasa en sí necesita ser firmada. Así que asumamos las siguientes definiciones:

uint8_t x;    /* unsigned from 0 to 255 */
int8_t rate;  /* signed from -128 to 127 */

Entonces intenta algo como esto:

if ( rate > 0 && x > (255 - (uint8_t) rate) ) {
    rate= -rate;
    x= 255;
} else if ( rate < 0 && x < (uint8_t) (-rate) ) {
    rate= -rate;
    x= 0;
} else
    x += rate;

La velocidad cambiará las direcciones aquí, de manera apropiada, y esto te permite mantener las variables con tamaños pequeños, también.

    
respondido por el jonk

Lea otras preguntas en las etiquetas