Retraso con el puerto serial de Arduino

Lo que sucede es lo siguiente, cuando le paso la letra A por el puerto serial se demora mucho en validar y no sé a que se deba, lo que intento hacer es que el patron de colores cambie según la entrada que recibe, en este caso es una A, lo tengo validado con || por si solo estaba entrando al condicional por un solo caso, pero no, simplemente demora en entrar al condicional. No sé si alguien me pueda ayudar. De antemano muchas gracias, aqui dejo el código.

int rojo = 13;
int amarillo = 12;
int verde = 11;
char arg;
void setup(){
  Serial.begin(9600);
  pinMode(rojo, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(verde, OUTPUT);
}
void resetLeds(){
  digitalWrite(amarillo, LOW);
  digitalWrite(verde, LOW);
  digitalWrite(rojo, HIGH);
  delay(20000);

  digitalWrite(rojo, LOW);
  digitalWrite(amarillo, HIGH);
  delay(3000);

  digitalWrite(amarillo, LOW);
  digitalWrite(verde, HIGH);
  delay(30000);
}

void loop(){
  while (Serial.available() == 0){
    resetLeds();
  }
  arg = Serial.read();
  if(arg == 'A' || arg == 65){
      digitalWrite(verde, HIGH);
      digitalWrite(amarillo, HIGH);
      digitalWrite(rojo, LOW);
      delay(20000);
  }else{
    resetLeds();
  }
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @daniel8312.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

1 Like

Esta instrucción tarda 53 segundos en hacer su trabajo.

Y mientras no hay caracteres por leer, tu Arduino se toma otros 53 segundos de vacaciones. Una y otra vez.

Intenta hacer lo que necesitas sin usar delay(), sólo con millis()

Hola daniel8312

Prueba el código revisado que adjunto, te dará una idea mas clara.

He cambiado tiempos pero puedes poner los que quieras facilmente por "tiempo1" o "tiempo2".
Otra observacion , "char" solo admite letras

Y como dice mancera1979 utiliza mejor millis no delay

Un saludo!! :cocktail: :cocktail:

/*
 * 
 * foro
 * 
 * https://forum.arduino.cc/t/retraso-con-el-puerto-serial-de-arduino/1192001
 */

int rojo = 10;
int amarillo = 7;
int verde = 12;
char arg;
int tiempo1 = 500;
int tiempo2 = 5000;


void setup()
{
  Serial.begin(9600);
  pinMode(rojo, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(verde, OUTPUT);
}
void resetLeds()
{
  digitalWrite(amarillo, LOW);
  digitalWrite(verde, LOW);
  digitalWrite(rojo, HIGH);
  delay(tiempo1);

  
  digitalWrite(amarillo, HIGH);
  digitalWrite(verde, LOW);
  digitalWrite(rojo, LOW);
  delay(tiempo1);

  digitalWrite(amarillo, LOW);
  digitalWrite(verde, HIGH);
  digitalWrite(rojo, LOW);
  delay(tiempo1);
}

void loop()
{
  while (Serial.available() == 0)
  {
    resetLeds();
  }
  arg = Serial.read();
  if(arg == 'A' || arg == 'a')
 {
      digitalWrite(verde, HIGH);
      digitalWrite(amarillo, HIGH);
      digitalWrite(rojo, HIGH);
      delay(tiempo2);
  } 
}
// ***************  FIN  ************
1 Like

Muchas gracias, tenia errores de conceptos, modifiqué a millis y funcionó.

Hola daniel8312

He leído que ya te ha funcionado.
Podrías publicar el código revisado para ver como te ha quedado ???
Gracias .

Un saludo !! :cocktail: :cocktail:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.