#include <LiquidCrystal.h>
int acPin = 5; // pino do ar condicionado
int sensor1Pin = 2; // Pino de interrupção para Sensor 1
int sensor2Pin = 3; // Pino de interrupção para Sensor 2
int ledPin = 13; // Pino do LED
int buzzerPin = 6; // Pino do buzzer
int contSai = 0;
int content = 0;
int contAnterior = 0;
volatile int valorMax = 8; // Valor máximo de pessoas
int tolerancia=5; // número de pessoas permitidas até o acionamento do a
volatile int contSala = 0; // Variável de contagem
volatile bool sensor1Ativo = false; // Verifica se o Sensor 1 foi ativado primeiro
volatile bool sensor2Ativo = false; // Verifica se o Sensor 2 foi ativado primeiro
unsigned long tempoUltimoEvento = 0; // Guarda o tempo do último evento
const unsigned long tempoIgnorar = 1000; // Tempo para ignorar o outro sensor (1 segundo)
bool acligado =false; // verifica se ac foi ligado
bool acdesligado =true; // Valor que verifica se o ac foi desligado
// Configuração do LCD - pinos conectados ao LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup() {
Serial.begin(9600);
// Configuração dos pinos
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(acPin,OUTPUT);
pinMode(sensor1Pin, INPUT);
pinMode(sensor2Pin, INPUT);
// Configuração inicial do LCD
lcd.begin(16, 2); // LCD 16x2
lcd.setCursor(0, 0);
lcd.print("INICIANDO...");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Geovane Cambonga");
delay(500);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("INVENTOR");
lcd.setCursor(4, 1);
lcd.print("ANGOLANO");
delay(500);
lcd.clear();
// Associar as interrupções aos sensores
attachInterrupt(digitalPinToInterrupt(sensor1Pin), sensor1Detectado, RISING);
attachInterrupt(digitalPinToInterrupt(sensor2Pin), sensor2Detectado, RISING);
}
void loop() {
contSala = content - contSai;
// Atualizar o estado do LED e do buzzer
if (contSala > valorMax) {
digitalWrite(buzzerPin, HIGH); // Aciona o buzzer se o número máximo for atingido
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Limite atingido!");
delay(500);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sala:" );
lcd.print(contSala);
lcd.setCursor(0, 1);
lcd.print("Ent: ");
lcd.print(content);
lcd.setCursor(9, 1);
lcd.print("Sai: ");
lcd.print(contSai);
}
// Aciona ou desliga o LED dependendo da quantidade de pessoas na sala
if (contSala > 0) {
digitalWrite(ledPin, HIGH); // Aciona o LED se há pessoas
} else {
digitalWrite(ledPin, LOW); // Desliga o LED se não há ninguém
}
if(tolerancia < contSala && !acligado && acdesligado){
digitalWrite(acPin,HIGH);
acligado=true;
acdesligado= false;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Ligando o ac...");
delay(1000);
lcd.clear();
}else if (contSala <= tolerancia && acligado && !acdesligado){digitalWrite(acPin,LOW);
acligado=false;
acdesligado=true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Desligando o ac...");
delay(1000);
lcd.clear();}
lcd.setCursor(0,0); //volta a presentar a contagem de pessoas
lcd.print("Sala:" );
lcd.print(contSala);
lcd.setCursor(0,1);
lcd.print("Ent: ");
lcd.print(content);
lcd.setCursor(9,1);
lcd.print("Sai: ");
lcd.print(contSai);
// Atualiza a contagem no monitor serial
Serial.print("Entrada: ");
Serial.print(content);
Serial.print(" | Saída: ");
Serial.println(contSai);
delay(1000); // Atualização a cada segundo
}
// Função chamada quando o Sensor 1 detecta movimento (entrada)
void sensor1Detectado() {
unsigned long tempoAtual = millis();
if (!sensor1Ativo && (tempoAtual - tempoUltimoEvento > tempoIgnorar)) {
sensor1Ativo = true;
content++; // Incrementa a contagem de entrada de pessoas
tempoUltimoEvento = tempoAtual; // Atualiza o tempo do último evento
sensor1Ativo = false; // Reseta para permitir novas contagens
}
}
// Função chamada quando o Sensor 2 detecta movimento (saída)
void sensor2Detectado() {
unsigned long tempoAtual = millis();
if (!sensor2Ativo && (tempoAtual - tempoUltimoEvento > tempoIgnorar)) {
sensor2Ativo = true;
contSai++; // Incrementa a contagem de saída de pessoas
tempoUltimoEvento = tempoAtual; // Atualiza o tempo do último evento
sensor2Ativo = false; // Reseta para permitir novas contagens
}
contSala = content - contSai;
if (contSala != contAnterior) {
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(5, 0);
lcd.print(contSala);
contAnterior = contSala;
}
}