Codigo para semaforo

Efectivamente lo que dices es correcto , supongo que como probe solo con el monitor serie algo haria mal, ya lo corregi.

Aunque correcto seria irelevante si no quisiera acotar entre 1 y 9 ya que seguiria siendo par o impar y se cumpliria perfectamente la comprobacion de la paridad.
No le funciona porque "Serial.read ()" no lee el bufer completo y ejecuta el "if (Serial.available()" dos veces , prevaleciendo la seguda lectura , (algún caracter de control), que siempre es el mismo de ahi que:

Deberia usar la función " Serial.readString() " que si lee el buffer completo eliminando ese caracter de control. El código podria quedar algo simimilar a esto:

const int SalidaLedVerde = 2;
const int SalidaLedAmarillo = 4;
int numero;

void setup() {
  Serial.begin(9600);
  pinMode(SalidaLedVerde, OUTPUT);
  pinMode(SalidaLedAmarillo, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    numero = (Serial.readString()).toInt();//atol(palabra);
    if (numero > 0 && numero < 10) {// Acotamos entre el 1 y el 9
      //Comprobacion paridad
      // Comprobamos, (en binario), el ultimo bit de "numero",se cumple el if cuando es inpar.
      // El ultimo bit de un numero impar siempre es un 1 el de un par siempre 0
      digitalWrite(SalidaLedVerde, ! bitRead(numero, 0));
      digitalWrite(SalidaLedAmarillo, bitRead(numero, 0));
    }
  }
}

Obiamente para la comprobacion de la paridad puede usar la que mas le guste de las expuestas anteriormente.
Saludos.

1 Like