Hola a todos, soy nuevo en el grupo. Estos realizando una estufa de laboratorio con una heladera + un caloventor , una sonda ds18b20 y dos relés, Arduino UNO y LCD keypad Shield, eso es básicamente lo que utilizo. La idea en mantener una temperatura seteada, prendiendo la heladera en caso de queres bajar la temp o el caloventor en caso de querer subir la temperatura. El tema es me que me funciona todo bien pero calienta el Arduino y me lo termino arruinando, primero creí que era uno viejo que venia usando, pero paso lo mismo con uno que adquirimos , no se si es el modulo LCD keypad que va montado sobre el Arduino o algo que estoy haciendo mal en el programa. Dejo diagrama y codigo ver si ustedes que tienen mas experiencia me pueden dar una mano.
CODIGO
#include <OneWire.h> //Incluimos esta libreria para enviar y recibir datos por un único cable
#include <DallasTemperature.h> //Incluimos esta libreria para utilizar el sensor DS18b20
#include <LiquidCrystal.h> //Incluimos esta libreria para el display LCD
#define Pin 3 //Declaramos el pin donde se conectará el bus de datos (conecto la Sonda)
#define TEMPERATURE_PRECISION 12 //Define la precision de la muestra del DS18B209, 9 a 12 bits
OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación One Wire de la sonda
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
DeviceAddress Sonda0; //Tipo definido como una array de 8 bytes (uint8_t) o sea Vector donde se almacenan las MAC de las sondas
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Definimos pines para Display LCD Keypad shield Arduino
int indicFrio = 0; // Se utilaza para indicar con e1 asterisco si esta prendido el compresor
int indicCalor = 0; // Se utilaza para indicar con e1 caracter grado si esta prendida la calefaccion
int indicOFF = 0; // Se utilaza para indicar con e1 caracter # que esta apagado el compresor y la resistencia
int tecla = 0; // Variable que recibe lo ingresado por A0
int caso; // De acuerdo a que boton presiono entro en un caso del switch
int ledFrio = 2; // Salida para el control del relé de Refrigeracion Pin 2
// Tiene que ser un número pin inferior al del pin de entrada de la sonda esto no se porque
int ledCalef = 11; // Salida para el control del relé de Calefaccion Pin 11
float tempTrab =15; // se guarda la temperatura Maxima ingresada, por defauld es 15°
float tempActual; // se guarda la temperatura del sensor
/////////////////////////////// Carácter especial Para el simbolo de grado en binario en display ///////////////////////////////////////////////////
////////////////////////////// con caracter de 40 puntos , 8 verticales y 5 horizontales //////////////////////////////////////////////////
byte gradoC[8] = {
0b00111,
0b00101,
0b00111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
pinMode(ledFrio,OUTPUT); // salida control del rele de Refligeracion
pinMode(ledCalef,OUTPUT); // salida control del rele de Calefaccion
pinMode(10,OUTPUT); // salida control Display LCD
lcd.createChar(1, gradoC); // Creamos caracter grado centigrado y lo guardamos en 1
sensors.begin(); // Inicialización de los sensores
sensors.setResolution(Sonda0, TEMPERATURE_PRECISION); //Definimos la resolocion de Bit del sonda 0
lcd.begin(16, 2); // Inicializamos el Display LCD
lcd.setCursor(0,0); // Posicionamos el cursor en la fila 0 columna 0
lcd.print(" Temp. Actual "); // Imprime un título en la primera línea del display
digitalWrite(10, HIGH); // Iluminacion LCD inicialmente Prendida
digitalWrite(ledCalef, HIGH); // Relé de Calefaccion inicialmente apagado
digitalWrite(ledFrio, HIGH); // Relé de Refrigeracion inicialmente apagado
}
void loop() {
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
tecla = analogRead(A0); // lee el pin de entrada Analogico A0 y guardo en Tecla
if (tecla <= 50) caso = 3; // Tecla derecha Seleccion temperatura Maxima
if ((tecla <= 200) & (tecla > 50)) caso = 1; // Tecla Arriba
if ((tecla <= 350) & (tecla > 200)) caso = 2; // Tecla Abajo
if ((tecla <= 500) & (tecla > 350)) caso = 5; // Tecla Izquierda Seleccion temperatura Minima
if ((tecla <= 850) & (tecla >500)) caso = 4; // Tecla Selec Scroll en el display
delay(100);
switch (caso){
case 1: // Caso 1 si esta prendida la iluminacion del LCD y presiono tecla Arriba la apago
lcd.setCursor(0,1); // Posicionamos el cursor en la fila 1 columna 0
lcd.print(" Apago Display "); // Imprime leyenda en LCD
delay(1000);
caso = 0; // Pongo en 0 caso antes de salir des esta condicion
digitalWrite(10, LOW); // Apago la iluminicacion del LCD
break;
case 2: // Caso 2 si esta apagada la iluminacion del LCD y presiono tecla Abajo la prendo
digitalWrite(10, HIGH); // Prendo la iluminicacion del LCD
lcd.setCursor(0,1); // Posicionamos el cursor en la fila 1 columna 0
lcd.print("Enciendo Display"); // Imprime leyenda en LCD
delay(1000);
caso = 0; // Pongo en 0 caso antes de salir des esta condicion
break;
case 3: // Caso 3 si presiono la Tecla derecha entro a modificar la tempera de trabajo
temperaturaTrabajo(); // llamo a funcion temperatura Trabajo
break;
//case 5: // Caso 5 si presiono la Tecla Izquierda entro a modificar la tempera minima
//temperaturaMinima(); // llamo a funcion temperatura Minima
// break;
case 4: //Caso 4 si presiono la Tecla a la selec hago scroll y muestro leyenda
lcd.setCursor(16,0);
lcd.print("By Alan Sabetta"); // Imprime un título en la primera línea del display
lcd.setCursor(16,3);
lcd.print(" CINDEFI "); // Imprime un título en la primera línea del display scroll 16 posiciones (longitud de string) a la izquierda
for (int posiConta = 0; posiConta < 16; posiConta++) { // scroll hacia la izquierda
lcd.scrollDisplayLeft();
// espera un bit:
delay(50);
}
delay(3000);
lcd.clear(); // Borro la pantalla del LCD
lcd.setCursor(0,0); // Posicionamos el cursor en la fila 0 columna 0
lcd.print(" Temp. Actual "); // Imprime un título en la primera línea del display
caso = 0; // Pongo en 0 caso antes de salir des esta condicion
break; // si anulamos este break, cada vez que usamos caso 4, pasa al 5
default:
lcd.setCursor(0,1); // Posicionamos el cursor en la fila 0 columna 1
lcd.print(" "); // Imprimo la leyenda en LCD
lcd.print(tempActual); // Se lee e imprime la temperatura en grados Celsius
lcd.print(" "); // Imprimo la leyenda en LCD
lcd.write(1); // escribimos el simbolo grado
lcd.print("C ");
/////////////////////////////////// Control de relés de Calefaccion y Refrigeracion //////////////////////////////////////////////////////////////////////
tempActual = (sensors.getTempCByIndex(0)+2.7); // se le suma 2 para compensar la dif de Tem entre la hubicacion del sensor y el centro de la estufa
if ((tempActual >= tempTrab-1) & (tempActual <= tempTrab)){ //Histéresis de 1 grado Celsius
digitalWrite(ledFrio, HIGH); // Apago en compresor refrigeracion Logica inversa para modulo 1 Relay
digitalWrite(ledCalef, HIGH); // Apago la resistenia de calegaccion Logica inversa para modulo 1 Relay
indicFrio = 0; // Control del asterisco en el display indicando compresor OFF
indicCalor = 0; // Control del simbolo grado en el display indicando compresor OFF
indicOFF = 1; // Control del simbolo grado en el display indicando compresor OFF y Resistencia OFF
}
if (tempActual < tempTrab-1){ //Histéresis de 1 grado Celsius T < Temperatura de Trabajo
digitalWrite(ledFrio, HIGH); // Apago en compresor refrigeracion Logica inversa para modulo HL-54S
digitalWrite(ledCalef, LOW); // Prendo la resistenia de calegaccion Logica inversa para modulo HL-54S
indicFrio = 0; // Control del simbolo asterisco en el display indicando compresor OFF
indicCalor = 1; // Control del simbolo grado en el display indicando compresor ON
indicOFF = 0; // Control del simbolo grado en el display indicando compresor OFF y Resistencia OFF
}
if (tempActual > tempTrab){ //Histéresis de 1 grado Celsius T > Temperatura de trabajo
digitalWrite(ledCalef, HIGH); // Apago la resistenia de calegaccion Logica inversa para modulo HL-54S
digitalWrite(ledFrio, LOW); // Prendo en compresor refrigeracion Logica inversa para modulo HL-54S
indicFrio = 1; // Control del simbolo asterisco en el display indicando compresor OFF
indicCalor = 0; // Control del simbolo grado en el display indicando compresor ON
indicOFF = 0; // Control del simbolo grado en el display indicando compresor OFF y Resistencia OFF
}
if (indicFrio == 1){
lcd.setCursor(15,0); // Posicionamos el cursor en la fila 1 columna 13
lcd.print("*"); // Asterisco añadido en el display
}
if (indicCalor == 1){
lcd.setCursor(15,0); // Posicionamos el cursor en la fila 1 columna 13
lcd.write(1); // escribimos el simbolo grado
}
if (indicOFF == 1){
lcd.setCursor(15,0); // Posicionamos el cursor en la fila 1 columna 13
lcd.print("#"); // escribimos el simbolo grado
}
} // Fin de switch case
} // Fin de programa
////////////////////////////////////////////// Funcion Temperatura de Trabajo Seteada //////////////////////////////////////////////////////////////////////////////////////
void temperaturaTrabajo(){ // Control de temperatura. Ajuste de la temperartura de trabajo
caso = 4; // entro cuando caso es igual a 4 o sea que se presiono la tecla Derecha
lcd.setCursor(0,1); // Posicionamos el cursor en la fila 0 columna 1
lcd.print("T Trab:"); // Imprimo la leyenda en el LCD
lcd.print(tempTrab); // Muestro la temperatura Maxima actual en LCD
lcd.print(" "); // Imprimo la leyenda en el LCD
lcd.write(1); // Escribimos el simbolo grado
lcd.print("C "); // Imprimo la leyenda en el LCD
lcd.blink(); // Muestra el cursor LCD parpadeante.
delay(500);
while(caso == 4) { // Cuando se presiona la tecla Selec entro a este while
delay(100);
tecla = analogRead(0); // Leo que tecla se presiona si subir o bajar
if ((tecla <= 850) & (tecla >500)) // Tecla de menú
caso = 0; // Pongo caso en 0
if ((tecla <= 200) & (tecla > 50)){ // Tecla Arriba
tempTrab = tempTrab + 0.1; // Incrementos de 0.1 grados y lo guardo en tempMax
}
if ((tecla <= 350) & (tecla > 200)){ //Tecla abajo
tempTrab = tempTrab - 0.1; // Decrementos de 0.1 grados y lo guardon en tempMax
}
lcd.setCursor(0,1);
lcd.print("T Trab:");
lcd.print(tempTrab);
lcd.print(" ");
lcd.write(1); // escribimos el simbolo grado
lcd.print("C ");
} //Fin While
lcd.setCursor(1,1);
lcd.noBlink(); // Dejo de mostrar el cursor LCD parpadeante.
lcd.print(" ");
lcd.print(tempTrab);
lcd.print(" ");
lcd.write(1); // escribimos el simbolo grado
lcd.print("C ");
lcd.print(" ");
delay(1000);
lcd.setCursor(1,1);
lcd.print(" OK ");
delay(1000);
} // Fin Funcion Temperatura Trabajo
