//Definição de saídas para os LEDs
int LED[2][3] = {{4,0,2},{16,17,5}};
//Definição de entrada do botão(pino 14)
int bot = 14;
//Definição das cores dos LEDs dependendo o momento
//amarelo color[0][0 a 2 para 3 valores]
//desligado color[1][0 a 2 para 3 valores]
//vermelho color[2][0 a 2 para 3 valores]
//verde color[3][0 a 2 para 3 valores]
int color[4][3] = {{255,255,0},{0,0,0},{255,0,0},{0,255,0}};
//Memória para funcionamento do botão
int mem[2] = {0,0};
void setup() {
// put your setup code here, to run once:
//Definição de entradas e saídas
//Obs.: Tester em caso de erro no código
for(int i =0;i<=1;i++){
for(int j =0;j<=2;j++)pinMode(LED[i][j], OUTPUT);
}
//pinMode(LEDa[0], OUTPUT);
//pinMode(LEDa[1], OUTPUT);
//pinMode(LEDa[2], OUTPUT);
//pinMode(LEDb[0], OUTPUT);
//pinMode(LEDb[1], OUTPUT);
//pinMode(LEDb[2], OUTPUT);
//pinMode(bot, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int lixo;
//suspensao();
for(int k = 0;k<=2;k++)digitalWrite(LED[0][k], color[2][k]);
for(int k = 0;k<=2;k++)digitalWrite(LED[1][k], color[2][k]);
mem[1] = timerAmostrado(1000, mem[0]);
if (mem[1]>mem[0]) lixo = suspensao(mem[1]);
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]);
mem[1] = timerAmostrado(1000, mem[0]);
if (mem[1]>mem[0]) lixo = suspensao(mem[1]);
}
int suspensao(int mem1){
//modo de suspensão em que os semáforos alternam entre amarelo e desligado
int mem2;
while(!digitalRead(bot)==1){
for(int k = 0;k<=2;k++){
digitalWrite(LED[0][k], color[1][k]);
digitalWrite(LED[1][k], color[1][k]);
}
mem2 = timerAmostrado(1000, mem1);
if (mem2>mem1) return mem2;
for(int k = 0;k<=2;k++){
digitalWrite(LED[0][k], 0);
digitalWrite(LED[1][k], 0);
}
mem2 = timerAmostrado(1000, mem1);
if (mem2>mem1) return mem2;
}
return 0;
}
int timerAmostrado(int tempo, int mem1){
//Separar o tempo em pequenas amostras para capturar a variação positiva do estado do botão
int parte = tempo/5;
int mem2;
do{
mem2 = !digitalRead(bot);
delay(5);
//Retorna que deve mudar de suspensão para o Loop principal
if(mem2>mem1) return 1;
mem1 = mem2;
mem2 = 0;
parte--;
}while(parte!=0);
//Retornar o valor antigo da memória
//Retorna que deve mudar do Loop principal para a suspensão
return 0;
}