Go Down

Topic: CONTROL DE TEMPERATURA CON ARDUINO (Read 357 times) previous topic - next topic

santi_vulcan

Muy buenas, estoy intentando desarrollar un programa para controlar un termo electrico modificado con un sinfin de cobre para calentar el agua, bien con paneles termosolares o bien con una caldera de pellets, le tengo practicamente implementado por completo salvo por lo siguiente: quiero que al alcanzar una temperatura de 70 grados, deje de calentar y no vuelva a arrancar hasta que haya alcanzado los 60 grados, pero por mas que pruebo, en cuanto baja de 70 grados se me vuelve a activar. Alguien puede ayudarme? muchas gracias de antemano.

cas6678

Deberias poner el codigo porque sino es muy dificil ayudar. Es decir, saber donde esta tu problema en el codigo.

Dices que al bajar de 70 se vuelve a activar, eso quiere decir que previamente se ha desactivado, supongo. Entonces no entiendo por que se activa porque esto no deberia pasar hasta que baje de 60.

Lo que tu pides es sencillo:

If (T<60) {rutina de ENCENDER}

If (T>70) {rutina de APAGAR}

Y si estas en un estado de T entre 60 y 70 se te quedara encendido o apagado dependiendo de donde venga.

surbyte

#2
Feb 17, 2018, 02:33 pm Last Edit: Feb 17, 2018, 02:34 pm by surbyte
Eso que te describió @cas6678 es lo que se conoce como Histéresis. Si estableces una Histeresis de 10 grados funcionará de ese modo, pero podrias establecer en tu código una constante llamada HISTERESIS y ponerle un valor a gusto, que podria comenzar con 10 por supuesto.

Aunque no publicaste código queda claro que tu usaste un solo if con un valor de temperatura entonces no funciona como quieres porque en cuanto oscila en el entorno del valor de comparación cambia para un lado u otro.

santi_vulcan

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
#include <Wire.h>                   
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <math.h>

void setup() {
lcd.begin(20,4);// Indicamos medidas de LCD
pinMode(13, OUTPUT);// Pin para activacion de la bomba de circulacion
pinMode(12, OUTPUT); //Pin para alarma de sobretemperatura del panel o del termo
}
double Thermister(int RawADC) {
double Panel;
Panel = log(((10240000/RawADC) - 10000));
Panel = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Panel * Panel ))* Panel );
Panel = Panel - 273.15;// Converierte de Kelvin a Celsius             
return Panel;
}

void loop() {             
int val;//Crea una variable entera
int val2;//Crea una variable entera
double Panel;//Variable de temperatura = Temperatura del panel solar
double Termo;//Variable de temperatura = temperatura del termo acumulador     
val=analogRead(0);//Lee el valor del pin analogo 0 y lo mantiene como val     
val2=analogRead(1);//Lee el valor del pin analogo 1 y lo mantiene como val2
Panel=Thermister(val);//Realiza la conversión del valor analogo a grados Celsius   
Termo=Thermister(val2);//Realiza la conversión del valor analogo a grados Celsius
           
delay (1000);//Refresca cda X segundos

while (Panel > Termo && Termo < 60){
digitalWrite(13, HIGH); //Existe demanda de agua caliente y el sistema arranca
     lcd.clear();//Elimina todos los simbolos del LCD
     lcd.setCursor(0,0);             
     lcd.print("TEMP PANEL");
     lcd.setCursor(12,0);
     lcd.print(Panel);//Escribe la temperatura del panel solar
     lcd.print(" 'C");
     lcd.setCursor(0,1);             
     lcd.print("TEMP TERMO");
     lcd.setCursor(12,1);
     lcd.print(Termo);//Escribe la temperatura del termo
     lcd.print(" 'C");   
     lcd.setCursor(0,2);             
     lcd.print("ESTADO BOMBA    ON");// Muestra en pantalla el estado de la bomba
     lcd.setCursor(3,3);             
     break;
  } 

while (Panel < Termo){
digitalWrite(13, LOW); //La bomba para por baja temperatura en el panel
     lcd.clear();//Elimina todos los simbolos del LCD
     lcd.setCursor(0,0);             
     lcd.print("TEMP PANEL");
     lcd.setCursor(12,0);
     lcd.print(Panel);//Escribe la temperatura del panel solar
     lcd.print(" 'C");
     lcd.setCursor(0,1);             
     lcd.print("TEMP TERMO");
     lcd.setCursor(12,1);
     lcd.print(Termo);//Escribe la temperatura del termo
     lcd.print(" 'C");   
     lcd.setCursor(0,2);             
     lcd.print("ESTADO BOMBA    OFF");// Muestra en pantalla el estado de la bomba
     lcd.setCursor(1,3);             
     lcd.print("BAJA TEMP EN PANEL");
     break;
  } 
 
while (Panel >= 130){
    digitalWrite(13, LOW); // Si hay sobretemperatura en el panel, el sistema se para
    digitalWrite(12, HIGH); // Se activa una alarma en el PIN 12 de Arduino
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0,0);             
    lcd.print("TEMP PANEL");
    lcd.setCursor(12,0);
    lcd.print(Panel);//Escribe la temperatura del panel solar
    lcd.print(" 'C");
    lcd.setCursor(0,1);             
    lcd.print("TEMP TERMO");
    lcd.setCursor(12,1);
    lcd.print(Termo);//Escribe la temperatura del termo
    lcd.print(" 'C");
    lcd.setCursor(0,2);
    lcd.print("ESTADO BOMBA    OFF");
    lcd.setCursor(2,3);     
    lcd.print("SOBRETEMP PANEL"); // Si hay sobretemperatura en el panel, muestra la alarma en el LCD
    break;
  }
 
while (Termo >= 70){
     digitalWrite(13, LOW); // El termo ha alcanzado la temperatura maxima de consigna
     lcd.clear();//Elimina todos los simbolos del LCD
     lcd.setCursor(0,0);             
     lcd.print("TEMP PANEL");
     lcd.setCursor(12,0);
     lcd.print(Panel);//Escribe la temperatura del panel solar
     lcd.print(" 'C");
     lcd.setCursor(0,1);             
     lcd.print("TEMP TERMO");
     lcd.setCursor(12,1);
     lcd.print(Termo);//Escribe la temperatura del termo
     lcd.print(" 'C");   
     lcd.setCursor(0,2);             
     lcd.print("ESTADO BOMBA    OFF");// Muestra en pantalla el estado de la bomba
     lcd.setCursor(0,3);             
     lcd.print("TEMPERATURA TERMO OK");
     break;
  }

}

santi_vulcan

Este seria el sketch, que en principio funciona perfectamente, salvo por lo mencionado anteriormente, necesito que cuando el termo alcance una temperatura de 70 grados, dentenga el sistema hasta que baje por debajo de 60

cas6678

El interruptor de la bomba lo tienes en el pin 13. Solo hay un "digitalWrite(13, HIGH)" en el while que indica "Panel > Termo && Termo < 60" por lo tanto me parece que la logica es correcta.  Es decir, hasta que Termo no sea menor que 60 no habra otro encendido.

Ahora bien, hay otra condicion que se tienene que cumplir "Panel > Termo" y ademas estas variables vienen de unas conversiones que haces al principio del loop. Yo escribiria esas variables antes y despues de convertirlas en el monitor de manera de saber exactamente cuanto valen en el momento de apagarse y encenderse la bomba.

Go Up