UN SALUDO PARA TODOS
he conseguido un código en la red de un timer , lo he editado y adaptado para usarlo con mi horno eléctrico utilizando un max 6675 + sensor , llegue hasta donde pude adaptarlo , si alguien un compañero me pudiera orientar para agregarle 2 funciones mas
- un botón extra para parar el proceso o stop/ reset .
- colocarle una funcio que me controle un rele/ssr o actuador on/off para cuando compare con el setpoint apague la resistencia y no deje calentar mas de la temperatura seteada
comparto el código hasta donde pude llegar
#include <LiquidCrystal_I2C.h>
#include <max6675.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//----------------------------------TEMPE
//int thermoDO = 4;
//int thermoCS = 5;
//int thermoCLK = 6;
int ktcSO = 4;
int ktcCS = 5;
int ktcCLK = 6;
//MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);
#define ST_TEMP A0
#define STOP A1
float temperatura = 0;
unsigned int setpoint_temp;
char buffer[16];
int ssr = 12; //Control con rele
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int msg = 0; //Barrera para el mensaje de bienvenida
int start = A2; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque
int buth = A5; //Pulsador de Horas
int butm = A4; //Pulsador de Minutos
int buts = A3; //Pulsador de segundos
int varbuth = 0; //Variable para almacenar el valor del pulsador de horas
int varbutm = 0; //Variable para almacenar el valor del pulsador de minutos
int varbuts = 0; //Variable para almacenar el valor del pulsador de segundos
byte reloj[] = {
0x00,
0x0E,
0x15,
0x15,
0x1D,
0x11,
0x0E,
0x00
};
byte DF[] = {
0x00,
0x00,
0x00,
0x1F,
0x0E,
0x04,
0x00,
0x00
};
byte termo[] = {
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
byte carita[] = {
0x00,
0x0A,
0x04,
0x00,
0x11,
0x0E,
0x00,
0x00
};
void setup()
{
Serial.begin(9600); // setup serial
lcd.init();
lcd.backlight();
pinMode(ssr, OUTPUT); //Pin de alarma --> Salida
pinMode(buth, INPUT); //Pin de pulsador de horas --> Entrada
pinMode(butm, INPUT); //Pin de pulsador de minutos --> Entrada
pinMode(buts, INPUT); //Pin de pulsador de segundos --> Entrada
pinMode(start, INPUT); //Pin de pulsador de arranque --> Entrada
msg = 0; //Barrera del mensaje de bienvenida
empieza = 1024; //Barrera de arranque
set_temp ();
varbuth = 1; //Barrera de horas
varbutm = 1; //Barrera de minutos
varbuts = 1; //Barrera de segundos
lcd.createChar(0, reloj);
lcd.createChar(1, DF);
lcd.createChar(2, termo);
lcd.createChar(3, carita);
}
void loop()
{
if (msg == 0) //Mostramos el mensaje de bienvenida solo una vez
{
lcd.setCursor(2, 0);
lcd.print("CONTROL DE ");
lcd.setCursor(3, 1);
lcd.print("TEMPERATURA");
delay(2500);
msg = 1;
lcd.clear();
}
//-------------------------------------------------------------------------------------------------
// LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
// EL BOTON DE ARRANQUE
//-------------------------------------------------------------------------------------------------
do
{
varbuth = analogRead(buth); //Leemos boton de horas
varbutm = analogRead(butm); //Leemos boton de minutos
varbuts = analogRead(buts); //Leemos boton de segundos
if (varbuth == 0) //Si el boton ha sido pulsado, aumentamos las horas en una unidad
{
ahoras = ahoras + 1 ;
delay(250);
}
if (varbutm == 0) //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
{
aminutos = aminutos + 1;
delay(250);
}
if (varbuts == 0) //Si el boton ha sido pulsado, aumentamos los segundos en una unidad
{
asegundos = asegundos + 1;
delay(250);
}
set_temp ();
//-----------------------------------------------------------
lcd.setCursor(0, 1); //---------reloj
lcd.write((byte)0);
lcd.setCursor(2, 1);
lcd.print("TIMER"); //Muestra mensaje y las HH:MM:SS que vayamos aumentando
lcd.setCursor(8, 1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
empieza = analogRead(start); //Lee el boton de arranque
if (empieza == 0) //Si el boton de arranque, fue pulsado... //
{
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
}
}
while (empieza != 0); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
//-------------------------------------------------------------------------------------------------
// UNA VEZ PULSADO EL BOTON DE ARRANQUE Y ACUMULADO EL TIEMPO, ENTRA EN EL SIGUIENTE WHILE
// Y NO FINALIZA HASTA TERMINAR LA CUENTA.
//-------------------------------------------------------------------------------------------------
while (segundostotal > 0)
{
display_temp();
delay (1000); //Descontamos en periodos de 1 segundo
segundostotal--;
ahoras = ((segundostotal / 60) / 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos
lcd.setCursor(0, 0); //-------TERMO
lcd.write((byte)2);
lcd.setCursor(2, 0);
lcd.print("TEMP "); //Mostramos mensaje de tiempo restante
lcd.setCursor(0, 1); //-------reloj
lcd.write((byte)0);
lcd.setCursor(2, 1);
lcd.print("TIMER"); //Mostramos mensaje de tiempo restante
lcd.setCursor(8, 1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
if (segundostotal == 0) //Si finaliza el tiempo
{
while (1) //Bucle infinito mostrando mensaje y haciendo parpadear un led
{
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("HORNEADO");
lcd.setCursor(3, 1);
lcd.print(" FELIZ ");
digitalWrite(ssr, LOW);
lcd.setCursor(11, 1); //-------carita
lcd.write((byte)3);
delay(5000);
lcd.clear();
return ;
}
}
}
}
void display_temp() {
temperatura = ktc.readCelsius();
lcd.setCursor(9, 0);
lcd.print( temperatura);
lcd.setCursor(13, 0);
lcd.print((char)223);
lcd.setCursor(14, 0);
lcd.print("C");
digitalWrite(ssr, HIGH);
}
void display_temp(int cache_temp)
{
lcd.setCursor(0, 0);
sprintf(buffer, " TEMP %u%cC ", cache_temp, 0xDF);
lcd.print(buffer);
}
void display_temp_loop(int cache_temp_set, int cache_temp_actual)
{
lcd.setCursor(0, 0);
sprintf(buffer, "S:%d%cC ACT:%u%cC", cache_temp_set, 0xDF, cache_temp_actual, 0xDF);
lcd.print(buffer);
}
void set_temp () {
double setpoint_temp = analogRead( ST_TEMP) * 0.2151;
display_temp(setpoint_temp);
}