// Leds declarados
int carroVermelho = 15, carroAmarelo = 2, carroVerde = 4, pedestreVerde = 5, pedestreVermelho = 18;
bool stateLed = LOW, pressed = false, yellow = false, green = false;
int state = 0; //chama o estado, onde 1 == A, 2 == B e 3 == C
int pedestreCarro = 0;
unsigned long currentTime = 0, previousTime = 0, currentTime2 = 0, debounce = millis();
int i = 0;
int button = 35;
void IRAM_ATTR isr() {
if ((millis() - debounce) > 75) {
pressed = true;
//Serial.println((pressed));
debounce = millis();
interruptButton();
}
}
void setup() {
Serial.begin(115200);
pinMode(carroVermelho, OUTPUT);
pinMode(carroAmarelo, OUTPUT);
pinMode(carroVerde, OUTPUT);
pinMode(pedestreVerde, OUTPUT);
pinMode(pedestreVermelho, OUTPUT);
pinMode(button, INPUT_PULLUP);
attachInterrupt(button, isr, FALLING);
}
void loop() {
pedestreCarro = 0;
stateA();
stateB();
if (green = true){
pedestreCarro = 0;
}else{
pedestreCarro = 1;
}
stateA();
}
//verde para pedestre e vermelho para carros e vice-versa
void stateA(){
if(pedestreCarro == 0) {
stateC();
currentTime = millis();
digitalWrite(pedestreVermelho,!stateLed);
digitalWrite(carroVerde,!stateLed);
while ((millis() < currentTime + 15000) && (pressed == 0)){
//timer de 15s
}
stateC();
if(pressed == 1){
digitalWrite(carroAmarelo, !stateLed);
}
while ((millis() < currentTime + 6000) && (pressed == 1)){
//timer de 6s
}
stateC();
digitalWrite(carroVermelho,!stateLed);
digitalWrite(pedestreVerde,!stateLed);
currentTime = millis();
while ((millis() < currentTime + 15000)){
//timer de 15s
}
if(pressed == 1){
pressed = 0;
pedestreCarro = 1;
}
}else{
stateC();
currentTime = millis();
digitalWrite(carroVermelho,!stateLed);
digitalWrite(pedestreVerde,!stateLed);
while (millis() < currentTime + 15000){
//timer de 15s
}
pressed = 0;
}
}
//amarelo para o veículo o sinal pisca 3x e muda para verde para o pedestre
void stateB(){
stateC();
if (pressed == 1 && yellow == 0 || pedestreCarro == 0){
bool ledState2 = LOW;
digitalWrite(carroAmarelo, !stateLed);
yellow = 1;
pressed = 0;
currentTime2 = millis();
while ((millis() < currentTime2 + 7000) && pressed == 0){
//timer de 7 segundos e o led amarelo começa a piscar e depois de 3 piscadas totaliza aproximadamente 10 sec
}
yellow = 0;
i = 0;
while ((i < 6) && pressed == 0){
currentTime = millis();
if((currentTime-previousTime)>500){
previousTime = currentTime;
ledState2 = !ledState2;
digitalWrite(pedestreVermelho, ledState2);
i++;
}
}
currentTime2 = millis();
while ((millis() < currentTime2 + 6000) && pressed == 1){
//timer de 6 segundos e o led amarelo
}
stateC();
digitalWrite(carroVermelho,stateLed);
digitalWrite(pedestreVerde,stateLed);
pressed = 0;
}else{
green = true;
//delay(5000);
//currentTime2 = millis();
//while (millis() < currentTime2 + 6000){
//timer de 6 segundos e o led amarelo
//}
//stateC();
//digitalWrite(carroVermelho,stateLed);
//digitalWrite(pedestreVerde,stateLed);
}
}
//Todos os LEDS apagados
void stateC(){
digitalWrite(carroVermelho,stateLed);
digitalWrite(carroAmarelo,stateLed);
digitalWrite(carroVerde,stateLed);
digitalWrite(pedestreVermelho,stateLed);
digitalWrite(pedestreVerde,stateLed);
}
//quando houver a interrupção pelo botão
void interruptButton(){
}