[SOLUCIONADO]
Hola
Tengo un proyecto de control de temperatura en un termo de agua que va a los radiadores, esta agua a su vez va calentada por una estufa. Utilizo Arduino UNO, sensores d temp NTC, reles, pulsadores para un pequeño MENU, display. Uno de mis problemas, pq en general funciona, pero presenta algunos defectos, es que cuando las temp alcanzan los setpoints fijados activan los reles, pero estos se m activan y desactivan cuando la temp esta ligeramente por encima de los setpoints, una especie de histeresis corrupta o como q los valores de a temp, variaran muy rapidamente hacia abajo, pero ya cuando alcanza 2 grados por encima del setpoint se mantiene bien activados y las bombas funcionando, kisiera eliminar este defecto, pues le tengo en la programac, q si es mayor o igual se activen, pero no funciona correctamente, saludos
PD: el codigo lo recorto para q se muestre
#include <math.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int menu = 0; //VARIABLE PARA PODER DESPLAZARME POR EL MENÚ
int SP1 = 60; //SETPOINT DE TEMP ESTABLECIDO POR DEFECTO EN EL TERMO, PARA QUE SE MANDE H2O A LOS RADIADORES
int SP2 = 55; //SETPOINT DE TEMP ESTABLECIDO POR DEFECTO DEL H2O A LA SALIDA DE LA ESTUFA
int SP3 = 85; //SETPOINT DE TEMP MAXIMA ESTABLECIDA POR DEFECTO EN EL TERMO
bool o_n = 0; // VARIABLE PARA ACTIVAR LAS BOMBA HACIA LOS RADIADORES SI SE DEMANDA Y SE CUMPLE EL SETPOINT ESTABLECIDO
bool o_n2 = 0; // VARIABLE PARA ACTIVAR LAS BOMBA HACIA LOS RADIADORES DE LA COMPARACION SI ES MAX LA TEMP DEL TERMO
LiquidCrystal_I2C LCD1(0x27,20,4); //DECLARANDO UN OBJETO DEL TIPO DISPLAYç
unsigned long t; //VARIABLE PARA TRABAJAR CON MILLIS EN EL ENCENDIDO DE LA LUZ DE FONDO DEL DISPLAY
unsigned long t1; //VARIABLE PARA TRABAJAR CON MILLIS EN EL MOSTRADO DE DATOS
byte grados[8] = {
0b00000111,
0b00000101,
0b00000111,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
};
void setup() {
// put your setup code here, to run once:
pinMode(13, OUTPUT); //DECLARANDO PIN 13 COMO SALIDA PARA LA ACT/DESACTIVACIÓN DE LA BOMBA HACIA TERMO
pinMode(12, OUTPUT); //DECLARANDO PIN 12 COMO SALIDA PARA LA ACT/DESACTIVACIÓN DE LA BOMBA HACIA RADIADORES PISO 1
pinMode(11, OUTPUT); //DECLARANDO PIN 11 COMO SALIDA PARA LA ACT/DESACTIVACIÓN DE LA BOMBA HACIA RADIADORES PISO 2
pinMode(10, INPUT); //DECLARANDO PIN 10 COMO ENTRADA DE ACT/DESACTIVACIÓN TERMOSTATO PISO 1
pinMode(9, INPUT); //DECLARANDO PIN 9 COMO ENTRADA DE ACT/DESACTIVACIÓN TERMOSTATO PISO 2
pinMode(8, INPUT); //DECLARANDO PIN 8 COMO ENTRADA DEL BOTON DE SELECCIONAR LOS SETPOINTS
pinMode(7, INPUT); //DECLARANDO PIN 7 COMO ENTRADA DEL BOTON QUE DISMINUYE EL SETPOINT
pinMode(6, INPUT); //DECLARANDO PIN 6 COMO ENTRADA DEL BOTON QUE AUMENTA EL SETPOINT
t = millis();
t1 = millis();
}
//FUNCIÓN QUE MIDE LA TEMPERATURA EN FUNCIÓN DE LOS PARÁMETROS DE CADA NTC---ECUACION Steinhart-Hart
double TermistorNTC(int RawADC) {
double Temp;
Temp = log(((10240000/RawADC) - 9990));
Temp = 1 / (0.002343861912 + (0.00004746015750 + (0.0000007387844497 * Temp * Temp ))* Temp ); //PARÁMETROS CALCULADOS https://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
Temp = Temp - 273.15;// Convierte de Kelvin a Celsius
return Temp;
}
//FUNCIÓN QUE MIDE LA TEMPERATURA EN FUNCIÓN DE LOS PARÁMETROS DE CADA NTC---ECUACION Steinhart-Hart
double TermistorNTC1(int RawADC) {
double Temp1;
Temp1 = log(((10240000/RawADC) - 9990));
Temp1 = 1 / (0.002036039101 + (0.00009106506794 + (0.0000006157252906 * Temp1 * Temp1 ))* Temp1 ); //PARÁMETROS CALCULADOS https://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
Temp1 = Temp1 - 273.15;// Convierte de Kelvin a Celsius
return Temp1;
}
//FUNCIÓN QUE MIDE LA TEMPERATURA EN FUNCIÓN DE LOS PARÁMETROS DE CADA NTC---ECUACION Steinhart-Hart
double TermistorNTC2(int RawADC) {
double Temp2;
Temp2 = log(((10240000/RawADC) - 9990));
Temp2 = 1 / (0.002064939141 + (0.00008349295632 + (0.0000006655146377 * Temp2 * Temp2 ))* Temp2 ); //PARÁMETROS CALCULADOS https://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
Temp2 = Temp2 - 273.15;// Convierte de Kelvin a Celsius
return Temp2;
}
void loop() {
// put your main code here, to run repeatedly:
int A0; // LECTURA DE LA ENTRADA ANALOG 1 CORRESPONDIENTE A LA TEMPERATURA 1 DEL TERMO
int A1; // LECTURA DE LA ENTRADA ANALOG 2 CORRESPONDIENTE A LA TEMPERATURA 2 DEL H2O DE LA ESTUFA
int A2; // LECTURA DE LA ENTRADA ANALOG 3 CORRESPONDIENTE A LA MAXIMA TEMPERATURA DEL TERMO
double T1; // VARIABLE PROCESADA Q CONTIENE LA TEMPERATURA 1 DEL TERMO
double T2; // VARIABLE PROCESADA Q CONTIENE LA TEMPERATURA 2 DEL H2O DE LA ESTUFA
double T3; // VARIABLE PROCESADA Q CONTIENE LA TEMPERATURA 3 MAXIMA DEL TERMO
bool PISO_1 = 0; //VARIABLE QUE ALMACENA LA ACTIVACIÓN DEL TERMOSTATO DEL PISO 1
bool PISO_2 = 0; //VARIABLE QUE ALMACENA LA ACTIVACIÓN DEL TERMOSTATO DEL PISO 2
A0 = analogRead(0); // LEYENDO EL VALOR DE LA T1 POR LA ENTRADA DIGITAL 0 Y PONIENDOLO EN LA VARIABLE TEMPORAL A0
A1 = analogRead(1); // LEYENDO EL VALOR DE LA T2 POR LA ENTRADA DIGITAL 1 Y PONIENDOLO EN LA VARIABLE TEMPORAL A1
A2 = analogRead(2); // LEYENDO EL VALOR DE LA T3 POR LA ENTRADA DIGITAL 2 Y PONIENDOLO EN LA VARIABLE TEMPORAL A3
T1 = TermistorNTC(A0); //LLAMANDO A LA FUNCION QUE CONVIERTE A TEMPERATURA EL VOLTAJE DE LA ENTRADA EN CUESTIÓN
T2 = TermistorNTC(A1); //LLAMANDO A LA FUNCION QUE CONVIERTE A TEMPERATURA EL VOLTAJE DE LA ENTRADA EN CUESTIÓN
T3 = TermistorNTC(A2); //LLAMANDO A LA FUNCION QUE CONVIERTE A TEMPERATURA EL VOLTAJE DE LA ENTRADA EN CUESTIÓN
int entrarmenu = 1; //VARIABLE PARA PODER SALIR DE LA CONFIGURACION DE SETPOINTS
bool L = 0; //VARIABLE PARA PODER ILUMINAR EL DISPLAY
if ((digitalRead(8) == 0) || (digitalRead(7) == 0) || (digitalRead(6) == 0))
{
L = 1;
}
PISO_1 = digitalRead(10);
PISO_2 = digitalRead(9);
if (o_n == 1 || o_n2 == 1)
{
digitalWrite(12, HIGH);
}
else
{
digitalWrite(12, LOW);
}
//ENCUESTANDO SI SE ACTIVA LA SEÑAL DEL TERMOSTATO DEL PISO 1 Y SI LA TEMP DEL TERMO CUMPLE PARA PODER HACER PASAR EL H2O HACIA LOS RADIADORES
if (PISO_1 == HIGH && T1 >= SP1 ){
o_n = 1;
//digitalWrite(12, HIGH); //ACTIVANDO LA BOMBA DE SUMINISTRO DE AGUA A 60C HACIA LOS RADIADORES
} else {
o_n = 0;
//digitalWrite(12, LOW);
}
//ENCUESTANDO SI SE ACTIVA LA SEÑAL DEL TERMOSTATO DEL PISO 2 Y SI LA TEMP DEL TERMO CUMPLE PARA PODER HACER PASAR EL H2O HACIA LOS RADIADORES
//if (PISO_2 == HIGH && SP1 >= 35 ){
//digitalWrite(11, HIGH); //ACTIVANDO LA BOMBA DE SUMINISTRO DE AGUA A 60C HACIA LOS RADIADORES
//}
//else {
//digitalWrite(11, LOW);
//}
//COMPRABANDO Q LA TEMPERATURA DEL AGUA DEL TERMO NO SE CALIENTE DEMASIADO
if (T3 >= SP3)
{
//if (PISO_1 == HIGH || PISO_2 == HIGH) //COMPROBANDO SI ALGUNO DE LOS TERMOSTATOS DE LOS PISOS ESTÁN ACTIVOS
//{
//if (PISO_1 == HIGH) //COMPRUEBA CUAL PISO TIENE MENOR TEMPERATURA QUE EL SETPOINT FIJADO
//{
o_n2 = 1;
//digitalWrite(12, HIGH);
//}// else {digitalWrite(11, HIGH);}
//}else {
//digitalWrite(12, HIGH);
//digitalWrite(11, HIGH);
//}
}
else
{
o_n2 = 0;
}
//COMPROBANDO SI LA TEMPERATURA DEL AGUA DE LA ESTUFA ES SUFICIENTE PARA HACERLA CIRCULAR HACIA EL TERMO
if (T2 >= SP2)
{
digitalWrite(13, HIGH); //ACTIVANDO LA BOMBA DE SUMINISTRO DE AGUA HACIA EL TERMO
}
else
{
digitalWrite(13, LOW);
}
}