#include <Arduino.h>
// ─── Pinos (Nucleo C031C6) ────────────────────────────────────────────────────
#define LED_CAR_GREEN D2 // Semáforo veículos — Verde
#define LED_CAR_YELLOW D3 // Semáforo veículos — Amarelo
#define LED_CAR_RED D4 // Semáforo veículos — Vermelho
#define LED_PED_GREEN D5 // Semáforo pedestre — Verde
#define LED_PED_RED D6 // Semáforo pedestre — Vermelho
#define BUZZER_PIN D7 // Buzzer
#define BUTTON_PIN D8 // Botão do pedestre
// ─── Tempos (ms) ──────────────────────────────────────────────────────────────
#define T_CAR_YELLOW 3000 // Amarelo veículos
#define T_CAR_RED 7000 // Vermelho veículos (pedestre atravessa)
#define T_PED_BLINK 3000 // Tempo piscando antes de fechar
#define T_BLINK_INTERVAL 400 // Intervalo do pisca-pisca
#define DEBOUNCE_MS 50 // Debounce do botão
// ─── Estado do sistema ────────────────────────────────────────────────────────
bool pedidoPedestre = false;
bool emCiclo = false;
// ─── Helpers ──────────────────────────────────────────────────────────────────
void todosApagados() {
digitalWrite(LED_CAR_GREEN, LOW);
digitalWrite(LED_CAR_YELLOW, LOW);
digitalWrite(LED_CAR_RED, LOW);
digitalWrite(LED_PED_GREEN, LOW);
digitalWrite(LED_PED_RED, LOW);
noTone(BUZZER_PIN);
}
void estadoPadrao() {
// Veículos: Verde | Pedestre: Vermelho
todosApagados();
digitalWrite(LED_CAR_GREEN, HIGH);
digitalWrite(LED_PED_RED, HIGH);
}
// ─── Setup ────────────────────────────────────────────────────────────────────
void setup() {
Serial.begin(9600);
pinMode(LED_CAR_GREEN, OUTPUT);
pinMode(LED_CAR_YELLOW, OUTPUT);
pinMode(LED_CAR_RED, OUTPUT);
pinMode(LED_PED_GREEN, OUTPUT);
pinMode(LED_PED_RED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
estadoPadrao();
Serial.println("=== Semáforo Inteligente — Nucleo C031C6 ===");
Serial.println("Aguardando botão do pedestre...");
}
// ─── Loop ─────────────────────────────────────────────────────────────────────
void loop() {
// Lê botão com debounce
if (!emCiclo && digitalRead(BUTTON_PIN) == LOW) {
delay(DEBOUNCE_MS);
if (digitalRead(BUTTON_PIN) == LOW) {
pedidoPedestre = true;
Serial.println("Botão pressionado! Iniciando ciclo...");
}
}
if (!pedidoPedestre) return;
emCiclo = true;
pedidoPedestre = false;
// ── FASE 1: Veículos Amarelo | Pedestre Vermelho ──────────────────────────
Serial.println("FASE 1 — Amarelo veículos");
todosApagados();
digitalWrite(LED_CAR_YELLOW, HIGH);
digitalWrite(LED_PED_RED, HIGH);
delay(T_CAR_YELLOW);
// ── FASE 2: Veículos Vermelho | Pedestre Verde (aberto) ───────────────────
Serial.println("FASE 2 — Verde pedestre");
todosApagados();
digitalWrite(LED_CAR_RED, HIGH);
digitalWrite(LED_PED_GREEN, HIGH);
delay(T_CAR_RED);
// ── FASE 3: Pedestre piscando + buzzer (prestes a fechar) ─────────────────
Serial.println("FASE 3 — Pedestre piscando, atenção!");
unsigned long inicio = millis();
bool ledLigado = true;
while (millis() - inicio < T_PED_BLINK) {
digitalWrite(LED_PED_GREEN, ledLigado ? HIGH : LOW);
tone(BUZZER_PIN, 1000, T_BLINK_INTERVAL / 2);
ledLigado = !ledLigado;
delay(T_BLINK_INTERVAL);
}
// ── FASE 4: Volta ao estado padrão ───────────────────────────────────────
Serial.println("FASE 4 — Voltando ao estado padrão");
estadoPadrao();
emCiclo = false;
Serial.println("Aguardando botão do pedestre...");
}Loading
st-nucleo-c031c6
st-nucleo-c031c6