//João Pedro
/*
Para abrir o menu -> Letra A
Para subir o seletor no menu -> Letra A
Para subir o seletor no menu -> Letra B
Para entrar no menu selecionado -> Letra C
Dentro das opções do menu existe um
Para sair de qualquer tela para o menu incial -> Letra #
*/
#include "RTClib.h"
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define ledsl1 35
#define ledsl2 34
#define ledsl3 33
#define ledsl4 32
#define ledverm 36
#define ledAlarm 37
#define sensor1 23
#define sensor2 25
#define sensor3 27
#define sensor4 29
#define DHTTYPE DHT22
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
RTC_DS1307 rtc;
DHT dht(13, DHTTYPE);
char teclapres = NO_KEY;
char daysOfTheWeek[7][12] = {"Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"};
const byte rows = 4;
const byte cols = 4;
char keys[rows][cols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[rows] = {2, 3, 4, 5};
byte colPins[cols] = {6, 7, 8, 9};
byte arrowDown[8] = {
B00100,
B00100,
B00100,
B00100,
B00100,
B11111,
B01110,
B00100
};
byte arrowRight[8] = {
B00000,
B00100,
B00110,
B11111,
B00110,
B00100,
B00000,
B00000
};
Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );
int SetaLinha, SetaColuna;
int horaInic, horaTerm;
int minInic, minTerm = 0;
int minutosInic, minutosTerm, minutosAgora;
int menu = 0;
int sp;
int menudsc;
bool state[4] = {0, 0, 0, 0};
bool dentrohora = false;
int spm[2] = {0, 0};
char tecla;
int timerArray[2];
char x[4] = {'/', '/', '/', '/'};
char xx[4] = {'/', '/', '/', '/'};
int h = 0;
int timer = 7000;
unsigned long lastDebounceTime = 0;
unsigned long lastDebounceTime2 = 0;
bool Alarme = false;
bool AlarmeGeral = false;
bool flag = 0;
unsigned long ultimativ[4];
int LastMenu;
bool ledState[4] = {false, false, false, false};
void setup () {
lcd.init();
lcd.backlight();
Serial.begin(115200);
dht.begin();
pinMode(ledAlarm, OUTPUT);
pinMode(ledverm, OUTPUT);
pinMode(ledsl1, OUTPUT);
pinMode(ledsl2, OUTPUT);
pinMode(ledsl3, OUTPUT);
pinMode(ledsl4, OUTPUT);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(sensor4, INPUT);
lcd.createChar(0, arrowDown);
lcd.createChar(1, arrowRight);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop () {
teclapres = teclado.getKey();
if (teclapres != NO_KEY && teclapres != 'A' && teclapres != 'B' && teclapres != 'C' && teclapres != 'D' && teclapres != 'X' && teclapres != '*' && menu == 3)
{
lcd.clear();
x[h] = teclapres - 48;
h++;
if (h > 3) h = 0;
}
else if (teclapres != NO_KEY && teclapres != 'A' && teclapres != 'B' && teclapres != 'C' && teclapres != 'D' && teclapres != 'X' && teclapres != '*' && menu == 4)
{
lcd.clear();
xx[h] = teclapres - 48;
h++;
if (h > 3) h = 0;
}
else if (teclapres != NO_KEY && teclapres != 'A' && teclapres != 'B' && teclapres != 'C' && teclapres != 'D' && teclapres != 'X' && teclapres != '*' && menu == 2)
{
lcd.clear();
spm[h] = teclapres - 48;
h++;
if (h >= 2) h = 0;
}
else if (teclapres != NO_KEY && teclapres != 'A' && teclapres != 'B' && teclapres != 'C' && teclapres != 'D' && teclapres != 'X' && teclapres != '*' && menu == 7)
{
lcd.clear();
timerArray[h] = teclapres - 48;
h++;
if (h >= 2) h = 0;
}
float t = dht.readTemperature();
int h = dht.readHumidity();
DateTime now = rtc.now();
minutosInic = horaInic * 60 + minInic;
minutosTerm = horaTerm * 60 + minTerm;
minutosAgora = now.hour() * 60 + now.minute();
if (minutosAgora >= minutosInic && minutosAgora <= minutosTerm) {
dentrohora = true;
if (minutosInic != 0 && minutosTerm != 0) Alarme = true;
if (sp < t && Alarme == true && sp != 0) {
digitalWrite(ledAlarm, HIGH);
} else {
digitalWrite(ledAlarm, LOW);
}
} else {
dentrohora = false;
digitalWrite(ledAlarm, LOW);
}
switch(menu) {
case (0):
lcd.setCursor(0, 0);
lcd.print(now.year());
lcd.print('/');
if (now.month() < 10) lcd.print("0");
lcd.print(now.month());
lcd.print('/');
if (now.day() < 10) lcd.print("0");
lcd.print(now.day());
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.setCursor(12, 0);
lcd.print(t,1);
lcd.print("*C ");
lcd.setCursor(11, 1);
lcd.print("SP:");
lcd.setCursor(14, 1);
lcd.print(sp);
lcd.setCursor(18, 1);
if (Alarme == true) lcd.print("A");
else lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("A->Menu");
if (teclapres == 'A') {
lcd.clear();
menu = 1;
h = 0;
}
break;
case(1):
if (menudsc == 0)
{
lcd.setCursor(1, 0);
lcd.print("SetPoint");
lcd.setCursor(1, 1);
lcd.print("Hora de Inicio");
lcd.setCursor(1, 2);
lcd.print("Hora de fechamento");
lcd.setCursor(1, 3);
lcd.print("Salas");
lcd.setCursor(0, SetaColuna);
lcd.write(byte(1));
lcd.setCursor(19, 3);
lcd.write(byte(0));
}
if (menudsc == 1)
{
lcd.setCursor(1, 0);
lcd.print("Hora de Inicio");
lcd.setCursor(1, 1);
lcd.print("Hora de fechamento");
lcd.setCursor(1, 2);
lcd.print("Salas");
lcd.setCursor(1, 3);
lcd.print("Tempo leds");
lcd.setCursor(0, SetaColuna);
lcd.write(byte(1));
lcd.setCursor(19, 3);
lcd.write(byte(0));
}
if (teclapres == 'A') {
SetaColuna -= 1;
lcd.clear();
}
else if (teclapres == 'B')
{
SetaColuna += 1;
lcd.clear();
}
if (SetaColuna >= 4 && menudsc == 1 )
{
SetaColuna = 0;
menudsc = 0;
}
if (SetaColuna >= 4 && menudsc == 0) {
SetaColuna = 3;
menudsc = 1;
}
if (SetaColuna < 0 && menudsc == 1) menudsc = 0;
if (SetaColuna < 0) SetaColuna = 0;
if (SetaColuna == 0 && teclapres == 'D' && menudsc == 0) {
menu = 2;
lcd.clear();
} else if (SetaColuna == 1 && teclapres == 'D' && menudsc == 0 || SetaColuna == 0 && teclapres == 'B' && menudsc == 1) {
menu = 3;
lcd.clear();
} else if (SetaColuna == 2 && teclapres == 'D' && menudsc == 0 || SetaColuna == 1 && teclapres == 'B' && menudsc == 1) {
menu = 4;
lcd.clear();
} else if (SetaColuna == 3 && teclapres == 'D' && menudsc == 0 || SetaColuna == 2 && teclapres == 'B' && menudsc == 1) {
menu = 5;
lcd.clear();
}
else if (SetaColuna == 3 && teclapres == 'D' && menudsc == 1 ) {
menu = 7;
lcd.clear();
}
if (teclapres == '#') {
lcd.clear();
menu = 0;
}
break;
case(2):
lcd.setCursor(3, 0);
lcd.print("Set Point");
lcd.setCursor(5, 1);
sp = spm[0] * 10 + spm[1];
lcd.print(sp);
lcd.setCursor(0, 3);
lcd.print("A->Confirma");
if (teclapres == 'A') {
lcd.clear();
menu = 1;
}
break;
case(3):
lcd.setCursor(0,0);
lcd.print("Defina o inicio");
lcd.setCursor(0,1);
lcd.setCursor(6,1);
horaInic = x[0] * 10 + x[1];
if (horaInic < 0 || horaInic >= 24) horaInic = 00;
minInic = x[2] * 10 + x[3];
if (minInic < 0 || minInic >= 60 ) minInic = 00;
lcd.print(horaInic);
lcd.print(":");
lcd.print(minInic);
lcd.setCursor(0, 3);
lcd.print("A->Confirma");
if (teclapres == 'A')
{
Serial.print(horaInic);
Serial.print(':');
Serial.println(minInic);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("HORA INICIO DEF!");
delay(1000);
lcd.clear();
menu = 1;
}
break;
case(4):
lcd.setCursor(0,0);
lcd.print("Defina um termino");
lcd.setCursor(0,1);
lcd.setCursor(6,1);
horaTerm = xx[0] * 10 + xx[1];
if (horaTerm < 0 || horaTerm >= 24) horaTerm = 00;
minTerm = xx[2] * 10 + xx[3];
if (minTerm < 0 || minTerm >= 60) minTerm= 00;
lcd.print(horaTerm);
lcd.print(":");
lcd.print(minTerm);
lcd.setCursor(0, 3);
lcd.print("A->Confirma");
if (teclapres == 'A')
{
Serial.print(horaTerm);
Serial.print(":");
Serial.println(minTerm);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("FIM EXPED DEF!");
delay(1000);
lcd.clear();
menu = 1;
}
break;
case(5):
lcd.setCursor(0,0);
lcd.print("Geral:");
lcd.print(AlarmeGeral);
lcd.setCursor(0,1);
lcd.print("Sala 1:");
lcd.print(state[0]);
lcd.setCursor(9,1);
lcd.print("Sala 2:");
lcd.print(state[1]);
lcd.setCursor(0,2);
lcd.print("Sala 3:");
lcd.print(state[2]);
lcd.setCursor(9,2);
lcd.print("Sala 4:");
lcd.print(state[3]);
if(teclapres == '1') state[0] = !state[0];
if(teclapres == '2') state[1] = !state[1];
if(teclapres == '3') state[2] = !state[2];
if(teclapres == '4') state[3] = !state[3];
if(teclapres == '0') AlarmeGeral = !AlarmeGeral;
lcd.setCursor(0, 3);
lcd.print("A->Sair");
Serial.println(teclapres);
if (teclapres == 'A')
{
menu = 1;
lcd.clear();
}
break;
case(6):
if (digitalRead(sensor1) == 1 && state[0] == 1 && !dentrohora)
{
lcd.setCursor(0,0);
lcd.print(" ALARME ATIVADO ");
lcd.setCursor(0,1);
lcd.print(" SALA 1 ");
lcd.setCursor(0,2);
lcd.print(" APERTE A LETRA C ");
lcd.setCursor(0,3);
lcd.print("PARA SAIR DESSA TELA");
}
else if (digitalRead(sensor2) == 1 && state[1] == 1 && !dentrohora)
{
lcd.setCursor(0,0);
lcd.print(" ALARME ATIVADO ");
lcd.setCursor(0,1);
lcd.print(" SALA 2 ");
lcd.setCursor(0,2);
lcd.print(" APERTE A LETRA C ");
lcd.setCursor(0,3);
lcd.print("PARA SAIR DESSA TELA");
}
else if (digitalRead(sensor3) == 1 && state[2] == 1 && !dentrohora)
{
lcd.setCursor(0,0);
lcd.print(" ALARME ATIVADO ");
lcd.setCursor(0,1);
lcd.print(" SALA 3 ");
lcd.setCursor(0,2);
lcd.print(" APERTE A LETRA C ");
lcd.setCursor(0,3);
lcd.print("PARA SAIR DESSA TELA");
}
else if (digitalRead(sensor4) == 1 && state[3] == 1 && !dentrohora)
{
lcd.setCursor(0,0);
lcd.print(" ALARME ATIVADO ");
lcd.setCursor(0,1);
lcd.print(" SALA 4 ");
lcd.setCursor(0,2);
lcd.print(" APERTE A LETRA C ");
lcd.setCursor(0,3);
lcd.print("PARA SAIR DESSA TELA");
}
else if (teclapres == 'C')
{
Serial.println(LastMenu);
lcd.clear();
digitalWrite(ledverm,LOW);
menu = 0;
}
break;
case(7):
lcd.setCursor(0, 0);
lcd.print("Set Timer (s):");
//teclapres = teclado.getKey();
if (teclapres != NO_KEY && teclapres != 'A' && teclapres != 'B' && teclapres != 'C' && teclapres != 'D' && teclapres != 'X' && teclapres != '*')
{
lcd.clear();
timerArray[h] = teclapres - 48;
h++;
if (h >= 2) h = 0;
Serial.print(timerArray[0]);
Serial.print(timerArray[1]);
}
int poss = h + 9;
lcd.setCursor(9,1);
lcd.print(timerArray[0]);
lcd.print(timerArray[1]);
lcd.setCursor(poss, 2);
lcd.print("^");
lcd.setCursor(0, 3);
lcd.print("A->Confirma");
// Quando a tecla 'A' for pressionada, confirma o valor e converte para milissegundos
if (teclapres == 'A') {
// Convertemos o valor dos dois dígitos para o timer
timer = (timerArray[0] * 10 + timerArray[1]) * 1000; // Convertendo para milissegundos
Serial.print("Novo valor de timer: ");
Serial.println(timer);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TIMER DEFINIDO!");
delay(1000);
lcd.clear();
menu = 1; // Volta para o menu principal ou próximo passo
}
break;
}
if (teclapres == '#')
{
lcd.clear();
menu = 0;
}
if (Alarme == true) {
// Sensor 1
if (digitalRead(sensor1) == 1 && dentrohora && !ledState[0]) {
digitalWrite(35, HIGH);
ultimativ[0] = millis();
ledState[0] = true;
} else if (ledState[0] && (millis() - ultimativ[0]) > timer) {
digitalWrite(35, LOW);
ledState[0] = false;
}
// Sensor 2
if (digitalRead(sensor2) == 1 && dentrohora && !ledState[1]) {
digitalWrite(34, HIGH);
ultimativ[1] = millis();
ledState[1] = true;
} else if (ledState[1] && (millis() - ultimativ[1]) > timer) {
digitalWrite(34, LOW);
ledState[1] = false;
}
// Sensor 3
if (digitalRead(sensor3) == 1 && dentrohora && !ledState[2]) {
digitalWrite(33, HIGH);
ultimativ[2] = millis();
ledState[2] = true;
} else if (ledState[2] && (millis() - ultimativ[2]) > timer) {
digitalWrite(33, LOW);
ledState[2] = false;
}
// Sensor 4
if (digitalRead(sensor4) == 1 && dentrohora && !ledState[3]) {
digitalWrite(32, HIGH);
ultimativ[3] = millis();
ledState[3] = true;
} else if (ledState[3] && (millis() - ultimativ[3]) > timer) {
digitalWrite(32, LOW);
ledState[3] = false;
}
}
if (AlarmeGeral == true && !dentrohora) {
if (digitalRead(sensor1) == 1 && state[0]) {
digitalWrite(ledverm, HIGH);
LastMenu = menu;
menu = 6;
}
else if (digitalRead(sensor2) == 1 && state[1]) {
digitalWrite(ledverm, HIGH);
LastMenu = menu;
menu = 6;
}
else if (digitalRead(sensor3) == 1 && state[2]) {
digitalWrite(ledverm, HIGH);
LastMenu = menu;
menu = 6;
}
else if (digitalRead(sensor4) == 1 && state[3]) {
digitalWrite(ledverm, HIGH);
LastMenu = menu;
menu = 6;
}
/*Serial.println((millis() - lastDebounceTime));
// Verifica se o LED deve ser desligado
if (flag == 1 && (millis() - lastDebounceTime) >= timer) {
digitalWrite(ledverm, LOW);
flag = 0; // Reseta o flag para não desligar novamente
}
*/
}
}