#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <TimerOne.h>
#define RESISTENCIA_TERMICA 13 // LED que simula la resistencia
#define RELAY_PIN 12 // Pin del relé que controla el horno
#define POT_PIN A0 // Pin del potenciómetro para simular la temperatura
// Configuración del teclado matricial
const byte FILAS = 4;
const byte COLUMNAS = 4;
char teclas[FILAS][COLUMNAS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinFilas[FILAS] = {5, 4, 3, 2}; // Pines de las filas
byte pinColumnas[COLUMNAS] = {9, 8, 7, 6}; // Pines de las columnas
Keypad teclado = Keypad(makeKeymap(teclas), pinFilas, pinColumnas, FILAS, COLUMNAS);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Configuración del LCD I2C 16x2
int tiempoCoccion = 0;
int temperaturaObjetivo = 0;
int temperaturaActual = 0;
bool resistenciaEncendida = false;
void setup() {
pinMode(RESISTENCIA_TERMICA, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
lcd.begin(16, 2);
lcd.backlight();
Serial.begin(9600);
Timer1.initialize(1000000); // Configuración del temporizador a 1s
Timer1.attachInterrupt(SysTick_Handler);
TECLADO_HW_Inicializacion();
}
void loop() {
Aplicacion_MdE();
}
void Aplicacion_MdE() {
char tecla = teclado.getKey();
if (tecla) {
switch (tecla) {
case '1':
temperaturaObjetivo = 200;
tiempoCoccion = 0; // Sin límite de tiempo
lcd.setCursor(0, 0);
lcd.print("Nivel 1: 200C");
lcd.setCursor(0, 1);
lcd.print("Coccion: Ilimitada");
break;
case '2':
temperaturaObjetivo = 300;
tiempoCoccion = 0; // Sin límite de tiempo
lcd.setCursor(0, 0);
lcd.print("Nivel 2: 300C");
lcd.setCursor(0, 1);
lcd.print("Coccion: Ilimitada");
break;
case '3':
temperaturaObjetivo = 400;
tiempoCoccion = 0; // Sin límite de tiempo
lcd.setCursor(0, 0);
lcd.print("Nivel 3: 400C");
lcd.setCursor(0, 1);
lcd.print("Coccion: Ilimitada");
break;
case 'A':
tiempoCoccion += 30; // Incremento de 30 segundos
lcd.setCursor(0, 0);
lcd.print("Coccion rapida");
lcd.setCursor(0, 1);
lcd.print(tiempoCoccion);
lcd.print("s restantes");
break;
case 'B':
temperaturaActual = leerTemperatura();
if (temperaturaActual < temperaturaObjetivo) {
encenderResistencia();
}
Serial.print("Temp: ");
Serial.println(temperaturaActual);
break;
case 'C':
apagarHorno();
lcd.setCursor(0, 0);
lcd.print("Horno Apagado ");
lcd.setCursor(0, 1);
lcd.print("Coccion detenida");
break;
default:
tiempoCoccion = (tecla - '0') * 30; // Ajuste manual del tiempo de cocción
lcd.setCursor(0, 1);
lcd.print("Coccion: ");
lcd.print(tiempoCoccion);
lcd.print("s restantes");
break;
}
}
if (resistenciaEncendida && temperaturaActual >= temperaturaObjetivo) {
apagarHorno();
}
if (tiempoCoccion > 0) {
tiempoCoccion--;
if (tiempoCoccion == 0) {
apagarHorno();
lcd.setCursor(0, 0);
lcd.print("Coccion Finalizada");
}
}
// Mostrar en el monitor serie
Serial.print("Temp. Objetivo: ");
Serial.print(temperaturaObjetivo);
Serial.print("C | Temp. Actual: ");
Serial.print(temperaturaActual);
Serial.print("C | Tiempo restante: ");
Serial.println(tiempoCoccion);
}
void SysTick_Handler() {
TECLADO_Antirebote(); // Anti-rebote para el teclado
}
void TECLADO_HW_Inicializacion() {
for (int i = 0; i < FILAS; i++) {
pinMode(pinFilas[i], INPUT_PULLUP);
}
for (int i = 0; i < COLUMNAS; i++) {
pinMode(pinColumnas[i], OUTPUT);
digitalWrite(pinColumnas[i], HIGH);
}
}
void TECLADO_Antirebote() {
// Lógica de antirebote si es necesario, puedes dejarla vacía si no se requiere
}
void encenderResistencia() {
digitalWrite(RESISTENCIA_TERMICA, HIGH);
digitalWrite(RELAY_PIN, HIGH);
resistenciaEncendida = true;
lcd.setCursor(0, 1);
lcd.print("Resistencia ON ");
}
void apagarHorno() {
digitalWrite(RESISTENCIA_TERMICA, LOW);
digitalWrite(RELAY_PIN, LOW);
resistenciaEncendida = false;
}
int leerTemperatura() {
int valorADC = analogRead(POT_PIN);
return map(valorADC, 0, 1023, 0, 500); // Convertir el valor ADC a temperatura (0-500 grados)
}