// Pinos dos LEDs
const int ledVerde = 5;
const int ledAmarelo = 6;
const int ledVermelho = 7;
const int ledVerdeB = 2;
const int ledAmareloB = 3;
const int ledVermelhoB = 4;
const int contato8 = 8;
// Tempos de cada fase (em milissegundos)
const unsigned long tempoVerde = 5000;// ESTADO 1
const unsigned long tempoAmareloC = 2000;// ESTADO 2
const unsigned long tempoAmareloC1 = 1000;// ESTADO 2 RAPIDO
const unsigned long tempoVermelho = 6000;// ESTADO 3,4,5,6
const unsigned long tempoVermelhoC = 1000;//ESTADO 3 e 6
const unsigned long tempoVermelhoB = 7000;//ESTADO 6,1,2,3
const unsigned long tempoVerdeB = 5000; //ESTADO 4
const unsigned long tempoVerdeB1 = 3000; //ESTADO 4 RAPIDO
unsigned long tempoAnterior = 0;
int estado = 1; // 0: Verde, 1: Amarelo, 2: Vermelho
void setup() {
Serial.begin(115200);
pinMode(contato8, INPUT_PULLUP);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(ledVerdeB, OUTPUT);
pinMode(ledAmareloB, OUTPUT);
pinMode(ledVermelhoB, OUTPUT);
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
digitalWrite(ledVerdeB, LOW);
digitalWrite(ledAmareloB, LOW);
digitalWrite(ledVermelhoB, HIGH);
}
void loop() {
unsigned long tempoAtual = millis(); // Captura o tempo atual
//........................................................
if (estado == 1) { // FASE VERDE, ESTADO 1
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
digitalWrite(ledAmareloB, LOW);
if (digitalRead(contato8)==0)// SOLICITAÇÃO REALIZADA
{tempoAnterior = tempoAtual; }
if (tempoAtual - tempoAnterior >= tempoVerde) {
estado = 2; // Muda para Amarelo ESTADO 2
tempoAnterior = tempoAtual; }
}
//........................................................
else if (estado == 2) { // FASE AMARELA, ESTADO 2
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH);
if (digitalRead(contato8) == 0)
{ tempoAnterior = tempoAtual;
estado = 1;}// VOLTA AO VERDE
if (tempoAtual - tempoAnterior >= tempoAmareloC) {
estado = 3;// Muda para Vermelho, ESTADO 3,4,5,6
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 3) { // FASE VERMELHA COMUM, ESTADO 3
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, HIGH);
if ((digitalRead(contato8) == 0))
{ tempoAnterior = tempoAtual;
estado = 1; }// VOLTA AO VERDE
if (tempoAtual - tempoAnterior >= tempoVermelhoC) {
estado =4; // MUDA para o Verde B, ESTADO 4
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 4) { // FASE VERDE B, ESTADO 4
digitalWrite(ledVerdeB, HIGH);
digitalWrite(ledVermelhoB, LOW);
digitalWrite(ledVerde, LOW);
digitalWrite(ledVermelho, HIGH);
if ((digitalRead(contato8) == 0))
{estado =7;}
if (tempoAtual - tempoAnterior >= abs(tempoVerdeB))
{ estado =5; // MUDA para o Verde B, ESTADO 4
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 7) { // FASE VERDE B, ESTADO 4 RAPIDO
//digitalWrite(ledVerdeB, HIGH);//COMO PISCAR
// Inverte o estado: se era 0 vira 1, se era 1 vira 0
digitalWrite(ledVerdeB, !(digitalRead(ledVerdeB)));
digitalWrite(ledVermelhoB, LOW);
digitalWrite(ledVerde, LOW);
//if (tempoAtual - tempoAnterior >= (tempoVerdeB+150))
// {tempoAnterior = tempoAtual; }
delay(130);
if (tempoAtual - tempoAnterior >= tempoVerdeB1)
{ estado =8; // MUDA para o Verde B, ESTADO 4
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 5) { // FASE AMARELO B,ESTADO 5
digitalWrite(ledAmareloB, HIGH);
digitalWrite(ledVerdeB, LOW);
if ((digitalRead(contato8) == 0))
{ estado=8; }
if (tempoAtual - tempoAnterior >= tempoAmareloC) {
estado =6; // MUDA para o VerdeVERMEHO C, ESTADO 6
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 8) { // FASE AMARELO B,ESTADO 5 RAPIDO
digitalWrite(ledAmareloB, !(digitalRead(ledAmareloB)));//COMO PISCAR
digitalWrite(ledVerdeB, LOW);
delay(100);
if (tempoAtual - tempoAnterior >= tempoAmareloC1) {
estado =6; // MUDA para o VerdeVERMEHO C, ESTADO 6
tempoAnterior = tempoAtual; }
}
//....................................................
else if (estado == 6) { // FASE VERMELHOC,ESTADO 6
digitalWrite(ledAmareloB, HIGH);
digitalWrite(ledVermelhoB, HIGH);
if (tempoAtual - tempoAnterior >= tempoVermelhoC) {
estado =1; // Volta para o Verde, ESTADO 1
tempoAnterior = tempoAtual;}
}
}SEMÁFORO A
SEMÁFORO B
1 2 3 4 5
1 2
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1 2
1 2 3 4