//Temporizador Arduino + LCD
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
LiquidCrystal_I2C lcd(0X27,16,2);
//#include <LiquidCrystal.h> // Libreria del display LCD
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Inicializamos la libreria con todos los pines a utilizar
int relevo=10; //Carga
int msg=0; //Bandera para el mensaje de bienvenida
int star=9; //Pulsador de Arranque
int buth=8; //Pulsador de incremento horas
int butm=7; //Pulsador de incremento minutos
int buts=6; //Pulsador de incremento segundos
int varbuth=0; //Variable para almacenar el valor del pulsador incremento de horas
int varbutm=0; //Variable para almacenar el valor del pulsador incremento de minutos
int varbuts=0; //Variable para almacenar el valor del pulsador incremento de segundos
int varstar=0; //Variable para almacenar el valor del pulsador de start
int ahoras=0;
int aminutos=0;
int asegundos=0;
int segundostotal = 0; //Tiempo total
int temp_horas = 0;
int temp_minutos = 0;
int temp_segundos = 0;
int dirh=0; //Variable para almacenar la direccion de horas de la memoria EEPROM
int dirm=1; //Variable para almacenar la direccion de minutos de la memoria EEPROM
int dirs=2; //Variable para almacenar la direccion de segundos de la memoria EEPROM
int dirflag=3; //Variable para usar como bandera para saber si debo leer datos de EEPROM
int valida=0;
int segundos = 0;
unsigned long milisegundos = 0;
unsigned long tiempo1 = 0;
unsigned long tiempoSegundos = 0;
int fin=0;
void setup() {
// Inicializamos el LCD
lcd.init();
lcd.begin(16, 2); //Configuramos el número de columnas y filas del lcd
lcd.backlight(); //Encender la luz de fondo.
pinMode(relevo, OUTPUT);
pinMode(buth, INPUT);
pinMode(butm, INPUT);
pinMode(buts, INPUT);
pinMode(star, INPUT);
msg=0;
/*
varbuth=1;
varbutm=1;
varbuts=1;
varstar=1;
*/
valida = EEPROM.read(dirflag); //Obtiene dato de dirflag para comprobar si debo leer la EEPROM
if(valida==1){
ahoras = EEPROM.read(dirh); // Obtiene el dato int de EEPROM y lo envía a la variable ahoras
aminutos = EEPROM.read(dirm); // Obtiene el dato int de EEPROM y lo envía a la variable aminutos
asegundos = EEPROM.read(dirs); // Obtiene el dato int de EEPROM y lo envía a la variable asegundos
}
lcd.setCursor(0,0); //Ubicamos el cursor en posicion 0 LCD primera linea
lcd.print("Temporizador por");
lcd.setCursor(0,1); //Ubicamos el cursor en LCD en posicion 0 segunda linea
lcd.print("Carlos A. Marin");
}
void loop() {
if(msg==0){ //Si esta condición se cumple mostraremnos el mensje de bienvenida solo una vez
lcd.setCursor(0,0); //Ubicamos el cursor en LCD
lcd.print("Temporizador por"); //Mensaje que se muestra a partir de la posición anterior del cursor
lcd.setCursor(0,1); //Volvemos a ubicar el cursor, ahora en la linea de abajo
lcd.print("Noe Garcia"); //Mensaje que se muestra a partir de la posición anterior del cursor
delay(3000); //tiempo que aparece el mensaje en pantalla
msg=1; //Cambiamos el valor de msg, para que no vuelva a mostrar el mensaje, a menos que lo apaguemos o reiniciemos
lcd.clear(); //Borramos la pantalla
}
//Ahora, pasaremos a leer los datos que mandan los pulsadores, que seran los que programen el tiempo
//Esto lo haremos con la orden "do", para que entre en bucle y este leyendo continuamente, hasta que
//terminemos de ajustar el tiempo y le demos al boton de arranque
do {
varbuth=digitalRead(buth);
varbutm=digitalRead(butm);
varbuts=digitalRead(buts);
varstar=digitalRead(star);
if(varbuth==HIGH){
ahoras++;
if(ahoras>=100){
ahoras=0;
}
delay(250);
}
if(varbutm==HIGH){
aminutos++;
if(aminutos>=60){
ahoras++;
aminutos=0;
if(ahoras>=100){
ahoras=0;
}
}
delay(250);
}
if(varbuts==HIGH){
asegundos++;
if(asegundos>=60){
aminutos++;
asegundos=0;
if(aminutos>=60){
aminutos=0;
ahoras++;
if(ahoras>=100){
ahoras=0;
}
}
}
delay(250);
}
lcd.setCursor(0,0);
lcd.print("Ajuste el Tiempo ");
lcd.setCursor(4,1);
if(ahoras<10){ //Esto es para poner un 0 delante si las horas son menor de 10
lcd.print("0");
}
lcd.print(ahoras);
lcd.print(":");
if(aminutos<10){ //Esto es para poner un 0 delante si los minutos son menor de 10
lcd.print("0");
}
lcd.print(aminutos);
lcd.print(":");
if(asegundos<10){ //Esto es para poner un 0 delante si los segundos son menor de 10
lcd.print("0");
}
lcd.print(asegundos);
}while(varstar==LOW);
if(varstar==HIGH){
temp_horas = ahoras; //Guardo la configuracion de horas en una variable temporal
temp_minutos = aminutos; //Guardo la configuracion de minutos en una variable temporal
temp_segundos= asegundos; //Guardo la configuracion de segundos en una variable temporal
valida = 1;
EEPROM.update(dirflag, valida); // Se escribe la direccion 3 de la EEPROM con el valor 1 si el valor es diferente de 1
EEPROM.write(dirh, ahoras); // Se agrega a EEPROM con la dirección primero y valor de la variable después
EEPROM.write(dirm, aminutos);
EEPROM.write(dirs, asegundos);
lcd.setCursor(0,0);
lcd.print(" "); // Limpio la primer fila del LCD con 16 espacios en blanco
do {
//contador de segundos
//..........................................................................................................................
digitalWrite(relevo, HIGH); //Activamos la carga mientras dure el contador
milisegundos = millis();
if(milisegundos > (tiempo1+1000)){ //Si ha pasado 1 segundo ejecuta el IF
tiempo1 = millis(); //Actualiza el tiempo actual
segundos++;
tiempoSegundos = tiempo1/1000; //Tiempo transcurrido desde que esta encendido el Arduino
}
if (segundos==1){
lcd.setCursor(0,0);
lcd.print("Tiempo Restante");
segundos=0;
if(asegundos>0){
asegundos--;
lcd.setCursor(10,1);
if(asegundos<10){ //Esto es para poner un 0 delante si los segundos son menor de 10
lcd.print("0");
}
lcd.print(asegundos);
}
if(asegundos==0){
if(aminutos>0){
aminutos--;
asegundos=60;
lcd.setCursor(7,1);
if(aminutos<10){ //Esto es para poner un 0 delante si los minutos son menor de 10
lcd.print("0");
}
lcd.print(aminutos);
}
}
if(asegundos==0){
if(aminutos==0){
if(ahoras>0){
ahoras--;
aminutos=60;
lcd.setCursor(4,1);
if(ahoras<10){ //Esto es para poner un 0 delante si las horas son menor de 10
lcd.print("0");
}
lcd.print(ahoras);
}
}
}
}
if(ahoras==0){
if(aminutos==0){
if(asegundos==0){
digitalWrite(relevo, LOW);
fin=1;
}
}
}
}while(fin==0);
fin=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T. Finalizado");
delay(2000);
ahoras = temp_horas; // recupero tiempo programado de la variable temporal horas
aminutos = temp_minutos; // recupero tiempo programado de la variable temporal minutos
asegundos = temp_segundos; // recupero tiempo programado de la variable temporal segundos
}
}