#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 8
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
int deviceCount = 0;
float tempC;
#define LED1 11
#define LED2 12
#define LED3 13
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Libreria del display LCD en caso que sea I2C
LiquidCrystal_I2C lcd(0X27,20,4); // Direccion display LCD en caso que sea I2C
int ledState1 = LOW;
int ledState2 = LOW;
unsigned long previousMillisLed1 = 0;
unsigned long currentMillisLed1 = 0;
unsigned long previousMillisLed2 = 0;
unsigned long currentMillisLed2 = 0;
const long intervalLed1 = 6000;
const long intervalLed2 = 1000;
int relevo=10; //Carga
int msg=0; //Bandera para el mensaje de bienvenida
int star=9; //Pulsador de Arranque
int butm=7; //Pulsador de incremento minutos
int buts=6; //Pulsador de incremento segundos
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() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
sensors.begin(); // Start up the library
Serial.begin(9600);
// Inicializamos el LCD
lcd.init();
lcd.begin(20, 4); //Configuramos el n�mero de columnas y filas del lcd
lcd.backlight(); //Encender la luz de fondo.
pinMode(relevo, OUTPUT);
pinMode(butm, INPUT);
pinMode(buts, INPUT);
pinMode(star, INPUT);
msg=0;
deviceCount = sensors.getDeviceCount();
valida = EEPROM.read(dirflag); //Obtiene dato de dirflag para comprobar si debo leer EEPROM
if(valida==1){
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(" SISTEMA");
lcd.setCursor(0,1); //Ubicamos el cursor en LCD en posicion 0 segunda linea
lcd.print("DE CONTROL");
lcd.setCursor(0,2); //Volvemos a ubicar el cursor, ahora en la linea de abajo
lcd.print("TEMPORIZADO"); //Mensaje que se muestra a partir de la posici�n anterior del cursor
}
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(" SISTEMA"); //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("DE CONTROL"); //Mensaje que se muestra a partir de la posici�n anterior del cursor
lcd.setCursor(0,2); //Volvemos a ubicar el cursor, ahora en la linea de abajo
lcd.print(" TEMPORIZADO"); //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 {
varbutm=digitalRead(butm);
varbuts=digitalRead(buts);
varstar=digitalRead(star);
if(varbutm==HIGH){
aminutos=aminutos+5;
if(aminutos>=51){
aminutos=50;
}
delay(250);
}
if(varbuts==HIGH){
aminutos=aminutos-5;
if(aminutos<=0){
aminutos=5;
}
delay(250);
}
lcd.setCursor(0,0);
lcd.print(" Ajuste los minutos ");
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);
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_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(dirm, aminutos); // Se agrega a EEPROM con la direcci�n primero y valor de la variable despu�s
EEPROM.write(dirs, asegundos);
lcd.setCursor(0,0);
lcd.print(" "); // Limpio la primer fila del LCD con 20 espacios en blanco
do {
//contador de segundos
//..........................................................................................................................
digitalWrite(relevo, HIGH); //Activamos la carga mientras dure el contador
lcd.setCursor(0, 2);
lcd.print(" Temp1 Temp2 Difer");
{
currentMillisLed1 = millis();
if (currentMillisLed1 - previousMillisLed1 >= intervalLed1) {
previousMillisLed1 = currentMillisLed1;
if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}
}
digitalWrite(LED1, ledState1);
}
{
currentMillisLed2 = millis();
if (currentMillisLed2 - previousMillisLed2 >= intervalLed2) {
previousMillisLed2 = currentMillisLed2;
if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
sensors.requestTemperatures();
lcd.setCursor(1, 3);
lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(8, 3);
lcd.print(sensors.getTempCByIndex(1));
lcd.setCursor(15, 3);
lcd.print(abs((sensors.getTempCByIndex(1))-(sensors.getTempCByIndex(0))));
if ((abs((sensors.getTempCByIndex(1)) - (sensors.getTempCByIndex(0)))) >= 1) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
}
digitalWrite(LED2, ledState2);
}
}
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(aminutos==0){
if(asegundos==0){
digitalWrite(relevo, LOW);
digitalWrite(LED1, LOW);
fin=1;
}
}
}
}while(fin==0);
fin=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" PROCESO CULMINADO");
delay(6000);
aminutos = temp_minutos; // recupero tiempo programado de la variable temporal minutos
asegundos = temp_segundos; // recupero tiempo programado de la variable temporal segundos
}
}