#include <Wire.h> // libreria para utilizar el display
#include <LiquidCrystal_I2C.h> // libreria para uso del display
#include <LedControl.h> // librería para manejo pantalla de led
#include <binary.h>
#include <Keypad.h> // libreria para uso de teclado
#include <EEPROM.h> // libreria para uso de teclado
#include <TM1637Display.h> // libreria del modulo del display de 4 digitos
#define Modo_Horno 5 // 0 logico trabaja en seteo lento y en 1 logico el seteo es rapido
#define horno A0
#define grado200 0
#define grado300 0
#define grado400 4
// Define los pines CLK1 y DIO para control del modulo de 4 digitos
#define CLK1 A2
#define DIO A3
TM1637Display display(CLK1, DIO); // Creamos un objeto de la pantalla para su control
// Inicializamos las variables para uso del LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); //direcciomos la direccion del display
// SENSOR ANALOGICO DE TEMPERATURA USAMOS EL DS18B20
const float sensorTemp = A1; // analógico donde leemos la señal del potenciómetro
int temp = 0; // Temperatura a controlar de acuerdo al seteo o modo de trabajo del horno
int p1 = 0;
int Encendido = 0; // Pin de entrada
int T_Coccion = 0;
float temphorno = 0;
float valor_ref = 0;
//CONDIFURAMOS VARIABLES PARA USO DE TECLADO
const byte ROWS = 4; // Cuatro filas
const byte COLS = 4; // Cuatro columnas
char key;
// Definimos el mapa de teclas
char keys[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Conexiones de los pines (filas, columnas)
byte colPins[COLS] = { 9 , 8 , 7 , 6 };
byte rowPins[ROWS] = { 13, 12, 11 , 10 };
// Creamos el objeto Keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// VARAIBLES PARA ALMACENAR EL TIEMPO DE COCCION
String tiempoIngresado = "";
int tiemp=0;
int tiemp_horno=0;
int t0=0;
int p2=0; // BANDERA PARA INDICARQUE HAY QUE INGRESAR TIEMPO
int p3=0;
int p4=0; // BANDERA PARA INDICARQUE QUE SE LLEGO A LA TEMP DE COCCION
int estado=2;
void ingreso_temp()
{
if(p1 == 0)
{
Serial.println("INGRESAR TEMPERATURA");
Serial.println("AZUL 200 G AMARILLO 300 G ROJO 400 G");
p1 =1;
}
if (digitalRead(grado200) == 0)
{
temp=200;
valor_ref =2.5;
}
if (digitalRead(grado300) == 0)
{
temp=300;
valor_ref =3.75;
}
if (digitalRead(grado400) == 0)
{
temp=400;
valor_ref =5;
}
if(temp == 200 || temp == 300 || temp == 400 )
{
estado =0;
Serial.print("Temperatura ingresada: ");
Serial.println(temp);
}
}
void ingreso_tiempo()
{
if(p2 == 0 && digitalRead(Modo_Horno) == 1)
{
Serial.println("INGRESAR TIEMPO");
p2 = 1;
}
if (digitalRead(Modo_Horno) == 0)
{
p1=2;
p2=2;
p3=1;
estado = 3; // para salir del if de seteo lento
}
key = keypad.getKey();
if (p2 == 1 && digitalRead(Modo_Horno) == 1)
{
if (key == '*')
{
Serial.println(" sin Tiempo ");
}
else
{
if(key != 0)
{
tiempoIngresado += key; // Agregar la primera tecla ingresada
Serial.print("Tiempo ingresado: ");
Serial.println(tiempoIngresado);
}
if (key == '#') // # representa el encendido del horno
{
Serial.print("TIEMPO INGRESADO:");
T_Coccion=tiempoIngresado.toInt();
Serial.println(T_Coccion);
tiempoIngresado = ""; // Reiniciar el DIGITO DE LA TEMPERATURA ingresado
if(T_Coccion > 10 && T_Coccion < 3600)
{
display.showNumberDec(T_Coccion);
Encendido = 1;
}
if(T_Coccion < 10 || T_Coccion > 3600)
{
display.showNumberDec(T_Coccion);
Serial.println("TIEMPO ERRONEO");
}
}
}
}
if(p3 == 1)
if (key == '#') // # representa el encendido del horno
{
lcd.setCursor(2,0);
lcd.print("TIEMPO INGRESADO");
T_Coccion+=30;
lcd.setCursor(5,1); // COLUMNA , FILA
lcd.print(T_Coccion);
display.showNumberDec(T_Coccion);
Encendido = 1;
}
}
void setup()
{
Serial.begin(9600); // uso el monitor para evaluar errores durante la programacion
lcd.init(); // inicializo la pantalla de cristal del LCD
lcd.backlight(); // enciendo la pantalla de LCD
pinMode(horno, OUTPUT);
pinMode(Modo_Horno, INPUT_PULLUP); // Configurar el pin como salida
pinMode(grado200, INPUT_PULLUP);
pinMode(grado300, INPUT_PULLUP);
pinMode(grado400, INPUT_PULLUP);
display.setBrightness(0x0a); // Ajusta el brillo del modulo del display que va (0x00 a 0x0f)
}
void loop()
{
if (digitalRead(Modo_Horno) == 1) // seteo lento
{
if (estado == 0)
if (p1 == 1)
ingreso_tiempo();
if (estado == 1)
{
p1 = 0; //reseteo la bandera para indicacion el seteo de temperatura
p2 = 0; //reseteo la bandera para indicacion el seteo de tiempo
temp= 0;
estado = 2;
}
if (estado == 2)
ingreso_temp();
}
if (p3 == 1 ||digitalRead(Modo_Horno) == 0)
{
temp=400;
valor_ref =5;
p3=1;
if (estado == 3)
{
p1 =2; //reseteo la bandera para indicacion el seteo de temperatura
p2 =2;
ingreso_tiempo();
}
if (estado == 4)
{
p1 = 0;
p2 = 0;
p3 = 0;
temp = 0;
estado = 2;
Encendido = 0;
Serial.println("FIN SETEO RAPIDO");
}
}
if(Encendido == 1)
{
display.showNumberDec(T_Coccion);
if( p2 == 1 && T_Coccion == 0 )
{
Encendido = 0;
estado = 1;
p4 == 1;
digitalWrite(horno, LOW);
}
if( p3 == 1 && T_Coccion == 0 )
{
Encendido = 0;
estado = 4;
p4 == 1;
digitalWrite(horno, LOW);
}
// MANTENGO CONSTANTE LA TEMPERATURA DEL HORNO SEGÚN LA TEMP SELECCIONADA
if (valor_ref >= temphorno)
digitalWrite(horno, LOW);
if (valor_ref <= temphorno)
{
digitalWrite(horno, HIGH);
p4 = 1;
}
// — Uso millis() para poder descontar el tiempo de coccion el tiempo de funcionamiento del horno —
// empieza a descontar el tiempo una vez que llego a la temperatura seleccionada.
unsigned long ahora = millis();
if (ahora - t0 >= 1000 && Encendido == 1 && p4 == 1)
{
t0 = ahora;
--T_Coccion;
lcd.setCursor(5,1); // COLUMNA , FILA
lcd.print(T_Coccion);
}
}
float valorADC = analogRead(sensorTemp);
temphorno = 0.0125 * 5 * valorADC / 1023 ; // 0V equivale a 0 grados y 1023 a 400 grado
}