Problema en nevera con arduino.
Publicado por Luis Fernando (1 intervención) el 21/11/2022 15:02:29
/*
Añado aqui lo que pasa, la nevera es no frost, es decir cada 4h de funcionamiento del compresor, esta calienta para descongelar, y sale de este ciclo por temperatura, en principio funciona todo bien, pero pasadas unas 24h. de repente se para y se apaga el led del pin 10, un led que solo esta definido que se encienda, no hay ninguna linea que haga que el led se apague, entonces no entiendo que esta pasando
Realizado por LuisFer
Programa para Nevera NoFrost Fagor FCT682
*/
#include <math.h>
#include <Time.h>
/*=ATENCION=Como tengo una placa de reles activo bajo entonces LOW(enciende es 0) y HIGH(apaga es 1)=====*/
#define ENCIENDO 0
#define APAGO 1
#define TempEF (-23) //Temperatura de encendido del freezer
#define TempAF (-26) //Temperatura de apagado del freezer
#define TempER (5) //Temperatura de encendido del refrigerador
#define TempAR (1) //Temperatura de apagado del refrigerador
float TEMP_F = 0; //Lectura temp. del freezer NTC
float TEMP_R = 0; //Lectura temp. del refrigerador NTC
int ciclo_freezer = 0;
unsigned long Tem = 0; //Tiempo encendido del motocompresor
unsigned long arranque = 0;
unsigned long contador_tiempo = 0;
unsigned long t = 0;
unsigned long var = 0;
unsigned long contador = 0;
unsigned long apagado = 0;
int AN6; //Variable para la lectura del canal analógico A6
float Veq; //Variable para la tensión equivalente
void setup() {
Serial.begin(9600);
pinMode(7,OUTPUT);//Salida del motocompresor
pinMode(8,OUTPUT);//Salida forzador refrigerador
pinMode(9,OUTPUT);//Resistencia de calefaccion
pinMode(10,OUTPUT);//Led Encendido
pinMode(11,OUTPUT);//Led Compresor
pinMode(12,OUTPUT);//Led Deshielo
pinMode(A6,INPUT);//Entrada potenciometro
pinMode(LED_BUILTIN, OUTPUT);//Solo para saber que subio el programa al arduino
digitalWrite(7,APAGO);//Motocompresor
digitalWrite(8,APAGO);//Forzador del refrigerador
digitalWrite(9,APAGO);//R de calefaccion
digitalWrite(10,HIGH);//Led Encendido
digitalWrite(11,LOW); //Led Compresor
digitalWrite(12,LOW); //Led Deshielo
//Espero 5 segundos por si hubo falso contacto al conectar
delay(5000);
Serial.println("inicio"); //Transmite el nivel de frio seleccionado
}
void loop()
{
unsigned long apagado = 0;
unsigned long i = 0;
unsigned long contador = 0;
TEMP_F = leo_temp(4); //Leo la temp. del freezer
Serial.print("Temperatura Congelador => "); //Transmite temperatura del congelador
Serial.println(TEMP_F); //Transmite temperatura del congelador
TEMP_R = leo_temp(5); //Leo la temp. del refrigerador
Serial.print("Temperatura Friforifico => "); //Transmite temperatura del frigorifico
Serial.println(TEMP_R); //Transmite temperatura del frigorifico
Serial.println(" ");
Serial.println("Minutos Funcionando Compresor");
Serial.println(Tem);
AN6=analogRead(A6); //Realiza la conversión de A6 (potenciómetro)
Veq=AN6*5.00/1024; //Calcula la tensión equivalente
if (Veq<1.00)
{
#define TempER (7) //Temperatura de encendido del refrigerador
#define TempAR (5) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (1.00<Veq && Veq<2.00)
{
#define TempER (6) //Temperatura de encendido del refrigerador
#define TempAR (4) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (2.00<Veq && Veq<3.00)
{
#define TempER (5) //Temperatura de encendido del refrigerador
#define TempAR (3) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (3.00<Veq && Veq<4.00)
{
#define TempER (4) //Temperatura de encendido del refrigerador
#define TempAR (2) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (4.00<Veq && Veq<5.00)
{
#define TempER (3) //Temperatura de encendido del refrigerador
#define TempAR (1) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
if( TEMP_F > TempEF && ciclo_freezer == 0 )//Debo ingresar una sola vez, porque tomo el time_t de ese momento para contar luego el tiempo que estuvo encendido
{
ciclo_freezer = 1;
digitalWrite(7,ENCIENDO);//motor compresor
digitalWrite(11,HIGH); //Led Compresor
Serial.println("Compresor Encendido");
digitalWrite(8,ENCIENDO);//cooler del refrigerador
Serial.println("Ventilador Frigo Encendido");
arranque = millis();
}
if( TEMP_F < TempAF && ciclo_freezer == 1)
{
digitalWrite(7,APAGO);//motor compresor
Serial.println("Compresor Apagado");
digitalWrite(11,LOW); //Led Compresor
digitalWrite(8,APAGO);//cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
ciclo_freezer = 0;
t = millis();
contador_tiempo = contador_tiempo + ( t - arranque )/60000; //Acumulo cuanto tiempo estuvo funcionando el motocompresor
}
if( ciclo_freezer == 1 && TEMP_R < TempAR ) //Estoy en el ciclo de enfriado del freezer y el refrigerador llego a su temp de setup, apago solo el forzador del refrigerador
{
digitalWrite(8,APAGO); //apago cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
}
if( TEMP_R >= TempER )//Si la Temp. del refigerador esta por encima de TempER, enciendo ambos ventiladores para transferir frio del freezer al refrigerador
{
digitalWrite(8,ENCIENDO);//cooler del refrigerador
Serial.println("Ventilador Frigo Encendido");
}
if( TEMP_R < TempAR && ciclo_freezer == 0 )
{
digitalWrite(8,APAGO); //apago cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
}
if( ciclo_freezer == 1 )
{
Tem = ( millis( )- arranque ) / 60000;
if( Tem >= 60 ) // (colocar 60) si estuvo por mas de una hora funcionando seguido lo apago
{
digitalWrite(7,APAGO);//motor compresor
digitalWrite(11,LOW); //Led Compresor
Serial.println("Compresor Apagado");
digitalWrite(8,APAGO);//cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
ciclo_freezer = 0;
t = millis();
contador_tiempo = contador_tiempo + ( t - arranque )/60000; //Acumulo cuanto tiempo estuvo funcionando el motocompresorSerial.print("Apago el motocompresor para que no caliente");
apagado = millis();
contador = 0;
Tem = 0;
delay(1000);
for(Tem = 0 ; Tem <= 20 ; ) //( colocar Tem < 30 )mantengo apagado por seguridad durante media hora
{
t = millis();
contador = t - apagado;
if( contador >= 60000 )
{
Tem = Tem + contador/60000;
if(Tem == 3 )
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
apagado = millis();
}
delay(1000);
}
}
}else if(ciclo_freezer == 0 )
{
Tem = 0;
}
if( contador_tiempo >= 240 )//sumador de minutos que estuvo el motocompresor encendido. Pasaron mas de 4 hs, esto es segun manual
{
ciclo_deshielo();
}
delay(1000);
}
int ciclo_deshielo()
{
digitalWrite(7, APAGO); //motor compresor
digitalWrite(11, LOW); //Led Compresor
Serial.println("Compresor Apagado");
digitalWrite(8, APAGO); //cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
contador_tiempo = 0; //reseteo contador de tiempo compresor, porque es mayor a 4 hs encendido
digitalWrite(9, ENCIENDO); //conectar resistencia de calefaccion y apagar cuando: temp termistor de calefaccion > 15°C o tiempo > a 20 minutos (1 minuto = 60000 ms)
digitalWrite(12, HIGH); //Led Deshielo
Serial.println("Resistencia Calefactable Encendido");
digitalWrite(LED_BUILTIN, LOW);
TEMP_F = leo_temp(4); //Leo la Temp. de la R calefactora
delay(1000);
while (TEMP_F <= -10) //Salgo por temperatura, cuando llega a 0º pongo -10 por el desfase
{
TEMP_F = leo_temp(4); //Leo la Temp. de la R calefactora que es la misma sonda que el freezer
delay(1000);
}
digitalWrite(9, APAGO); //Apago la resistencia calefactora
digitalWrite(12, LOW); //Led Deshielo
Serial.println("Resistencia Calefactable Apagado");
arranque = 0;
contador_tiempo = 0;
t = 0;
Tem = 0;
contador = 0;
apagado = 0;
}
float leo_temp(int entrada)
{
if(entrada == 5){ //Sonda Refrigerador
float Rserie = 1000.0; //Resistencia en serie de 1K, de metalfilm.
float Vcc = 5.0; //Tension de alimentacion
float BETA = 3793.0;
float TempK = 298.0; //Temperatura de 25 °C expresada en kelvin
float Rntc = 700; //resistencia de NTC a 25°C, sacado del manual para modelo WRX48X
float Vm = 0.0; //Tension medida en la entrada, que es igual a la caida de tension sobre el NTC
float rntc = 0.0; //Valor de la resistencia del NTC que va cambiando con el cambio de temperatura
float temperaturaK = 0.0;
Vm=(Vcc / 1024)*( analogRead(entrada) ); //Leo la tensión en la entrada
rntc = Rserie / ((Vcc/Vm)-1); //Calcular la resistencia de la NTC en disposicion Vcc Rserie Rntc masa
temperaturaK = BETA/(log(rntc/Rntc)+(BETA/TempK)); //Calcular la temperatura en Kelvin
return(temperaturaK-273); //Restar 273 para pasar a grados celsus
}
if(entrada == 4){ //Sonda Freezer y Rcalefactable
float Rserie = 10000.0; //Resistencia en serie de 10K, de metalfilm.
float Vcc = 5.0; //Tension de alimentacion
float BETA = 3793.0;
float TempK = 298.0; //Temperatura de 25 °C expresada en kelvin
float Rntc = 2700; //resistencia de NTC a 25°C, sacado del manual para modelo WRX48X
float Vm = 0.0; //Tension medida en la entrada, que es igual a la caida de tension sobre el NTC
float rntc = 0.0; //Valor de la resistencia del NTC que va cambiando con el cambio de temperatura
float temperaturaK = 0.0;
Vm=(Vcc / 1024)*( analogRead(entrada) ); //Leo la tensión en la entrada
rntc = Rserie / ((Vcc/Vm)-1); //Calcular la resistencia de la NTC en disposicion Vcc Rserie Rntc masa
temperaturaK = BETA/(log(rntc/Rntc)+(BETA/TempK)); //Calcular la temperatura en Kelvin
return(temperaturaK-273); //Restar 273 para pasar a grados celsus
}
}
Añado aqui lo que pasa, la nevera es no frost, es decir cada 4h de funcionamiento del compresor, esta calienta para descongelar, y sale de este ciclo por temperatura, en principio funciona todo bien, pero pasadas unas 24h. de repente se para y se apaga el led del pin 10, un led que solo esta definido que se encienda, no hay ninguna linea que haga que el led se apague, entonces no entiendo que esta pasando
Realizado por LuisFer
Programa para Nevera NoFrost Fagor FCT682
*/
#include <math.h>
#include <Time.h>
/*=ATENCION=Como tengo una placa de reles activo bajo entonces LOW(enciende es 0) y HIGH(apaga es 1)=====*/
#define ENCIENDO 0
#define APAGO 1
#define TempEF (-23) //Temperatura de encendido del freezer
#define TempAF (-26) //Temperatura de apagado del freezer
#define TempER (5) //Temperatura de encendido del refrigerador
#define TempAR (1) //Temperatura de apagado del refrigerador
float TEMP_F = 0; //Lectura temp. del freezer NTC
float TEMP_R = 0; //Lectura temp. del refrigerador NTC
int ciclo_freezer = 0;
unsigned long Tem = 0; //Tiempo encendido del motocompresor
unsigned long arranque = 0;
unsigned long contador_tiempo = 0;
unsigned long t = 0;
unsigned long var = 0;
unsigned long contador = 0;
unsigned long apagado = 0;
int AN6; //Variable para la lectura del canal analógico A6
float Veq; //Variable para la tensión equivalente
void setup() {
Serial.begin(9600);
pinMode(7,OUTPUT);//Salida del motocompresor
pinMode(8,OUTPUT);//Salida forzador refrigerador
pinMode(9,OUTPUT);//Resistencia de calefaccion
pinMode(10,OUTPUT);//Led Encendido
pinMode(11,OUTPUT);//Led Compresor
pinMode(12,OUTPUT);//Led Deshielo
pinMode(A6,INPUT);//Entrada potenciometro
pinMode(LED_BUILTIN, OUTPUT);//Solo para saber que subio el programa al arduino
digitalWrite(7,APAGO);//Motocompresor
digitalWrite(8,APAGO);//Forzador del refrigerador
digitalWrite(9,APAGO);//R de calefaccion
digitalWrite(10,HIGH);//Led Encendido
digitalWrite(11,LOW); //Led Compresor
digitalWrite(12,LOW); //Led Deshielo
//Espero 5 segundos por si hubo falso contacto al conectar
delay(5000);
Serial.println("inicio"); //Transmite el nivel de frio seleccionado
}
void loop()
{
unsigned long apagado = 0;
unsigned long i = 0;
unsigned long contador = 0;
TEMP_F = leo_temp(4); //Leo la temp. del freezer
Serial.print("Temperatura Congelador => "); //Transmite temperatura del congelador
Serial.println(TEMP_F); //Transmite temperatura del congelador
TEMP_R = leo_temp(5); //Leo la temp. del refrigerador
Serial.print("Temperatura Friforifico => "); //Transmite temperatura del frigorifico
Serial.println(TEMP_R); //Transmite temperatura del frigorifico
Serial.println(" ");
Serial.println("Minutos Funcionando Compresor");
Serial.println(Tem);
AN6=analogRead(A6); //Realiza la conversión de A6 (potenciómetro)
Veq=AN6*5.00/1024; //Calcula la tensión equivalente
if (Veq<1.00)
{
#define TempER (7) //Temperatura de encendido del refrigerador
#define TempAR (5) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (1.00<Veq && Veq<2.00)
{
#define TempER (6) //Temperatura de encendido del refrigerador
#define TempAR (4) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (2.00<Veq && Veq<3.00)
{
#define TempER (5) //Temperatura de encendido del refrigerador
#define TempAR (3) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (3.00<Veq && Veq<4.00)
{
#define TempER (4) //Temperatura de encendido del refrigerador
#define TempAR (2) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
else if (4.00<Veq && Veq<5.00)
{
#define TempER (3) //Temperatura de encendido del refrigerador
#define TempAR (1) //Temperatura de apagado del refrigerador
Serial.println(TempAR); //Transmite el nivel de frio seleccionado
}
if( TEMP_F > TempEF && ciclo_freezer == 0 )//Debo ingresar una sola vez, porque tomo el time_t de ese momento para contar luego el tiempo que estuvo encendido
{
ciclo_freezer = 1;
digitalWrite(7,ENCIENDO);//motor compresor
digitalWrite(11,HIGH); //Led Compresor
Serial.println("Compresor Encendido");
digitalWrite(8,ENCIENDO);//cooler del refrigerador
Serial.println("Ventilador Frigo Encendido");
arranque = millis();
}
if( TEMP_F < TempAF && ciclo_freezer == 1)
{
digitalWrite(7,APAGO);//motor compresor
Serial.println("Compresor Apagado");
digitalWrite(11,LOW); //Led Compresor
digitalWrite(8,APAGO);//cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
ciclo_freezer = 0;
t = millis();
contador_tiempo = contador_tiempo + ( t - arranque )/60000; //Acumulo cuanto tiempo estuvo funcionando el motocompresor
}
if( ciclo_freezer == 1 && TEMP_R < TempAR ) //Estoy en el ciclo de enfriado del freezer y el refrigerador llego a su temp de setup, apago solo el forzador del refrigerador
{
digitalWrite(8,APAGO); //apago cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
}
if( TEMP_R >= TempER )//Si la Temp. del refigerador esta por encima de TempER, enciendo ambos ventiladores para transferir frio del freezer al refrigerador
{
digitalWrite(8,ENCIENDO);//cooler del refrigerador
Serial.println("Ventilador Frigo Encendido");
}
if( TEMP_R < TempAR && ciclo_freezer == 0 )
{
digitalWrite(8,APAGO); //apago cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
}
if( ciclo_freezer == 1 )
{
Tem = ( millis( )- arranque ) / 60000;
if( Tem >= 60 ) // (colocar 60) si estuvo por mas de una hora funcionando seguido lo apago
{
digitalWrite(7,APAGO);//motor compresor
digitalWrite(11,LOW); //Led Compresor
Serial.println("Compresor Apagado");
digitalWrite(8,APAGO);//cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
ciclo_freezer = 0;
t = millis();
contador_tiempo = contador_tiempo + ( t - arranque )/60000; //Acumulo cuanto tiempo estuvo funcionando el motocompresorSerial.print("Apago el motocompresor para que no caliente");
apagado = millis();
contador = 0;
Tem = 0;
delay(1000);
for(Tem = 0 ; Tem <= 20 ; ) //( colocar Tem < 30 )mantengo apagado por seguridad durante media hora
{
t = millis();
contador = t - apagado;
if( contador >= 60000 )
{
Tem = Tem + contador/60000;
if(Tem == 3 )
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
apagado = millis();
}
delay(1000);
}
}
}else if(ciclo_freezer == 0 )
{
Tem = 0;
}
if( contador_tiempo >= 240 )//sumador de minutos que estuvo el motocompresor encendido. Pasaron mas de 4 hs, esto es segun manual
{
ciclo_deshielo();
}
delay(1000);
}
int ciclo_deshielo()
{
digitalWrite(7, APAGO); //motor compresor
digitalWrite(11, LOW); //Led Compresor
Serial.println("Compresor Apagado");
digitalWrite(8, APAGO); //cooler del refrigerador
Serial.println("Ventilador Frigo Apagado");
contador_tiempo = 0; //reseteo contador de tiempo compresor, porque es mayor a 4 hs encendido
digitalWrite(9, ENCIENDO); //conectar resistencia de calefaccion y apagar cuando: temp termistor de calefaccion > 15°C o tiempo > a 20 minutos (1 minuto = 60000 ms)
digitalWrite(12, HIGH); //Led Deshielo
Serial.println("Resistencia Calefactable Encendido");
digitalWrite(LED_BUILTIN, LOW);
TEMP_F = leo_temp(4); //Leo la Temp. de la R calefactora
delay(1000);
while (TEMP_F <= -10) //Salgo por temperatura, cuando llega a 0º pongo -10 por el desfase
{
TEMP_F = leo_temp(4); //Leo la Temp. de la R calefactora que es la misma sonda que el freezer
delay(1000);
}
digitalWrite(9, APAGO); //Apago la resistencia calefactora
digitalWrite(12, LOW); //Led Deshielo
Serial.println("Resistencia Calefactable Apagado");
arranque = 0;
contador_tiempo = 0;
t = 0;
Tem = 0;
contador = 0;
apagado = 0;
}
float leo_temp(int entrada)
{
if(entrada == 5){ //Sonda Refrigerador
float Rserie = 1000.0; //Resistencia en serie de 1K, de metalfilm.
float Vcc = 5.0; //Tension de alimentacion
float BETA = 3793.0;
float TempK = 298.0; //Temperatura de 25 °C expresada en kelvin
float Rntc = 700; //resistencia de NTC a 25°C, sacado del manual para modelo WRX48X
float Vm = 0.0; //Tension medida en la entrada, que es igual a la caida de tension sobre el NTC
float rntc = 0.0; //Valor de la resistencia del NTC que va cambiando con el cambio de temperatura
float temperaturaK = 0.0;
Vm=(Vcc / 1024)*( analogRead(entrada) ); //Leo la tensión en la entrada
rntc = Rserie / ((Vcc/Vm)-1); //Calcular la resistencia de la NTC en disposicion Vcc Rserie Rntc masa
temperaturaK = BETA/(log(rntc/Rntc)+(BETA/TempK)); //Calcular la temperatura en Kelvin
return(temperaturaK-273); //Restar 273 para pasar a grados celsus
}
if(entrada == 4){ //Sonda Freezer y Rcalefactable
float Rserie = 10000.0; //Resistencia en serie de 10K, de metalfilm.
float Vcc = 5.0; //Tension de alimentacion
float BETA = 3793.0;
float TempK = 298.0; //Temperatura de 25 °C expresada en kelvin
float Rntc = 2700; //resistencia de NTC a 25°C, sacado del manual para modelo WRX48X
float Vm = 0.0; //Tension medida en la entrada, que es igual a la caida de tension sobre el NTC
float rntc = 0.0; //Valor de la resistencia del NTC que va cambiando con el cambio de temperatura
float temperaturaK = 0.0;
Vm=(Vcc / 1024)*( analogRead(entrada) ); //Leo la tensión en la entrada
rntc = Rserie / ((Vcc/Vm)-1); //Calcular la resistencia de la NTC en disposicion Vcc Rserie Rntc masa
temperaturaK = BETA/(log(rntc/Rntc)+(BETA/TempK)); //Calcular la temperatura en Kelvin
return(temperaturaK-273); //Restar 273 para pasar a grados celsus
}
}
Valora esta pregunta


0