// ===============================================================
// Sistema de Controle de Iluminação Pública - Versão ESP32
// Autor: Adilson Silva
// ===============================================================
const int ldrPin = 34; // AO do LDR conectado ao GPIO34 (entrada analógica)
const int pirPin = 2; // Saída digital do PIR
const int botaoPin = 19; // Botão para modo manual (ativa/desativa emergência)
const int ledVermelho = 23; // LED vermelho - Emergência
const int ledAmarelo = 22; // LED amarelo - Noite
const int ledVerde = 21; // LED verde - Dia
bool emergenciaManual = false; // Estado da emergência manual
bool botaoAnterior = HIGH; // Estado anterior do botão (para clique único)
void setup() {
Serial.begin(115200);
pinMode(ldrPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(botaoPin, INPUT_PULLUP);
pinMode(ledVermelho, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVerde, OUTPUT);
digitalWrite(ledVermelho, LOW);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVerde, LOW);
Serial.println("Sistema de Controle de Iluminação Pública (ESP32) Iniciado");
}
void loop() {
int valorLDR = analogRead(ldrPin);
int valorPIR = digitalRead(pirPin);
bool botaoPressionado = digitalRead(botaoPin) == LOW;
// --- Clique único no botão alterna emergência manual ---
if (botaoPressionado && botaoAnterior == HIGH) {
emergenciaManual = !emergenciaManual;
Serial.println(emergenciaManual ? "Emergência manual ATIVADA" : "Emergência manual DESATIVADA");
delay(200); // debounce
}
botaoAnterior = digitalRead(botaoPin);
Serial.print("LDR: ");
Serial.print(valorLDR);
Serial.print(" | PIR: ");
Serial.print(valorPIR);
Serial.print(" | Emergência Manual: ");
Serial.println(emergenciaManual ? "Sim" : "Não");
// --- Modo Automático ---
if (!emergenciaManual) {
if (valorLDR > 1000) { // Está claro → DIA (ajustável conforme sensor)
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
} else {
// Está escuro → NOITE
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH);
// Emergência automática: movimento detectado
if (valorPIR == HIGH) {
digitalWrite(ledVermelho, HIGH);
Serial.println("Emergência automática ATIVADA (movimento detectado)");
} else {
digitalWrite(ledVermelho, LOW);
}
}
} else {
// --- Modo Emergência Manual ---
digitalWrite(ledVermelho, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVerde, LOW);
}
delay(200);
}