// ───────────────────────────────────────────────────────────────
// DEFINIÇÃO DOS PINOS
// ───────────────────────────────────────────────────────────────
#define TRIG_A A0 // Pino de disparo do Sensor A (externo) - envia pulso ultrassônico
#define ECHO_A A1 // Pino de eco do Sensor A - recebe o retorno do pulso
#define TRIG_B A2 // Pino de disparo do Sensor B (interno)
#define ECHO_B A3 // Pino de eco do Sensor B
#define LED A4 // Pino do LED - simula a lâmpada da sala
// ───────────────────────────────────────────────────────────────
// CONSTANTE DE DETECÇÃO
// ───────────────────────────────────────────────────────────────
#define DETECT_DIST 20 // Distância de detecção em centímetros
// ───────────────────────────────────────────────────────────────
// VARIÁVEIS GLOBAIS
// ───────────────────────────────────────────────────────────────
int pessoas = 0; // Contador de pessoas na sala - começa em zero
int estado = 0; // Estado atual da máquina de estados - começa em idle (0)
// ───────────────────────────────────────────────────────────────
// FUNÇÃO: medirDistancia()
// Aciona o HC-SR04 e retorna a distância em cm.
// Retorna 999 se não houver eco (ninguém detectado).
// ───────────────────────────────────────────────────────────────
long medirDistancia(int trig, int echo) {
//Sequência de disparo do sensor segundo datasheet
digitalWrite(trig, LOW);
delayMicroseconds(2); // Estabiliza o pino
digitalWrite(trig, HIGH);
delayMicroseconds(10); // Pulso de 10µs conforme datasheet
digitalWrite(trig, LOW);
long duracao = pulseIn(echo, HIGH, 30000); // Timeout de 30ms
if (duracao == 0) return 999; // Sem eco = sem detecção
return (duracao / 2) / 29.1; // Converte µs em cm
// OBS: O som percorre aproximadamente 1cm a cada 29.1µs no ar
}
// ───────────────────────────────────────────────────────────────
// FUNÇÃO: atualizarLED()
// Acende o LED se há pessoas na sala, apaga se não há.
// ───────────────────────────────────────────────────────────────
void atualizarLED() {
digitalWrite(LED, pessoas > 0 ? HIGH : LOW);
}
// ───────────────────────────────────────────────────────────────
// FUNÇÃO: setup()
// Executada uma única vez na inicialização.
// ───────────────────────────────────────────────────────────────
void setup() {
pinMode(TRIG_A, OUTPUT);
pinMode(TRIG_B, OUTPUT);
pinMode(ECHO_A, INPUT);
pinMode(ECHO_B, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); // Sala começa vazia
}
// ───────────────────────────────────────────────────────────────
// FUNÇÃO: loop()
// Executada continuamente. Contém a máquina de estados.
// ───────────────────────────────────────────────────────────────
void loop() {
long distA = medirDistancia(TRIG_A, ECHO_A);
long distB = medirDistancia(TRIG_B, ECHO_B);
// true = há alguém a menos de 20cm, false = livre
bool detA = (distA < DETECT_DIST);
bool detB = (distB < DETECT_DIST);
switch (estado) {
case 0: // IDLE - aguardando primeiro sensor ser ativado
if (detA && !detB) estado = 1; // Só A detectou → possível entrada
else if (detB && !detA) estado = 3; // Só B detectou → possível saída
break;
case 1: // Sensor A detectou - aguardando Sensor B
if (detB) estado = 2;
break;
case 2: // Sequência AB confirmada = ENTRADA
pessoas++;
atualizarLED(); // LED atualiza imediatamente
estado = 5;
break;
case 3: // Sensor B detectou - aguardando Sensor A
if (detA) estado = 4;
break;
case 4: // Sequência BA confirmada = SAÍDA
if (pessoas > 0) pessoas--; // Evita número negativo
atualizarLED(); // LED atualiza imediatamente
estado = 5;
break;
case 5: // Aguarda ambos os sensores ficarem livres
if (!detA && !detB) estado = 0; // Só então volta ao idle
break;
}
delay(50); // 50ms entre leituras para estabilizar os sensores
}