#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};
unsigned long star_pir[] {0, 0, 0, 0};
// Pinos dos botões
#define BOTAO_CIMA 22
#define BOTAO_DIR 23
#define BOTAO_ESQ 24
#define BOTAO_BAIXO 25
#define BOTAO_SELECT 26
// Variáveis de estado
bool alarmeHabilitado = false;
bool pirAtivo[4] = {1, 1, 1, 1}; // Configuração inicial dos PIRs
bool invasao[4] = {0, 0, 0, 0};
int menu = 9;
bool horario_comercial = 0;
bool horario_alarme = 0;
unsigned long lastButtonPress = 0;
// Configurações do sistema
int setPoint = 24;
float temperatura;
int h_Inicio = 8; // Horário em horas
int m_Inicio = 0;
int h_I_Almoco = 11;
int m_I_Almoco = 30;
int h_F_Almoco = 12;
int m_F_Almoco = 30;
int h_Fim = 18; // Horário em horas
int m_Fim = 0;
int tempoLuz = 10; // Tempo em segundos
//variáveis para senha
int senha[5] = {0, 0, 0, 0, 0};
int senha_aux[5] = {0, 0, 0, 0, 0};
int cursor = 0;
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_CIMA, INPUT_PULLUP);
pinMode(BOTAO_BAIXO, INPUT_PULLUP);
pinMode(BOTAO_DIR, INPUT_PULLUP);
pinMode(BOTAO_ESQ, INPUT_PULLUP);
pinMode(BOTAO_SELECT, INPUT_PULLUP);
// Serial.begin(115200);
/*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 loop() {
DateTime now = rtc.now();
temperatura = dht.readTemperature();
//Lógica para horário comercial e horário do alarme
if(now.hour() > h_Inicio && now.hour() < h_Fim){
horario_comercial = 1;
horario_alarme = 0;
}
else if(now.hour() == h_Inicio && now.minute() >= m_Inicio){
horario_comercial = 1;
horario_alarme = 0;
}
else if(now.hour() == h_Fim && now.minute() < m_Fim){
horario_comercial = 1;
horario_alarme = 0;
}
else {
horario_comercial = 0;
horario_alarme = 1;
}
if(!horario_alarme) //segurança para desabilitar o alarme geral se estiver fora do horario do alarme
alarmeHabilitado = 0;
//Lógica para testar se está no horário do almoço
if(now.hour() > h_I_Almoco && now.hour() < h_F_Almoco)
horario_comercial = 0;
else if(now.hour() == h_I_Almoco && now.minute() >= m_I_Almoco)
horario_comercial = 0;
else if(now.hour() == h_F_Almoco && now.minute() < m_F_Almoco)
horario_comercial = 0;
//Ligar e desligar o motor do AC (LED Azul)
if(horario_comercial == 1 && temperatura > setPoint)
digitalWrite(LED_AC, HIGH);
else
digitalWrite(LED_AC, LOW);
// Botões de avança e volta as telas do menu
if (debounce(BOTAO_DIR) && menu != 2 && menu != 30) {
menu++;
lcd.clear();
}
else if (debounce(BOTAO_ESQ) && menu != 2 && menu != 30) {
menu--;
lcd.clear();
}
// Monitoramento dos sensores PIR
for(int i=0;i<4;i++){
//Acionamento das lâmpadas
if(digitalRead(pirSensores[i])){
digitalWrite(ledSalas[i], HIGH);
star_pir[i] = millis();
}
if((millis() - star_pir[i]) > (tempoLuz - 5)*1000)
digitalWrite(ledSalas[i], LOW);
//Acionamento para alarme
if(horario_alarme && alarmeHabilitado && pirAtivo[i] && digitalRead(pirSensores[i])){
invasao[i] = 1;
digitalWrite(LED_ALARME, HIGH);
menu = 50;
lcd.clear();
}
}
//sequência dos menus
switch (menu) {
case 1: // tela incial
lcd.setCursor(0, 0);
if (now.day() < 10)
lcd.print("0");
lcd.print(now.day());
lcd.print('/');
if (now.month() < 10)
lcd.print("0");
lcd.print(now.month());
lcd.print('/');
lcd.print((now.year() - 2000));
lcd.print(" ");
lcd.print(temperatura, 1);
lcd.print(char(223));
lcd.print("C ");
lcd.setCursor(0, 1);
if (now.hour() < 10)
lcd.print("0");
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10)
lcd.print("0");
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10)
lcd.print("0");
lcd.print(now.second());
lcd.print(" S:");
lcd.print(setPoint);
lcd.print(char(223));
lcd.print("C");
if(horario_comercial)
lcd.print("C");
else if(horario_alarme && alarmeHabilitado)
lcd.print("A");
else
lcd.print(" ");
break;
case 2: //Digitar a senha para entrar nas configurações
lcd.setCursor(0, 0);
lcd.print("Senha: ");
for (int i = 0; i < 5; i++) { //imprime os 5 dígitos da senha auxiliar na tela
lcd.print(senha_aux[i]);
}
lcd.setCursor(cursor + 7, 0); //coloca o cursor em baixo do digito a ser alterado
lcd.cursor();
delay(200);
lcd.noCursor();
//Funcão de cada botão dentro desta case
if (debounce(BOTAO_DIR))
cursor = (cursor + 1) % 5;
else if (debounce(BOTAO_ESQ)) {
cursor--;
if(cursor < 0) cursor = 0;
}
else if (debounce(BOTAO_CIMA))
senha_aux[cursor] = (senha_aux[cursor] + 1) % 10;
else if (debounce(BOTAO_BAIXO)) {
senha_aux[cursor]--;
if(senha_aux[cursor] < 0) senha_aux[cursor] = 9;
}
else if (debounce(BOTAO_SELECT)) {
if(senha[0] == senha_aux[0] && senha[1] == senha_aux[1] && senha[2] == senha_aux[2] &&
senha[3] == senha_aux[3] && senha[4] == senha_aux[4]){
lcd.clear();
lcd.print("Senha Correta!");
delay(1000);
menu = 9;
lcd.clear();
for (int i = 0; i < 5; i++) { //zera a senha auxiliar para usar depois
senha_aux[i] = 0;
}
}
else{
lcd.clear();
lcd.print("Senha INCORRETA!");
delay(1000);
lcd.clear();
}
}
break;
case 9: //Ativa e desativa o alarme geral
lcd.setCursor(0, 0);
lcd.print("Alarme Ativado? ");
lcd.setCursor(5, 1);
if(alarmeHabilitado) lcd.print("SIM");
else lcd.print("NAO");
if (debounce(BOTAO_CIMA) && horario_alarme && !alarmeHabilitado) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ativando em ");
for(int i=10;i>0;i--){ //regrassiva para ativar
lcd.setCursor(12, 0);
lcd.print(String(i) + " ");
delay(1000);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarme Ativado! ");
alarmeHabilitado = 1;
delay(1000);
lcd.clear();
menu = 1;
}
if (debounce(BOTAO_BAIXO)){
alarmeHabilitado = 0;
digitalWrite(LED_ALARME, LOW);
for(int i=0;i<4;i++){
invasao[i] = 0;
}
}
break;
case 10: //Ajuste da hora do início do expedinete
lcd.setCursor(0, 0);
lcd.print("Inicio do Exped.");
lcd.setCursor(4, 1);
lcd.print(">");
if(h_Inicio < 10) lcd.print("0");
lcd.print(h_Inicio);
lcd.print(":");
if(m_Inicio < 10) lcd.print("0");
lcd.print(m_Inicio);
if (debounce(BOTAO_CIMA))
h_Inicio = (h_Inicio + 1) % 24;
else if (debounce(BOTAO_BAIXO)) {
h_Inicio--;
if(h_Inicio < 0) h_Inicio = 23;
}
break;
case 11: //Ajuste dos minutos do início do expedinete
lcd.setCursor(0, 0);
lcd.print("Inicio do Exped.");
lcd.setCursor(5, 1);
if(h_Inicio < 10) lcd.print("0");
lcd.print(h_Inicio);
lcd.print(":");
if(m_Inicio < 10) lcd.print("0");
lcd.print(m_Inicio);
lcd.print("<");
if (debounce(BOTAO_CIMA))
m_Inicio = (m_Inicio + 1) % 60;
else if (debounce(BOTAO_BAIXO)) {
m_Inicio--;
if(m_Inicio < 0) m_Inicio = 59;
}
break;
case 12: //Ajuste da hora do início do almoço
lcd.setCursor(0, 0);
lcd.print("Inicio do Almoco");
lcd.setCursor(4, 1);
lcd.print(">");
if(h_I_Almoco < 10) lcd.print("0");
lcd.print(h_I_Almoco);
lcd.print(":");
if(m_I_Almoco < 10) lcd.print("0");
lcd.print(m_I_Almoco);
if (debounce(BOTAO_CIMA))
h_I_Almoco = (h_I_Almoco + 1) % 24;
else if (debounce(BOTAO_BAIXO)) {
h_I_Almoco--;
if(h_I_Almoco < 0) h_I_Almoco = 23;
}
break;
case 13: //Ajuste dos minutos do início do Almoço
lcd.setCursor(0, 0);
lcd.print("Inicio do Almoco");
lcd.setCursor(5, 1);
if(h_I_Almoco < 10) lcd.print("0");
lcd.print(h_I_Almoco);
lcd.print(":");
if(m_I_Almoco < 10) lcd.print("0");
lcd.print(m_I_Almoco);
lcd.print("<");
if (debounce(BOTAO_CIMA))
m_I_Almoco = (m_I_Almoco + 1) % 60;
else if (debounce(BOTAO_BAIXO)) {
m_I_Almoco--;
if(m_I_Almoco < 0) m_I_Almoco = 59;
}
break;
case 14: //Ajuste da hora do fim do almoço
lcd.setCursor(0, 0);
lcd.print(" Fim do Almoco ");
lcd.setCursor(4, 1);
lcd.print(">");
if(h_F_Almoco < 10) lcd.print("0");
lcd.print(h_F_Almoco);
lcd.print(":");
if(m_F_Almoco < 10) lcd.print("0");
lcd.print(m_F_Almoco);
if (debounce(BOTAO_CIMA))
h_F_Almoco = (h_F_Almoco + 1) % 24;
else if (debounce(BOTAO_BAIXO)) {
h_F_Almoco--;
if(h_F_Almoco < 0) h_F_Almoco = 23;
}
break;
case 15: //Ajuste dos minutos do fim do almoço
lcd.setCursor(0, 0);
lcd.print(" Fim do Almoco ");
lcd.setCursor(5, 1);
if(h_F_Almoco < 10) lcd.print("0");
lcd.print(h_F_Almoco);
lcd.print(":");
if(m_F_Almoco < 10) lcd.print("0");
lcd.print(m_F_Almoco);
lcd.print("<");
if (debounce(BOTAO_CIMA))
m_F_Almoco = (m_F_Almoco + 1) % 60;
else if (debounce(BOTAO_BAIXO)) {
m_F_Almoco--;
if(m_F_Almoco < 0) m_F_Almoco = 59;
}
break;
case 16: //Ajuste da hora do Fim do expedinete
lcd.setCursor(0, 0);
lcd.print("Fim do Expedien.");
lcd.setCursor(4, 1);
lcd.print(">");
if(h_Fim < 10) lcd.print("0");
lcd.print(h_Fim);
lcd.print(":");
if(m_Fim < 10) lcd.print("0");
lcd.print(m_Fim);
if (debounce(BOTAO_CIMA))
h_Fim = (h_Fim + 1) % 24;
else if (debounce(BOTAO_BAIXO)) {
h_Fim--;
if(h_Fim < 0) h_Fim = 23;
}
break;
case 17: //Ajuste dos minutos do Fim do expedinete
lcd.setCursor(0, 0);
lcd.print("Fim do Expedien.");
lcd.setCursor(5, 1);
if(h_Fim < 10) lcd.print("0");
lcd.print(h_Fim);
lcd.print(":");
if(m_Fim < 10) lcd.print("0");
lcd.print(m_Fim);
lcd.print("<");
if (debounce(BOTAO_CIMA))
m_Fim = (m_Fim + 1) % 60;
else if (debounce(BOTAO_BAIXO)) {
m_Fim--;
if(m_Fim < 0) m_Fim = 59;
}
break;
case 18: //Ajuste do SetPoit do Ar Condicionado
lcd.setCursor(0, 0);
lcd.print(" SetPoint AC ");
lcd.setCursor(6, 1);
lcd.print(String(setPoint) + char(223) + "C ");
if (debounce(BOTAO_CIMA)) {
setPoint++;
if(setPoint > 30) setPoint = 30;
}
else if (debounce(BOTAO_BAIXO)) {
setPoint--;
if(setPoint < 16) setPoint = 16;
}
break;
case 19: //Ajuste do tempo de lâmpada ligada
lcd.setCursor(0, 0);
lcd.print("Tempo Lampada ON");
lcd.setCursor(6, 1);
if(tempoLuz < 10) lcd.print("0");
lcd.print(String(tempoLuz) + " seg. ");
if (debounce(BOTAO_CIMA)) {
tempoLuz++;
}
else if (debounce(BOTAO_BAIXO)) {
tempoLuz--;
if(tempoLuz < 5) tempoLuz = 5;
}
break;
case 20: //Ativa e desativa o sensore de presença da sala 1
lcd.setCursor(0, 0);
lcd.print(">SL1 SL2 SL3 SL4");
for(int i=0;i<4;i++){
lcd.setCursor((i*4)+1, 1);
if(pirAtivo[i]) lcd.print("ON ");
else lcd.print("OFF");
}
if (debounce(BOTAO_CIMA)) {
pirAtivo[0] = !pirAtivo[0];
}
break;
case 21: //Ativa e desativa o sensore de presença da sala 2
lcd.setCursor(0, 0);
lcd.print(" SL1>SL2 SL3 SL4");
for(int i=0;i<4;i++){
lcd.setCursor((i*4)+1, 1);
if(pirAtivo[i]) lcd.print("ON ");
else lcd.print("OFF");
}
if (debounce(BOTAO_CIMA)) {
pirAtivo[1] = !pirAtivo[1];
}
break;
case 22: //Ativa e desativa o sensore de presença da sala 3
lcd.setCursor(0, 0);
lcd.print(" SL1 SL2>SL3 SL4");
for(int i=0;i<4;i++){
lcd.setCursor((i*4)+1, 1);
if(pirAtivo[i]) lcd.print("ON ");
else lcd.print("OFF");
}
if (debounce(BOTAO_CIMA)) {
pirAtivo[2] = !pirAtivo[2];
}
break;
case 23: //Ativa e desativa o sensore de presença da sala 4
lcd.setCursor(0, 0);
lcd.print(" SL1 SL2 SL3>SL4");
for(int i=0;i<4;i++){
lcd.setCursor((i*4)+1, 1);
if(pirAtivo[i]) lcd.print("ON ");
else lcd.print("OFF");
}
if (debounce(BOTAO_CIMA)) {
pirAtivo[3] = !pirAtivo[3];
}
break;
case 24: //Trocar a senha?
lcd.setCursor(0, 0);
lcd.print("Trocar a senha? ");
lcd.setCursor(0, 1);
lcd.print("S(Enter) N(>)");
if (debounce(BOTAO_SELECT)) {
menu = 30;
cursor = 0;
lcd.clear();
}
break;
case 30: //Troca de senha
lcd.setCursor(0, 0);
lcd.print(" Nova Senha: ");
lcd.setCursor(5, 1);
for (int i = 0; i < 5; i++) { //imprime os 5 dígitos da senha auxiliar na tela
lcd.print(senha_aux[i]);
}
lcd.setCursor(cursor + 5, 1); //coloca o cursor em baixo do digito a ser alterado
lcd.cursor();
delay(200);
lcd.noCursor();
//Funcão de cada botão dentro desta case
if (debounce(BOTAO_DIR))
cursor = (cursor + 1) % 5;
else if (debounce(BOTAO_ESQ)) {
cursor--;
if(cursor < 0) cursor = 0;
}
else if (debounce(BOTAO_CIMA))
senha_aux[cursor] = (senha_aux[cursor] + 1) % 10;
else if (debounce(BOTAO_BAIXO)) {
senha_aux[cursor]--;
if(senha_aux[cursor] < 0) senha_aux[cursor] = 9;
}
else if (debounce(BOTAO_SELECT)) {
for (int i = 0; i < 5; i++) { //zera a senha auxiliar para usar depois
senha[i] = senha_aux[i];
senha_aux[i] = 0;
}
lcd.clear();
lcd.print("Senha Alterada!");
delay(1000);
menu = 1;
lcd.clear();
cursor = 0;
}
break;
case 50:
lcd.setCursor(0, 0);
lcd.print("Invasao Detectad");
for(int i=0;i<4;i++){
lcd.setCursor(i*4, 1);
if(invasao[i])
lcd.print("SL" + String(i+1));
else
lcd.print(" ");
}
break;
default:
menu = 1;
break;
}
}