//Definição de saídas para os LEDs
//LED[0][k] é o LED da esquerda
//LED[1][k] é o LED da direita
int LED[2][3] = {{4,0,2},{5,17,16}};
//Definição de entrada do botão(pino 14)
int bot = 14;
//Definição das cores dos LEDs
//verde color[0][k]
//amarelo color[1][k]
//vermelho color[2][k]
//Desligado color[3][k]
//Roxo color[4][k]
int color[5][3] = {{0,255,0},{255,255,0},{255,0,0},{0,0,0},{255,0,255}};
void setup() {
// put your setup code here, to run once:
//Definição de entradas e saídas
for(int i =0;i<=1;i++){
for(int j =0;j<=2;j++)pinMode(LED[i][j], OUTPUT);
}
pinMode(bot, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int ref = millis();
const int timeBounce = 10; //O bounce depende do tempo de estabilização. Assim, aqui presumi-se que depois de 10 ms as leituras estão estáveis.
int bounce = 0;
int descarte;
bool verificado = false;
bool condicao = false;
do{
//Fase 1 em LED[0], esquerda
if(millis() - ref >= 0 && millis() - ref <= 27000 ) for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[0][k]);
if(millis() - ref >= 27000 && millis() - ref <= 27000 + 3000) for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[1][k]);
if(millis() - ref >= 30000 && millis() - ref <= 30000 + 26000) for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[2][k]);
//Fase 2 em LED[1], direita
if(millis() - ref >= 0 && millis() - ref <= 33000 ) for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[2][k]);
if(millis() - ref >= 33000 && millis() - ref <= 33000 + 17000) for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[0][k]);
if(millis() - ref >= 50000 && millis() - ref <= 50000 + 3000) for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[1][k]);
if(millis() - ref >= 53000 && millis() - ref <= 53000 + 3000) for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[2][k]);
//Verificação de se o botão foi pressionado
if(!digitalRead(bot) == 1 && verificado == false){
verificado = true;
bounce = millis();
}
if(millis() - bounce > timeBounce && verificado == true){
if(!digitalRead(bot) == 1){
for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[4][k]);
for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[4][k]);
while(!digitalRead(bot) == 1){
}
descarte = suspensao();
descarte = 0;
ref = millis();
condicao = true;
bounce = 0;
verificado = false;
}
}
}while(millis() - ref <= 56000 || condicao == false);
}
//modo de suspensão em que os semáforos alternam entre amarelo e desligado
int suspensao(){
int ref = millis();
bool condicao = false;
//Parâmetros deBounce
const int timeBounce = 10;
int bounce = 0;
int descarte;
bool verificado = false;
for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[3][k]);
for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[3][k]);
while(!digitalRead(bot) == 1){
}
do{
//LEDS ou semáforos exibindo a cor amarela
if(millis() - ref >= 0 && millis() - ref <= 1000){
for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[1][k]);
for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[1][k]);
}
//LEDS ou semáforos exibindo ausência de cores
if(millis() - ref >= 1000 && millis() - ref <= 2000){
for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[3][k]);
for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[3][k]);
}
//Verificação para reset de looping das cores dos semáforos
if(millis() - ref > 2000){
ref = millis();
}
//Verificação de se o botão foi pressionado
if(!digitalRead(bot) == 1 && verificado == false){
verificado = true;
bounce = millis();
}
//Verificação de se o botão foi pressionado novamente
if(millis() - bounce > timeBounce && verificado == true){
if(!digitalRead(bot) == 1){
condicao = true;
}
bounce = 0;
verificado = false;
while(!digitalRead(bot) == 1){
}
}
}while(condicao == false);
return 0;
}