// --- LDRs (Entradas Analógicas) ---
#define P1_ENT 34
#define P1_SAI 35
#define P2_ENT 32
#define P2_SAI 33
// --- LEDs das portas (sempre acesos) ---
#define LED_P1_ENT 25
#define LED_P1_SAI 26
#define LED_P2_ENT 27
#define LED_P2_SAI 14
// --- LEDs de status ---
#define LED_VERM 13 // Sistema funcionando
#define LED_VERDE 12 // Entrada completa
#define LED_AMARELO 15 // Saída completa
// --- Configurações ---
int contador = 0;
int threshold = 100; // valor para detectar interrupção do LDR
unsigned long debounceTime = 150;
// --- Controle de tempo ---
unsigned long lastRedBlink = 0;
unsigned long redInterval = 500;
unsigned long lastVerdeBlink = 0;
unsigned long verdeDuration = 200;
unsigned long lastAmareloBlink = 0;
unsigned long amareloDuration = 200;
// Variáveis de debounce
unsigned long lastTriggerP1 = 0;
unsigned long lastTriggerP2 = 0;
void setup() {
Serial.begin(115200);
// LEDs das portas sempre acesos
pinMode(LED_P1_ENT, OUTPUT); digitalWrite(LED_P1_ENT, HIGH);
pinMode(LED_P1_SAI, OUTPUT); digitalWrite(LED_P1_SAI, HIGH);
pinMode(LED_P2_ENT, OUTPUT); digitalWrite(LED_P2_ENT, HIGH);
pinMode(LED_P2_SAI, OUTPUT); digitalWrite(LED_P2_SAI, HIGH);
// LEDs de status
pinMode(LED_VERM, OUTPUT); digitalWrite(LED_VERM, LOW);
pinMode(LED_VERDE, OUTPUT); digitalWrite(LED_VERDE, LOW);
pinMode(LED_AMARELO, OUTPUT); digitalWrite(LED_AMARELO, LOW);
}
void loop() {
unsigned long now = millis();
// --- LED vermelho pisca continuamente ---
if(now - lastRedBlink >= redInterval) {
digitalWrite(LED_VERM, !digitalRead(LED_VERM));
lastRedBlink = now;
}
// --- Leitura sensores ---
int valP1Ent = analogRead(P1_ENT);
int valP1Sai = analogRead(P1_SAI);
int valP2Ent = analogRead(P2_ENT);
int valP2Sai = analogRead(P2_SAI);
// --- Porta 1 ---
if(now - lastTriggerP1 > debounceTime) {
// Detecta entrada completa Porta 1
if(valP1Ent < threshold && valP1Sai >= threshold) {
contador++;
lastVerdeBlink = now;
digitalWrite(LED_VERDE, HIGH);
}
// Detecta saída completa Porta 1
if(valP1Sai < threshold && valP1Ent >= threshold) {
contador--;
lastAmareloBlink = now;
digitalWrite(LED_AMARELO, HIGH);
}
lastTriggerP1 = now;
}
// --- Porta 2 (corrigida) ---
if(now - lastTriggerP2 > debounceTime) {
// Detecta entrada completa Porta 2
if(valP2Sai < threshold && valP2Ent >= threshold) { // invertido para corrigir
contador++;
lastVerdeBlink = now;
digitalWrite(LED_VERDE, HIGH);
}
// Detecta saída completa Porta 2
if(valP2Ent < threshold && valP2Sai >= threshold) { // invertido para corrigir
contador--;
lastAmareloBlink = now;
digitalWrite(LED_AMARELO, HIGH);
}
lastTriggerP2 = now;
}
// --- Apaga LEDs de status após duração ---
if(digitalRead(LED_VERDE) == HIGH && now - lastVerdeBlink >= verdeDuration) {
digitalWrite(LED_VERDE, LOW);
}
if(digitalRead(LED_AMARELO) == HIGH && now - lastAmareloBlink >= amareloDuration) {
digitalWrite(LED_AMARELO, LOW);
}
// --- Exibe contador ---
Serial.print("Contador atual: ");
Serial.println(contador);
}