// ================== PINOS ==================
int R1 = 16, Y1 = 15, G1 = 14;
int R2 = 19, Y2 = 18, G2 = 17;
int BTN1 = 52;
int BTN2 = 50;
int BTN3 = 48;
int BTN4 = 46;
int STR = 24;
int STP = 22;
// ================== CONTROLE ==================
bool ligado = false;
// ================== SETUP ==================
void setup() {
pinMode(R1, OUTPUT); pinMode(Y1, OUTPUT); pinMode(G1, OUTPUT);
pinMode(R2, OUTPUT); pinMode(Y2, OUTPUT); pinMode(G2, OUTPUT);
pinMode(BTN1, INPUT);
pinMode(BTN2, INPUT);
pinMode(BTN3, INPUT);
pinMode(BTN4, INPUT);
pinMode(STR, INPUT);
pinMode(STP, INPUT);
Serial.begin(9600);
Serial.println("Sistema iniciado. Aguardando START...");
tudoDesligado(); // sistema inicia desligado
}
// ================== LOOP ==================
void loop() {
// -------- STOP --------
if (digitalRead(STP) == HIGH) {
if (ligado) {
Serial.println("STOP pressionado -> Sistema DESLIGADO");
}
ligado = false;
tudoDesligado();
}
// -------- START --------
if (!ligado && digitalRead(STR) == HIGH) {
ligado = true;
Serial.println("START pressionado -> Sistema LIGADO");
}
if (!ligado) return;
// -------- ROTINA NORMAL --------
fase1(); if (!ligado) return;
fase2(); if (!ligado) return;
fase3(); if (!ligado) return;
fase4(); if (!ligado) return;
fase5(); if (!ligado) return;
fase6();
}
// ================== FUNÇÕES AUXILIARES ==================
void seta(int r1,int y1,int g1,int r2,int y2,int g2){
digitalWrite(R1,r1); digitalWrite(Y1,y1); digitalWrite(G1,g1);
digitalWrite(R2,r2); digitalWrite(Y2,y2); digitalWrite(G2,g2);
}
void tudoDesligado(){
seta(LOW,LOW,LOW, LOW,LOW,LOW);
}
void tudoVermelho(){
seta(HIGH,LOW,LOW, HIGH,LOW,LOW);
}
void checaStop(){
if (digitalRead(STP) == HIGH) {
Serial.println("STOP pressionado durante a fase -> Sistema DESLIGADO");
ligado = false;
tudoDesligado();
}
}
// ================== LÓGICA DE PEDESTRE ==================
void checaPedestre(){
checaStop();
if (!ligado) return;
bool b12 = digitalRead(BTN1) == HIGH || digitalRead(BTN2) == HIGH;
bool b34 = digitalRead(BTN3) == HIGH || digitalRead(BTN4) == HIGH;
if (b12) {
Serial.println("Botoeira B1/B2 pressionada -> Pedido de pedestre (faixa 1-2)");
delay(3000);
Serial.println("Executando FASE 2 (S1 amarelo / S2 vermelho)");
fase2();
}
checaStop();
if (!ligado) return;
if (b34) {
Serial.println("Botoeira B3/B4 pressionada -> Pedido de pedestre (faixa 3-4)");
delay(3000);
Serial.println("Executando FASE 5 (S1 vermelho / S2 amarelo)");
fase5();
}
}
// ================== FASES DO SEMÁFORO ==================
void fase1() { // 8s
Serial.println("FASE 1 -> S1 VERDE | S2 VERMELHO");
seta(LOW,LOW,HIGH, HIGH,LOW,LOW);
esperaComInterrupcao(8000);
}
void fase2() { // 3s
Serial.println("FASE 2 -> S1 AMARELO | S2 VERMELHO");
seta(LOW,HIGH,LOW, HIGH,LOW,LOW);
esperaComInterrupcao(3000);
}
void fase3() { // 2s
Serial.println("FASE 3 -> AMBOS VERMELHO");
tudoVermelho();
esperaComInterrupcao(2000);
}
void fase4() { // 8s
Serial.println("FASE 4 -> S1 VERMELHO | S2 VERDE");
seta(HIGH,LOW,LOW, LOW,LOW,HIGH);
esperaComInterrupcao(8000);
}
void fase5() { // 3s
Serial.println("FASE 5 -> S1 VERMELHO | S2 AMARELO");
seta(HIGH,LOW,LOW, LOW,HIGH,LOW);
esperaComInterrupcao(3000);
}
void fase6() { // 2s
Serial.println("FASE 6 -> AMBOS VERMELHO");
tudoVermelho();
esperaComInterrupcao(2000);
}
// ================== DELAY INTERROMPÍVEL ==================
void esperaComInterrupcao(unsigned long tempo) {
unsigned long inicio = millis();
while (millis() - inicio < tempo) {
checaStop();
if (!ligado) return;
if (digitalRead(BTN1) == HIGH || digitalRead(BTN2) == HIGH) {
Serial.println(">>> Interrupcao detectada: B1/B2 DURANTE a fase");
delay(3000);
Serial.println(">>> Indo para FASE 2");
fase2();
return;
}
if (digitalRead(BTN3) == HIGH || digitalRead(BTN4) == HIGH) {
Serial.println(">>> Interrupcao detectada: B3/B4 DURANTE a fase");
delay(3000);
Serial.println(">>> Indo para FASE 5");
fase5();
return;
}
}
}