#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// Configurações do LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Configuração do RTC
RTC_DS1307 rtc;
// Configuração do DHT22
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pinos dos LEDs
#define LED_AC 3
#define LED_ALARME 4
int ledSalas[] = {5, 6, 7, 8};
// Pinos dos PIRs
int pirSensores[] = {9, 10, 11, 12};
// Pinos dos botões
#define BOTAO_MENU 22
#define BOTAO_SELEC 23
#define BOTAO_MAIS 24
#define BOTAO_MENOS 25
// Variáveis de estado
bool alarmeHabilitado = false;
bool pirAtivo[4] = {true, true, true, true}; // Configuração inicial dos PIRs
int menuIndex = 0;
unsigned long lastButtonPress = 0; // Para debounce
// Configurações do sistema
float setPoint = 24.0;
int horarioInicioExpediente = 8; // Horário em horas
int horarioFimExpediente = 18; // Horário em horas
int horarioInicioAlmoco = 12; // Horário em horas
int horarioFimAlmoco = 13; // Horário em horas
int tempoLuzSala = 10; // Tempo em segundos
void setup() {
// Inicialização do LCD
lcd.init();
lcd.backlight();
// Inicialização do RTC
if (!rtc.begin()) {
lcd.print("Erro no RTC!");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Inicialização do DHT
dht.begin();
// Configuração dos pinos
pinMode(LED_AC, OUTPUT);
pinMode(LED_ALARME, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(ledSalas[i], OUTPUT);
pinMode(pirSensores[i], INPUT);
}
pinMode(BOTAO_MENU, INPUT_PULLUP);
pinMode(BOTAO_SELEC, INPUT_PULLUP);
pinMode(BOTAO_MAIS, INPUT_PULLUP);
pinMode(BOTAO_MENOS, INPUT_PULLUP);
lcd.print("Sistema Iniciado");
delay(2000);
lcd.clear();
}
bool debounce(int pin) {
if (digitalRead(pin) == LOW) {
if (millis() - lastButtonPress > 200) { // Debounce de 200ms
lastButtonPress = millis();
return true;
}
}
return false;
}
void exibirTelaInicial() {
lcd.clear();
DateTime now = rtc.now();
float temperatura = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print(now.day()); lcd.print("/"); lcd.print(now.month()); lcd.print("/"); lcd.print(now.year() % 100);
lcd.setCursor(0, 1);
lcd.print(now.hour()); lcd.print(":"); lcd.print(now.minute()); lcd.print(":"); lcd.print(now.second());
if (temperatura != NAN) {
lcd.setCursor(9, 0);
lcd.print(temperatura, 1);
lcd.print("C");
}
bool horarioComercial = now.hour() >= horarioInicioExpediente && now.hour() < horarioFimExpediente;
if (horarioComercial) {
lcd.setCursor(9, 1);
lcd.print("AC ON");
} else if (alarmeHabilitado) {
lcd.setCursor(9, 1);
lcd.print("Alarme");
}
}
void exibirMenu() {
lcd.clear();
switch (menuIndex) {
case 0:
lcd.print("1. Ajuste Horarios");
break;
case 1:
lcd.print("2. Setpoint Temp");
break;
case 2:
lcd.print("3. PIR Alarme");
break;
case 3:
lcd.print("4. Habilitar Alarme");
break;
default:
menuIndex = 0;
exibirMenu();
break;
}
}
void ajustarHorarios() {
int ajusteIndex = 0;
while (true) {
lcd.clear();
switch (ajusteIndex) {
case 0:
lcd.print("Inicio Exp: ");
lcd.print(horarioInicioExpediente);
break;
case 1:
lcd.print("Fim Exp: ");
lcd.print(horarioFimExpediente);
break;
case 2:
lcd.print("Inicio Alm: ");
lcd.print(horarioInicioAlmoco);
break;
case 3:
lcd.print("Fim Alm: ");
lcd.print(horarioFimAlmoco);
break;
}
delay(200);
if (debounce(BOTAO_MAIS)) {
switch (ajusteIndex) {
case 0: horarioInicioExpediente++; break;
case 1: horarioFimExpediente++; break;
case 2: horarioInicioAlmoco++; break;
case 3: horarioFimAlmoco++; break;
}
} else if (debounce(BOTAO_MENOS)) {
switch (ajusteIndex) {
case 0: horarioInicioExpediente--; break;
case 1: horarioFimExpediente--; break;
case 2: horarioInicioAlmoco--; break;
case 3: horarioFimAlmoco--; break;
}
} else if (debounce(BOTAO_SELEC)) {
ajusteIndex++;
if (ajusteIndex > 3) break;
}
}
}
void ajustarSetpoint() {
while (true) {
lcd.clear();
lcd.print("Setpoint: ");
lcd.print(setPoint, 1);
lcd.print(" C");
delay(200);
if (debounce(BOTAO_MAIS)) {
setPoint += 0.5;
} else if (debounce(BOTAO_MENOS)) {
setPoint -= 0.5;
} else if (debounce(BOTAO_SELEC)) {
break;
}
}
}
void configurarPIR() {
int pirIndex = 0;
while (true) {
lcd.clear();
lcd.print("PIR Sala ");
lcd.print(pirIndex + 1);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(pirAtivo[pirIndex] ? "Ativo" : "Inativo");
delay(200);
if (debounce(BOTAO_MAIS) || debounce(BOTAO_MENOS)) {
pirAtivo[pirIndex] = !pirAtivo[pirIndex];
} else if (debounce(BOTAO_SELEC)) {
pirIndex++;
if (pirIndex > 3) break;
}
}
}
void habilitarAlarme() {
if (alarmeHabilitado) {
alarmeHabilitado = false;
lcd.clear();
lcd.print("Alarme Desativado");
} else {
DateTime now = rtc.now();
if (now.hour() < horarioInicioExpediente || now.hour() >= horarioFimExpediente) {
alarmeHabilitado = true;
lcd.clear();
lcd.print("Alarme Ativado");
} else {
lcd.clear();
lcd.print("Fora Horario");
}
}
delay(2000);
}
void loop() {
exibirTelaInicial();
// Navegação pelo menu
if (debounce(BOTAO_MENU)) {
menuIndex = (menuIndex + 1) % 4;
exibirMenu();
} else if (debounce(BOTAO_SELEC)) {
switch (menuIndex) {
case 0:
ajustarHorarios();
break;
case 1:
ajustarSetpoint();
break;
case 2:
configurarPIR();
break;
case 3:
habilitarAlarme();
break;
}
exibirMenu();
}
}