Arduino - Semaforo tiempos largos

 
Vista:

Semaforo tiempos largos

Publicado por Electrónico10 (2 intervenciones) el 23/08/2023 18:28:01
Hice un semáforo con arduino. Funciona bien. Lo hice con delay y con millis, pero hay un detalle con ambos. Cuando coloco tiempos arriba de 30 segundos, en ambos programas el programa deja la salida verde activada todo el tiempo y se bloquea y no cambia al amarillo y al rojo. Con otros tiempos menores de 30 segundos funciona bien y hace los cambios verde, amarillo y rojo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Semaforo tiempos largos

Publicado por Electrónico10 (2 intervenciones) el 23/08/2023 18:55:06
int led2=2;
int led3=3;
int led4=4;
void setup(){
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
}
void loop(){
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
delay(8000);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
delay(2000);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
delay(8000);

}

Este con millis
unsigned long ultimosMilisegundos = 0,
milisegundosActuales;

int ledRojo = 7,
ledAmarillo = 8,
ledVerde = 9,
SEGUNDOS_DE_ESPERA_VERDE_Y_ROJO = 10 * 10000, //
SEGUNDOS_DE_ESPERA_AMARILLO = 2 * 1000, //
LED_ACTUAL = 0; // Por defecto no hay led encendido

void setup() {

pinMode(ledRojo, OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledVerde, OUTPUT);
}

void loop() {

semaforo();
}

void semaforo() {
milisegundosActuales = millis(); // Obtenemos los milisegundos actuales


switch (LED_ACTUAL) {
case 9:
if (elTurnoDeVerdeORojoHaTerminado())
cambiaA(ledAmarillo);
break;
case 8:
if (elTurnoDeAmarilloHaTerminado())
cambiaA(ledRojo);
break;
case 7:
if (elTurnoDeVerdeORojoHaTerminado())
cambiaA(ledVerde);
break;


default:
cambiaA(ledVerde);
break;
}
}

boolean elTurnoDeVerdeORojoHaTerminado() {

if (milisegundosActuales - ultimosMilisegundos >= SEGUNDOS_DE_ESPERA_VERDE_Y_ROJO) {
ultimosMilisegundos = milisegundosActuales;
return true;
}
return false;
}

boolean elTurnoDeAmarilloHaTerminado() {

if (milisegundosActuales - ultimosMilisegundos >= SEGUNDOS_DE_ESPERA_AMARILLO) {
ultimosMilisegundos = milisegundosActuales;
return true;
}
return false;
}

void cambiaA(int nuevoLed) {

digitalWrite(LED_ACTUAL, LOW);
LED_ACTUAL = nuevoLed;
digitalWrite(LED_ACTUAL, HIGH);
}




ESTOS SON LOS PROGRAMAS QUE UTILICE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar