#include "Wire.h"
#include "I2CKeyPad.h"
#include <LCD-I2C.h>
#include "DHTesp.h"
const uint8_t KEYPAD_ADDRESS = 0x38;
static uint8_t RelayPin1 = 33;
static uint8_t LedManual = 26;
static uint8_t LedAuto = 27;
const int DHT_PIN = 15;
int aux = 0;
char teclaAux;
byte INDICE = 0;
int cursor = 0;
char Tecla;
int btnManualState = 0;
char arrayTecla[3];
int temp_actual;
bool enviarDato = true;
int posicion_set = 50;
int posicion_set_puerta = 60;
int posicion_set_garaje = 60;
int posicion_ventana = 100;
int posicion_puerta = 100;
int posicion_garaje = 100;
int resetLcd = 1;
int Menu0 = 0; int Menu1 = 0;
int Menu2 = 0; int Menu3 = 0;
int Menu4 = 0; int Menu5 = 0;
int Menu6 = 0; int Menu7 = 0;
int Menu8 = 0; int Menu9 = 0;
int Menu10 = 0; int Menu11 = 0;
int Menu12 = 0; int Menu13 = 0;
int Menu14 = 0; int Menu15 = 0;
int numPista = 0;
int nivelVolumen = 0;
int setTemperatura = 21;
int setPersiana = 80;
//float temp_actual = 0.0;
I2CKeyPad keyPad(KEYPAD_ADDRESS);
DHTesp dhtSensor;
char keymap[19] = "123A456B789C*0#DNF"; // N = NoKey, F = Fail
LCD_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
pinMode(RelayPin1, INPUT);
pinMode(LedManual, OUTPUT);
pinMode(LedAuto, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.begin();
lcd.display();
lcd.backlight();
//menuPrincipal();
Wire.begin();
Wire.setClock(400000);
if (keyPad.begin() == false)
{
Serial.println("\nERROR: cannot communicate to keypad.\nPlease reboot.\n");
while (1);
}
keyPad.loadKeyMap(keymap);
}
void loop()
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temp_actual = data.temperature;
btnManualState = digitalRead(RelayPin1);
if (btnManualState == 1){
digitalWrite(LedManual, HIGH); // Led indica estado Manual
digitalWrite(LedAuto, LOW);
if (keyPad.isPressed()) {
Tecla = keyPad.getChar(); // note we want the translated char
delay(100);
resetLcd = 1;
} else if (Menu0 == 0 && aux == 0){
menuPrincipal();
Menu1 = 1;
Serial.println("incial");
}
} else {
digitalWrite(LedAuto, HIGH); // Led indica estado Automatico
digitalWrite(LedManual, LOW);
}
//************************* Control Manual del Proyecto *************************/
if (Tecla == 'A' && Menu1 == 1) {
Menu2 = 1; Menu4 = 1;
Menu0 = 1; Menu12 = 1; // Desabilitamos Menu Pricipal
limpiarLCD();
menuOpciones(); // Menu 1, Opcionesdel Menú
Tecla = '*';
Serial.println("Menu Opciones");
}
if (Menu2 == 1 && Tecla == '1') { //Menu 2 Termostato
Menu3 = 1;
Menu1 = 0;
Tecla = '*';
limpiarLCD();
menuTermostato(); // Menu 2
Serial.println("Menu Termostato");
}
if (Menu4 == 1 && Tecla == '2'){
Menu5 = 1; Menu7 = 1; Menu9 = 1; Menu1 = 0;
Menu2 = 0;
limpiarLCD();
menuPersiana(); // Menu 4 - Persianas
Serial.println("Menu Persiana");
Tecla = '*';
}
if (Menu12 == 1 && Tecla == '3'){
Menu13 = 1; Menu14 = 1; Tecla = '*';
Menu1 = 0;
limpiarLCD(); // Menu 5 - Musica
menuMusica();
Serial.println("Menu Musica");
}
if (Menu1 == 1 && Tecla == '4'){
Menu0 = 0; aux = 0;
Menu1 = 0;
limpiarLCD();
menuPrincipal(); // Menu Volver a Menu Pricipal
Serial.println("Menu Volver");
Tecla = '*';
}
//************** Menu Termostato *********************/
if (Menu3 == 1 && Tecla == 'A'){
limpiarLCD();
aux = 1;
menuSetTemperatura();
enviarDato = true;
INDICE = 0;
lcd.clear();
menuTermostato();
Menu3 = 0;
}
if (Menu2 == 1 && Tecla == 'B'){
limpiarLCD();
menuOpciones();
Tecla = 'A'; Menu2 = 0; Menu1 = 1; Menu3 = 0;
Serial.println("Menu Volver");
}
//****************** Menu Persiana Ventana ****************/
if (Menu5 == 1 && Tecla == 'A'){
Menu2 = 0;
Menu6 = 1;
Menu12 = 0;
limpiarLCD();
moverPersiana(); // Menu 5, mover persiana Ventana
Serial.println("Menu Persiana Ventana");
}
if (Menu5 == 1 && Tecla == '2'){
limpiarLCD();
menuOpciones();
Tecla = '*'; Menu4 = 1; Menu5 = 0; Menu6 = 0;
Serial.println("Menu Persiana Volver");
// Menu2=0; Menu1 = 1;
}
if (Menu6 == 1 && Tecla == '1'){
limpiarLCD();
menuSetPersiana();
enviarDato = true;
INDICE = 0;
lcd.clear();
moverPersiana();
Menu5 = 1; Tecla = 'A'; Menu6 = 0;
Serial.println("Menu Set Persiana Ventana");
}
//****************** Menu Persiana Puerta ****************/
if (Menu7 == 1 && Tecla == 'B'){
Menu2 = 0; Menu8 = 1; Tecla = '*';
limpiarLCD();
moverPersianaPuerta(); // Menu 5, mover persiana Puerta
Serial.println("Menu Persiana Puerta");
}
if (Menu7 == 1 && Tecla == '2'){
limpiarLCD();
menuOpciones();
Tecla = '*'; Menu4 = 1; Menu7 = 0; Menu8 = 0;
Serial.println("Menu Persiana Volver");
}
if (Menu8 == 1 && Tecla == '1'){
limpiarLCD();
menuSetPuerta();
enviarDato = true;
INDICE = 0;
lcd.clear();
moverPersianaPuerta();
Menu7 = 1; Tecla = 'B'; Menu8 = 0;
Serial.println("Menu Set Persiana Puerta");
}
//****************** Menu Persiana Garaje ****************/
if (Menu9 == 1 && Tecla == 'C'){
Menu2 = 0; Menu10 = 1; Tecla = '*';
limpiarLCD();
moverPersianaGaraje(); // Menu 5, mover persiana Ventana
Serial.println("Menu Persiana Garaje");
}
if (Menu9 == 1 && Tecla == '2'){
limpiarLCD();
menuOpciones();
Tecla = '*'; Menu4 = 1; Menu9 = 0; Menu10 = 0;
Serial.println("Menu Persiana Volver");
// Menu2=0; Menu1 = 1;
}
if (Menu10 == 1 && Tecla == '1'){
limpiarLCD();
menuSetGaraje();
enviarDato = true;
INDICE = 0;
lcd.clear();
moverPersianaGaraje();
Menu9 = 1; Tecla = 'C'; Menu10 = 0;
Serial.println("Menu Set Persiana Garaje");
}
if (Menu4 == 1 && Tecla == 'D'){
limpiarLCD();
menuOpciones();
Tecla = 'A'; Menu4 = 0; Menu5 = 0; Menu6 = 0;
Serial.println("Menu Persiana Volver");
Menu1 = 1;
}
/*********************** Menu Musica **************************/
if (Menu13 == 1 && Tecla == 'A'){
limpiarLCD();
menuSelctMusica();
enviarDato = true;
INDICE = 0;
lcd.clear();
menuMusica();
Menu12 = 1; Tecla = '*'; Menu13 = 0; Menu1 = 0;
Serial.println("Menu Select Musica");
}
if (Menu14 == 1 && Tecla == 'B'){
limpiarLCD();
setNivelVolumen();
Menu14 = 0; Tecla = '*'; Menu13 = 0;
Serial.println("Menu Nivel de Volumen");
}
if (Menu12 == 1 && Tecla == 'C') {
limpiarLCD();
menuOpciones();
Tecla = '*'; Menu4 = 0; Menu14 = 0; Menu12 = 0;
Menu1 = 1;
Serial.println("Menu Persiana Volver");
}
}
void limpiarLCD(){
if (btnManualState == true && resetLcd == 1) {
lcd.clear();
resetLcd = 0;
}
}
void volver(){
if (keyPad.isPressed()) {
Tecla = keyPad.getChar(); // note we want the translated char
delay(100);
resetLcd = 1;
}
}
void menuPrincipal () {
lcd.setCursor(6, 0); lcd.print("SMARTHOME");
lcd.setCursor(0, 1); lcd.print("Temp: ");
lcd.setCursor(6, 1); lcd.print(temp_actual);
lcd.setCursor(0, 2); lcd.print("Vent: ");
lcd.setCursor(6, 2); lcd.print( posicion_ventana);
lcd.setCursor(0, 3); lcd.print("Pta: ");
lcd.setCursor(6, 3); lcd.print( posicion_puerta);
lcd.setCursor(11, 1); lcd.print("Gar:");
lcd.setCursor(16, 1); lcd.print( posicion_garaje);
lcd.setCursor(11, 2); lcd.print("Audio: ");
lcd.setCursor(18, 2); lcd.print("0");
lcd.setCursor(11, 3); lcd.print("A-> Menu");
}
void menuOpciones(){
lcd.setCursor(0, 0); lcd.print("(1) Termostato");
lcd.setCursor(0, 1); lcd.print("(2) Persianas");
lcd.setCursor(0, 2); lcd.print("(3) Musica");
lcd.setCursor(0, 3); lcd.print("(4) Volver");
}
void menuTermostato(){
lcd.setCursor(0, 0); lcd.print(" TERMOSTATO");
lcd.setCursor(0, 1); lcd.print("Temp Actual: ");
lcd.setCursor(13, 1); lcd.print(temp_actual);
lcd.setCursor(16, 1); lcd.print("C");
lcd.setCursor(0,2); lcd.print("A. Set Temp: ");
lcd.setCursor(13,2); lcd.print(setTemperatura);
lcd.setCursor(16, 2); lcd.print("C");
lcd.setCursor(0, 3); lcd.print("B-> Volver");
}
void menuSetTemperatura (){
Serial.println("Menu Set Temperatura");
lcd.setCursor(0, 0);
lcd.print("Ingresar el nuevo ");
lcd.setCursor(0, 1);
lcd.print("valor de set: ");
lcd.setCursor(14, 1);
lcd.setCursor(0, 3);
lcd.print("C. Borrar");
lcd.setCursor(11, 3);
lcd.print("D. Enviar");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 2 ) {
} else if (teclaAux != 'C' && teclaAux != 'D' ) {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'C'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'D'){
setTemperatura = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}
void menuPersiana(){
lcd.setCursor(0, 0); lcd.print("(A) VENTANA");
lcd.setCursor(0, 1); lcd.print("(B) PUERTA");
lcd.setCursor(0, 2); lcd.print("(C) GARAJE");
lcd.setCursor(0, 3); lcd.print("(D) VOLVER");
}
void moverPersiana (){
lcd.setCursor(0, 0); lcd.print(" PERSIANA - VENTANA");
lcd.setCursor(0, 1); lcd.print("POS VENTANA: ");
lcd.setCursor(14, 1); lcd.print(posicion_ventana);
lcd.setCursor(0, 2); lcd.print("1-> SET PERS: ");
lcd.setCursor(14, 2); lcd.print(posicion_set);
lcd.setCursor(0, 3); lcd.print("2-> VOLVER ");
}
void menuSetPersiana(){
Serial.println("Menu Set Persiana");
lcd.setCursor(0, 0);
lcd.print("Ingresar el nuevo ");
lcd.setCursor(0, 1);
lcd.print("valor de set: ");
lcd.setCursor(14, 1);
lcd.setCursor(0, 3);
lcd.print("C. Borrar");
lcd.setCursor(11, 3);
lcd.print("D. Enviar");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 3 ) {
} else if (teclaAux != 'C' && teclaAux != 'D') {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'C'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'D'){
posicion_set = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}
void moverPersianaPuerta (){
lcd.setCursor(0, 0); lcd.print(" PERSIANA - PUERTA");
lcd.setCursor(0, 1); lcd.print("POS PUERTA: ");
lcd.setCursor(14, 1); lcd.print(posicion_puerta);
lcd.setCursor(0, 2); lcd.print("1-> SET PERS: ");
lcd.setCursor(14, 2); lcd.print(posicion_set_puerta);
lcd.setCursor(0, 3); lcd.print("2-> VOLVER ");
}
void menuSetPuerta(){
Serial.println("Menu Set Persiana Puerta");
lcd.setCursor(0, 0);
lcd.print("Ingresar el nuevo ");
lcd.setCursor(0, 1);
lcd.print("valor de set: ");
lcd.setCursor(14, 1);
lcd.setCursor(0, 3);
lcd.print("C. Borrar");
lcd.setCursor(11, 3);
lcd.print("D. Enviar");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 3 ) {
} else if (teclaAux != 'C' && teclaAux != 'D') {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'C'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'D'){
posicion_set_puerta = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}
void moverPersianaGaraje (){
lcd.setCursor(0, 0); lcd.print(" PERSIANA - GARAJE");
lcd.setCursor(0, 1); lcd.print("POS GARAJE: ");
lcd.setCursor(14, 1); lcd.print(posicion_garaje);
lcd.setCursor(0, 2); lcd.print("1-> SET PERS: ");
lcd.setCursor(14, 2); lcd.print(posicion_set_garaje);
lcd.setCursor(0, 3); lcd.print("2-> VOLVER ");
}
void menuSetGaraje(){
Serial.println("Menu Set Persiana Garaje");
lcd.setCursor(0, 0);
lcd.print("Ingresar el nuevo ");
lcd.setCursor(0, 1);
lcd.print("valor de set: ");
lcd.setCursor(14, 1);
lcd.setCursor(0, 3);
lcd.print("C. Borrar");
lcd.setCursor(11, 3);
lcd.print("D. Enviar");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 3 ) {
} else if (teclaAux != 'C' && teclaAux != 'D') {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'C'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'D'){
posicion_set_garaje = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}
void menuMusica(){
lcd.setCursor(0, 0); lcd.print(" MENU MUSICA");
lcd.setCursor(0, 1); lcd.print("A-> SEL MUSICA ");
lcd.setCursor(15, 1); lcd.print(numPista);
lcd.setCursor(0, 2); lcd.print("B-> VOLUMEN ");
lcd.setCursor(13, 2); lcd.print(nivelVolumen);
lcd.setCursor(0, 3); lcd.print("C-> VOLVER ");
}
void menuSelctMusica(){
lcd.setCursor(0, 1); lcd.print("Seleccionar Pista");
lcd.setCursor(0, 1); lcd.print("A-> Nro Pista ");
lcd.setCursor(0, 2); lcd.print("B-> BORRAR ");
lcd.setCursor(0, 3); lcd.print("C-> VOLVER ");
Serial.println("Menu Selest Musica");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 2 ) {
} else if (teclaAux != 'B' && teclaAux != 'C') {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'B'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'C'){
numPista = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}
void setNivelVolumen() {
lcd.setCursor(0, 0); lcd.print("A> Nivel VOl: ");
lcd.setCursor(0, 2); lcd.print("B> BORRAR ");
lcd.setCursor(0, 3); lcd.print("C> VOLVER ");
while (enviarDato) {
if (keyPad.isPressed()) {
teclaAux = keyPad.getChar();
delay(100);
if (INDICE == 3 ) {
} else if (teclaAux != 'B' && teclaAux != 'C' && teclaAux != 'A') {
arrayTecla[INDICE] = teclaAux;
cursor = INDICE + 14;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(arrayTecla[INDICE]); // Imprime un '*' por cada tecla presionada
delay(100);
INDICE++;
}
if (teclaAux == 'B'){
if (INDICE == 0) {
} else {
cursor = 13 + INDICE;
lcd.setCursor(cursor, 1); // Posiciona el cursor en la línea 2 y la columna correspondiente
lcd.print(" ");
delay(100); // Imprime un '*' por cada tecla presionada
INDICE--;
}
}
if (teclaAux == 'C'){
nivelVolumen = atoi(arrayTecla);
enviarDato = false;
break;
}
}
}
}