/*
totalSegundos ---> Almacena el tiempo total en segundos de la cuenta atrás
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Tone.h>
Tone buzzer;
#define LED1 7
//Constantes dimensiones del teclado
const byte FIL = 4;
const byte COL = 4;
const byte pinesFilas[FIL]= {A0,A1,A2,A3};
const byte pinesColumnas[COL]={11,10,9,8};
char teclas[FIL][COL]{
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, FIL, COL);
//Creamos el objeto lcd
LiquidCrystal_I2C lcd(0x27,16,2);
// Variables para el tiempo
unsigned int totalSegundos, horas, minutos, segundos;
unsigned int tiempo1, tiempo2;
int contador = 0; //Cuenta el número de caracteres introducidos en la password
String passwordBomba = "";
String codigo = "";
unsigned int nuevoTiempo;
void setup() {
pinMode(LED1,OUTPUT);
buzzer.begin(12);
//inicializamos el LCD
lcd.init();
//Encendemos la luz del fondo
lcd.backlight();
teclado.setHoldTime(50);// Intervalo de HOLDED 2 segundos
teclado.addEventListener(keypadEvent);
tiempo1 = millis() / 1000; //Guardamos el tiempo en segundos desde el encendido
/*
horas = 0;
minutos = 1;
segundos = 10;
totalSegundos = segundos + (minutos * 60) + (horas*3600);
*/
Serial.begin(9600);
Serial.println("Comenzando");
//inicializarPassword();
configurarTiempo();
Serial.println("Tiempo configurado");
delay(1000);
Serial.println(totalSegundos);
//Escribirmos el mensaje en el LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tiempo restante:");
}
void loop() {
cuentaRegresiva();
char tecla = teclado.getKey();
if (tecla == "*"){
buzzer.play(NOTE_E6,200);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Codigo:");
while (codigo.length() < 4){
lcd.setCursor(codigo.length(),1);
lcd.cursor();
char tecla = teclado.getKey();
if(tecla){
codigo +=tecla;
lcd.print(codigo);
}
}//while
if (codigo != passwordBomba){
explosion();
}
}//if
}//loop
void configurarTiempo(){
// Una vez configurado el temporizador, hay que pulsar '*' para validarlo
unsigned int pulsaciones=0;
String configHoras="";
String configMinutos="";
String configSegundos="";
boolean validarTiempo = false;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("hh:mm:ss");
lcd.setCursor(0,1);
lcd.print("00:00:00");
lcd.setCursor(0,1);
lcd.cursor();
while ((pulsaciones <6) || (!validarTiempo)){
char tecla = teclado.getKey();
if(tecla){
if (tecla =='#'){ //Pulsamos '#' si cometemos algun error al introducir el tiempo
//Inicalizamos todo de nuevo
pulsaciones = 0;
configHoras="";
configMinutos="";
configSegundos="";
lcd.setCursor(0,1);
lcd.print("00:00:00");
lcd.setCursor(0,1);
lcd.cursor();
}
else{
if ((tecla == '*') && (pulsaciones >5)){
lcd.noCursor();
horas = configHoras.toInt();
minutos = configMinutos.toInt();
segundos = configSegundos.toInt();
totalSegundos = segundos + (minutos * 60) + (horas*3600);
//Serial.println(totalSegundos);
validarTiempo = true;
}
//Si detectamos menos de 2 pulsaciones es que estamos metiendo las horas
if (pulsaciones <2){
configHoras+=tecla;
lcd.setCursor(0,1);
lcd.print(configHoras);
}
//Si detectamos entre 2 y 3 pulsaciones es que estamos metiendo los minutos
if ((pulsaciones >=2) && (pulsaciones<4)){
configMinutos+=tecla;
lcd.setCursor(3,1);
lcd.print(configMinutos);
}
//Si detectamos más de 4 pulsaciones es que estamos metiendo los segundos
if ((pulsaciones >=4) && (pulsaciones<6)){
configSegundos+=tecla;
lcd.setCursor(6,1);
lcd.print(configSegundos);
}
pulsaciones++;
}//else
}
}
}//configurarTiempo
void keypadEvent(KeypadEvent tecla){
switch(teclado.getState()){
case PRESSED:
Serial.println("PRESSED");
switch (tecla){
case 'A':
configurarTiempo();
break;
}
break;
case RELEASED:
Serial.println("RELEASED");
break;
case HOLD:
switch(tecla){
case '*': Serial.println("HOLD");
buzzer.play(NOTE_E6,200);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Codigo:");
while (codigo.length() < 4){
lcd.setCursor(codigo.length(),1);
lcd.cursor();
char tecla = teclado.getKey();
if(tecla){
codigo +=tecla;
lcd.print(codigo);
}
}//while
if (codigo != passwordBomba){
explosion();
}
codigo="";
break;
}
break;
}
}
void inicializarPassword(){
buzzer.play(NOTE_E6,200);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Codigo:");
while (passwordBomba.length() < 4){
lcd.setCursor(passwordBomba.length(),1);
lcd.cursor();
char teclaPulsada = teclado.getKey();
if(teclaPulsada){
passwordBomba +=teclaPulsada;
lcd.print("*");
}
}
buzzer.play(NOTE_E6,500);
lcd.clear();
lcd.noCursor();
lcd.setCursor(4,0);
lcd.print("Password");
lcd.setCursor(2,1);
lcd.print("Inicializada");
delay(3000);
lcd.clear();
/*
// Por si queremos mostrarla
delay(500);
lcd.clear();
lcd.noCursor();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(0,1);
lcd.print(passwordBomba);
*/
}
void cuentaRegresiva(){
if (totalSegundos > 0){ //¿Hemos llegado al final del countdown?
// char teclaPulsada = teclado.getKey();
tiempo2 = millis() / 1000;
if ((tiempo1-tiempo2) > 1){ //¿Ha pasado 1 segundo ya?
actualizarTiempo();
mostrarTiempo();
}
}
//explosion();
//exit(0);
}
void actualizarTiempo(){
tiempo1 = tiempo2; //Actualizamos al tiempo actual
totalSegundos --; //Descontamos un segundo en el tiempo total
//Recalculamos el tiempo que queda para mostrarlo
horas = (totalSegundos/60)/60;
minutos = (totalSegundos/60)%60;
segundos = totalSegundos % 60;
}
void mostrarTiempo(){
lcd.setCursor(4,1);
if (horas < 10) lcd.print("0");
lcd.print(horas);
lcd.print(":");
if (minutos < 10) lcd.print("0");
lcd.print(minutos);
lcd.print(":");
if (segundos < 10) lcd.print("0");
lcd.print(segundos);
}
void explosion(){
lcd.clear();
lcd.setCursor(6,0);
lcd.print("BOMBA");
lcd.setCursor(4,1);
lcd.print("DETONADA");
}