Intente hacer el código lo más simple y legible posible.
Los semáforos funcionan con 6 estados (cases 0 al 5), y cada estado tiene un tiempo de duración.
const int GREEN_MAIN_STREET = 3;
const int YELLOW_MAIN_STREET = 4;
const int RED_MAIN_STREET = 5;
const int BUTTON_MAIN_STREET = 6;
const int GREEN_SIDE_STREET = 7;
const int YELLOW_SIDE_STREET = 8;
const int RED_SIDE_STREET = 9;
const int BUTTON_SIDE_STREET = 10;
int waitTime = 0;
typedef struct {
bool green;
bool yellow;
bool red;
} lights;
void setup()
{
// put your setup code here, to run once:
pinMode(GREEN_MAIN_STREET, OUTPUT);
pinMode(YELLOW_MAIN_STREET, OUTPUT);
pinMode(RED_MAIN_STREET, OUTPUT);
pinMode(BUTTON_MAIN_STREET, INPUT_PULLUP);
pinMode(GREEN_SIDE_STREET, OUTPUT);
pinMode(YELLOW_SIDE_STREET, OUTPUT);
pinMode(RED_SIDE_STREET, OUTPUT);
pinMode(BUTTON_SIDE_STREET, INPUT_PULLUP);
}
void loop()
{
lights mainStreet = {0, 0, 0};
lights sideStreet = {0, 0, 0};
// put your main code here, to run repeatedly:
for (int i = 0; i < 6; i++)
{
switch (i)
{
case 0:
mainStreet = {0, 0, 1};
sideStreet = {0, 0, 1};
waitTime = 20;
break;
case 1:
mainStreet = {0, 0, 1};
sideStreet = {1, 0, 0}; // Green light sideStreed
waitTime = 40;
break;
case 2:
mainStreet = {0, 0, 1};
sideStreet = {0, 1, 0};
waitTime = 10;
break;
case 3:
mainStreet = {0, 0, 1};
sideStreet = {0, 0, 1};
waitTime = 10;
break;
case 4:
mainStreet = {1, 0, 0}; // Green light mainStreed
sideStreet = {0, 0, 1};
waitTime = 40;
break;
case 5:
mainStreet = {0, 1, 0};
sideStreet = {0, 0, 1};
waitTime = 10;
break;
}
trafficLightMain(mainStreet);
trafficLightSide(sideStreet);
// Usamos un for para no usar un delay tan alto sino
// particionar el tiempo en tiempos más pequeños
// y cada cierto tiempo revisamos el estado de los botones
// cuando exista la luz verde
for (int t = 0; t < 100; t++)
{
if (i == 4 && digitalRead(BUTTON_MAIN_STREET) == LOW)
{
delay(1000);
break;
}
if (i == 1 && digitalRead(BUTTON_SIDE_STREET) == LOW)
{
delay(1000);
break;
}
delay(waitTime);
}
}
}
void trafficLightMain(lights value)
{
digitalWrite(GREEN_MAIN_STREET, value.green);
digitalWrite(YELLOW_MAIN_STREET, value.yellow);
digitalWrite(RED_MAIN_STREET, value.red);
}
void trafficLightSide(lights value)
{
digitalWrite(GREEN_SIDE_STREET, value.green);
digitalWrite(YELLOW_SIDE_STREET, value.yellow);
digitalWrite(RED_SIDE_STREET, value.red);
}
Cualquier sugerencia es bienvenida 😃
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?