// PRUEBA DE ALARMA
#include <WiFi.h> //libreria comunicacion Wifi
#include <WiFiClientSecure.h> //Implementa soporte para conexiones seguras mediante TLS (SSL)
#include <UniversalTelegramBot.h> //Libreria para uso de bot en Tetelgram
#include <ArduinoJson.h> //Libreria Json (JavaScript Object Notation)
#include <Wire.h> //libreria comunicacion I2C
#include <EEPROM.h> //Incluimos la librería de EEPROM
#include <LiquidCrystal_I2C.h> //libreria LCD I2C
#include <Keypad.h> //libreria teclado
#include <freertos/FreeRTOS.h> //libreria para FreeRTOS
#include <freertos/task.h> //libreria para Tareas de FreeRTOS
#include <freertos/timers.h> //libreria para delay en FreeRTOS
const char* ssid = "Wokwi-GUEST"; //Nombre de la red Wifi
const char* password = ""; //Pasword de la red Wifi
char pulsacion; //almacena la tecla pulsada
char clave [6]; //cantidad de catacteres de la clave
char clave_maestra [6] = "0000C"; //contraseña correcta
byte indice = 0; //reinicio de caracteres
int contador = 1; // cuenta el nivel del menu en el que se esta
const byte ROWS = 4; //Cuatro Filas
const byte COLS = 4; //Cuatro Columnas
const int sw1 = 15; //variable sensor magnetico
int estado1 = 0; //variable que guarda el estado1 de la señal
int s1 = 0; //variable para asegurar la entrada al sensor_1
const int cor = 4; //indicador clave correcta y alarma armada
const int inc = 16; //indicador clave incorrecta y alarma activada
const int vos = 17; //indicador bocina
const int wificon = 5; //indicador Wifi conectado
int cursor = 0; //variable de posicion del cursor en la LCD
#define BOTtoken " " //Token de Bot telegram (obtenido de Botfather)
#define CHAT_ID " " //ID de uduario de telegram
#define EEPROM_SIZE 20 //Tamaño de memoria EEPROM en el esp32 asta (512Kb)
TaskHandle_t Tarea_wifi; //indicados de la tarea del wifi
WiFiClientSecure client; //Cliente para conexiones seguras mediante TLS (SSL).
UniversalTelegramBot bot(BOTtoken, client); //Uso de Token y Cliente de telegram
//////////////////////////////////////Tarea del wifi//////////////////////////////////////////////////////////////////////
void Tarea_wificode(void * parameter) //tarea que corre en paralelo la coneccion wifi
{
Serial.println("Conectando con la red WIFI"); //imprime en monitor serial
WiFi.mode(WIFI_STA); //deja en modo STA (Estacion)
WiFi.begin(ssid, password); //verifica el nombre de la red y su contraseña
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); //Agrega sertificacion root para api.telegram.org
for(;;) //inicio de ciclo infinito
{
unsigned long startAttemptTime = millis(); //inicia la cuenta del siclo en milis
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 2000) //revisa el status de la red y lo compara si esta conectado o no
{
Serial.print('.'); //imprime en monitor serial
vTaskDelay(100 / portTICK_PERIOD_MS); //retardo de freeRTOS
}
if(WiFi.status() == WL_CONNECTED) //si el estado es conectado
{
vTaskDelay(1000 / portTICK_PERIOD_MS); //retardo de freeRTOS
Serial.println("WIFI Conectado"); //imprime en monitor serial
Serial.print(WiFi.localIP()); //imprime en monitor serial
digitalWrite(wificon, HIGH); //incicador de wifi conectado
}
if(WiFi.status() != WL_CONNECTED) //si el estado es desconectado
{
Serial.println("Falla en la red WIFI"); //imprime en monitor serial
vTaskDelay(300 / portTICK_PERIOD_MS); //retardo de freeRTOS
digitalWrite(wificon, LOW); //incicador de wifi conectado
}
}
}
///////////////////////////////////////orden del teclado/////////////////////////////////////////////////////////////////
char keys[ROWS][COLS] = //cadena de caracteres filas y colubnas del teclado
{
{'1','2','3','A'},
{'4','5','6','B'}, //orden de las teclas
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {32,33,25,26}; //Puntos de conexion del teclado al arduino FILAS
byte colPins[COLS] = {27,14,12,13}; //Puntos de conexion del teclado al arduino COLUMNAS
Keypad Teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Configura el teclado
LiquidCrystal_I2C lcd(0x27,16,2); //Direccion del LCD
//////////////////////////////////Void Setup()/////////////////////////////////////////
void setup ()
{
Serial.begin(115200); //inicialisa puerto serial
EEPROM.begin(EEPROM_SIZE); //inicialisa espacio de memoria EEPROM
lcd.init(); //inicialisa LCD
lcd.backlight(); //luz de LCD
pinMode(cor, OUTPUT); //indicador clave correcta y alarma armada
pinMode(inc, OUTPUT); //indicador clave incorrecta y alarma activada
pinMode(vos, OUTPUT); //indicador bocina
pinMode(wificon, OUTPUT); //indicador Wifi conectado
pinMode(sw1, INPUT); //señal que se recibe del sensor magnetico
xTaskCreatePinnedToCore(Tarea_wificode,"Tarea_wifi",5000,NULL,1,&Tarea_wifi,0); //Esa función toma varios argumentos, incluida la prioridad y el núcleo donde debe ejecutarse la tarea (el último parámetro)
menu_bienvenida(); //muestra el intro de bienvenida
//EEPROM.end();
}
//////////////////////////Void loop()//////////////////////////////////////////////////
void loop()
{
estado1 = digitalRead(sw1); // lee el estado1 del sensor magnetico y lo guarda en la variable
pulsacion = Teclado.getKey(); // Lee la tecla pulsada
if (pulsacion != 0) //si la tecla pulsada es diferente de 0 o nada pulsado
{
lcd.clear(); //limpia el LCD
delay(100); //retardo
}
if(contador == 6){ cambio_clave();}//si el contador es = a 6 entra al menu cambio_clave
if(contador == 5){ con_maestra();}//si el contador es = a 5 entra al menu con_maestra
if(contador == 4){ sensor_1();}//si el contador es = a 4 entra al menu sensor_1
if(contador == 3){ alarma_desarmada();}//si el contador es = a 3 entra al menu alarma_desarmada
if(contador == 2){ alarma_armada();}//si el contador es = a 2 entra al menu alarma_armada
if(contador == 1){ menu_on_off();alarma_on_off();} //si el contador es = a 1 entra al alarma_on_off
}
///////////////////////inician las Funciones//////////////////////////////////////////////
/////////////////////menu_bienvenida//////////////////////////////////////////////////////
void menu_bienvenida() //inicio funcion menu_bienbenida
{
lcd.clear(); //Borra el LCD
lcd.setCursor(3,0); //Se posiciona en la Columna 3, Fila 0
lcd.print("BIENVENIDO"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("PRUEBA DE ALARMA"); //mensaje en LCD
delay(1000); //retardo
lcd.clear(); //limpia el LCD
}
/////////////////////menu_on_off///////////////////////////////////////////////////
void menu_on_off() //inicio funcion alarma_on_off
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("ALARMA ON----->A"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("ALARMA OFF---->B"); //mensaje en LCD
}
/////////////////////Accion 1/////////////////////////////////////////////////////////
void alarma_on_off() //inicio funcion alarma_on_off
{
if(pulsacion == 'A') contador=2; //cambia a menu alarma_armada
if(pulsacion == 'B') contador=3; //cambia a menu alarma_desarmada
if((estado1 == HIGH) && (s1==1)) contador=4; //cambia a sensor_1 si la salida digital esta en alto y s1 es = a 1
if(pulsacion == 'D') contador=5;//cambia a menu con_maestra
}
/////////////////////alarma_armada//////////////////////////////////
void alarma_armada() //inicio funcion alarma_armada
{
if(pulsacion) //si se pulsa una tecla
{
clave[indice]= pulsacion; //la tecla pulsada se almacena en la cadena de la variable clave
indice ++; //el indice va aumentando hacia la derecha
lcd.clear(); //limpia el LCD
}
if(indice==0) //indice = a 0
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("Y PRECIONE---->C"); //mensaje en LCD
}
if(indice==1) //indice = a 1
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("*___"); //mensaje en LCD
}
if(indice==2) //indice = a 2
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("**__"); //mensaje en LCD
}
if(indice==3) //indice = a 3
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("***_"); //mensaje en LCD
}
if(indice==4) //indice = a 4
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("****"); //mensaje en LCD
}
if(indice>=5) //si el indice es mayor o igual a 5 para asegurar la cantidad de caracteres pulsados
{
if((indice>=5) && (pulsacion =='C')) //ambas condiciones deven de cumplirse la letra (C) es el enter
{
if (clave[0] == EEPROM.read(0) && clave[1] == EEPROM.read(1) && clave[2] == EEPROM.read(2) && clave[3] == EEPROM.read(3)) //lee cada uno de los digitos almasenados en la memoria EEPROM
{
lcd.clear(); //limpia el LCD
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE CORRECTA"); //mensaje en LCD
delay(500); //retardo
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("SE ACTIVARA EN"); //mensaje en LCD
for (int i = 9; i >= 0; i--) //tirempo de activacion de alarma
{
lcd.setCursor(3,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("SEGUNDOS:"); //mensaje en LCD
lcd.print(i); //variable que se imprime en el LCD
delay(900); //retardo
}
lcd.clear(); //limpia el LCD
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("ALARMA ARMADA"); //mensaje en LCD
digitalWrite(cor, HIGH); //salida digital en esatdo alto
digitalWrite(inc, LOW); //salida digital en estado bajo
digitalWrite(vos, LOW); //salida digital en estado bajo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
contador=1; //regresa al menu alarma_on_off
s1=1; //variable de entrada a sensor_1
delay(1000); //retardo
bot.sendMessage(CHAT_ID, "ALARMA ARMADA", ""); //Envio de mensaje a telegram
}
}
else
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE INCORRECTA"); //mensaje en LCD
digitalWrite(inc, HIGH); //salida digital en esatdo alto
digitalWrite(cor, LOW); //salida digital en estado bajo
digitalWrite(vos, HIGH); //salida digital en esatdo alto
delay(1000); //retardo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
}
}
}
/////////////////////alarma_desarmada//////////////////////////////////
void alarma_desarmada() //inicio funcion alarma_desarmada
{
if(pulsacion) //si se pulsa una tecla
{
clave[indice]= pulsacion; //la tecla pulsada se almacena en la cadena de la variable clave
indice ++; //el indice va aumentando hacia la derecha
lcd.clear(); //limpia el LCD
}
if(indice==0) //indice = a 0
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("Y PRECIONE---->C"); //mensaje en LCD
}
if(indice==1) //indice = a 1
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("*___"); //mensaje en LCD
}
if(indice==2) //indice = a 2
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("**__"); //mensaje en LCD
}
if(indice==3) //indice = a 3
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("***_"); //mensaje en LCD
}
if(indice==4) //indice = a 4
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("****"); //mensaje en LCD
}
if(indice>=5) //si el indice es mayor o igual a 5 para asegurar la cantidad de caracteres pulsados
{
if((indice>=5) && (pulsacion =='C')) //ambas condiciones deven de cumplirse la letra (C) es el enter
{
if (clave[0] == EEPROM.read(0) && clave[1] == EEPROM.read(1) && clave[2] == EEPROM.read(2) && clave[3] == EEPROM.read(3)) //lee cada uno de los digitos almasenados en la memoria EEPROM
{
lcd.clear(); //limpia el LCD
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE CORRECTA"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("ALARMA DESARMADA"); //mensaje en LCD
digitalWrite(cor, LOW); //salida digital en estado bajo
digitalWrite(inc, LOW); //salida digital en estado bajo
digitalWrite(vos, LOW); //salida digital en estado bajo
delay(1000); //retardo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
contador=1; //regresa al menu alarma_on_off
s1 = 0; //variable de entrada a sensor_1
bot.sendMessage(CHAT_ID, "ALARMA DESARMADA", ""); //Envio de mensaje a telegram
}
}
else
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE INCORRECTA"); //mensaje en LCD
digitalWrite(inc, HIGH); //salida digital en esatdo alto
digitalWrite(cor, LOW); //salida digital en estado bajo
digitalWrite(vos, HIGH); //salida digital en esatdo alto
delay(1000); //retardo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
}
}
}
/////////////////////sensor_1//////////////////////////////////
void sensor_1() //inicio funcion sensor_1
{
lcd.clear(); //limpia el LCD
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("SENSOR ABIERTO"); //mensaje en LCD
digitalWrite(inc, HIGH); //salida digital en esatdo alto
digitalWrite(vos, HIGH); //salida digital en esatdo alto
digitalWrite(cor, LOW); //salida digital en estado bajo
delay(2000); //retardo
contador=3; //regresa al menu alarma_desarmada
bot.sendMessage(CHAT_ID, "SENSOR ABIERTO", ""); //Envio de mensaje a telegram
}
//////////////////////////////con_maestra////////////////////////////////////
void con_maestra() //inicio funcion con_maestra
{
if(pulsacion) //si se pulsa una tecla
{
clave[indice]= pulsacion; //la tecla pulsada se almacena en la cadena de la variable clave
indice ++; //el indice va aumentando hacia la derecha
lcd.clear(); //limpia el LCD
}
if(indice==0) //indice = a 0
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIG CLAVE MAESTR"); //mensaje en LCD
lcd.setCursor(0,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("Y PRECIONE---->C"); //mensaje en LCD
}
if(indice==1) //indice = a 1
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("*___"); //mensaje en LCD
}
if(indice==2) //indice = a 2
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("**__"); //mensaje en LCD
}
if(indice==3) //indice = a 3
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("***_"); //mensaje en LCD
}
if(indice==4) //indice = a 4
{
lcd.setCursor(0,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("DIGITE SU CLAVE"); //mensaje en LCD
lcd.setCursor(6,1); //Se posiciona en la Columna 6, Fila 1
lcd.print("****"); //mensaje en LCD
}
if(indice>=5) //si el indice es mayor o igual a 5 para asegurar la cantidad de caracteres pulsados
{
if((indice>=5) && (pulsacion =='C')) //ambas condiciones deven de cumplirse la letra (C) es el enter
{
if(!strcmp(clave,clave_maestra)) //comparacion de amvas variables para confirmar la contraseña corecta
{
lcd.clear(); //limpia el LCD
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE MAESTRA"); //mensaje en LCD
lcd.setCursor(4,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("CORRECTA"); //mensaje en LCD
delay(1000); //retardo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
contador=6; //cambia al menu cambio_clave
cursor = 9; //posiciona el cursor en la posicion 9 del LCD
lcd.clear(); //limpia el LCD
}
}
else
{
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("CLAVE MAESTRA"); //mensaje en LCD
lcd.setCursor(3,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("INCORRECTA"); //mensaje en LCD
delay(1000); //retardo
indice=0; //se iguala el indice a 0 para ingresar caracteres de nuevo
}
}
}
////////////////////////cambio_clave//////////////////////////
void cambio_clave() //inicio funcion cambio_clave
{
lcd.setCursor(1,0); //Se posiciona en la Columna 0, Fila 0
lcd.print("INGRESE NUEVA"); //mensaje en LCD
lcd.setCursor(3,1); //Se posiciona en la Columna 0, Fila 1
lcd.print("CLAVE"); //mensaje en LCD
pulsacion = Teclado.getKey(); // Lee la tecla pulsada
if (pulsacion) //si se pulsa una tecla
{
EEPROM.write(indice, pulsacion); //escribe los caracteres en la memoria EEPROM donde pulsacion es es el valor a guardar y indice la direccion de memoria a ocupar
delay(100); //retardo
indice++; //el indice va aumentando hacia la derecha
lcd.setCursor(cursor,1); //Se posiciona en la Columna 0, Fila 1
lcd.print(pulsacion); //variable que se imprime en el LCD
cursor++; //mueve el cursor de lugar a la derecha
EEPROM.commit(); //asegura que los cambios en la memoria se guarden de manera permanente
}
if (indice == 5) //si el indice es = 5
{
indice = 0; //indice = 0
contador=1; //regresa al menu alarma_on_off
lcd.clear(); //limpia el LCD
}
}
/////////////////////////////////////////////////////////////////