Tengo que realizar un programa para un semáforo coordinado con otro de paso de peatón.
Hay que poner un tiempo mínimo de paso de coches antes de activar el paso de peatones mediante un botón.
El tema es que si aprieto el botón antes de ese tiempo mínimo de paso no me guarda el estado y tengo que volverlo a apretar al pasar el tiempo mínimo de semáforo de coche en verde.
/* SEMAFORO -Projecto: Semáforo interactivo para paso de peatones
Cuando se encuentre el semáforo en Rojo, el paso de peatones estará en verde.
Cuando se aproxime el momento finalizar el estado rojo del semáforo, el paso de peatón parpadeará en verde pasándose finalmente a rojo, y con una pequeña latencia,
el semáforo de vehículos pasará a verde, iniciando un nuevo bucle al pulsar un botón con la condición de que tengamos siempre un mínimo del paso de vehículos abierto . */
/** Definiciones **/
// Semaforo automóviles
int rojoCar = 13 ;
int amarilloCar = 12;
int verdeCar = 11;
// Semaforo peatón
int rojoPe = 10;
int verdePe = 9;
// Boton
int button = 2; // asignación del pin 2 variable botón accionamiento peatones.
/* Variables*/
int SafetyLatence = 1500; // (ms) Tiempo en el que ambos pasos (vehículos y peatón) permanecen en rojo.
int TimeMinVerdeCar = 5000; // (ms) Tiempo mínimo en el que el paso de vehículos se encuentra en verde.
int TiempoCruce = 5000; // (ms)tiempo permitido para que el peatón cruce.
unsigned long previousMillis; // tiempo de cambio: variable para guardar el tiempo desde que hemos activado el paso para peatones.
int estado = false;
/* Programa */
void setup(){
pinMode(rojoCar, OUTPUT);
pinMode(amarilloCar, OUTPUT);
pinMode(verdeCar, OUTPUT);
pinMode(rojoPe, OUTPUT);
pinMode(verdePe, OUTPUT);
pinMode(button, INPUT);
// Arranca el ciclo, estados activos (HIGH) de luz verde para vehículos y roja para peatones
digitalWrite(verdeCar, HIGH);
digitalWrite(rojoPe, HIGH);
}
void loop() {
estado = digitalRead(button);
if (estado == HIGH && (millis() - previousMillis) > TimeMinVerdeCar){
cambioLuces();
}
}
void cambioLuces() {
delay (2000);
digitalWrite(verdeCar,LOW);
digitalWrite(amarilloCar, HIGH);
delay(2000);
digitalWrite(amarilloCar, LOW);
digitalWrite(rojoCar, HIGH);
delay(SafetyLatence);
digitalWrite(rojoPe, LOW);
digitalWrite(verdePe, HIGH);
delay(TiempoCruce);
for (int x=0; x<10; x++) { // El bucle for enciende el led verde de forma intermitente n veces
digitalWrite(verdePe, HIGH);
delay(250);
digitalWrite(verdePe, LOW);
delay(250);
}
digitalWrite(rojoPe, HIGH);
delay(500); // Retraso de encendio del semáforo verde del auto con respecto al rojo del peatón
digitalWrite(rojoCar, LOW);
delay(1000);
digitalWrite(verdeCar, HIGH);
previousMillis = millis();
}