Arduino - Problema en nevera con arduino.

 
Vista:

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
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Problema en nevera con arduino.

Publicado por Dio (1 intervención) el 06/12/2022 16:56:20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <math.h>
#include <Time.h>
 
// Definimos constantes para mejorar la legibilidad del código
#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
 
// Declaramos variables globales
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
 
// Declaramos una función para leer la temperatura de los sensores
float leo_temp(int pin) {
    // Código para leer la temperatura del sensor NTC conectado al pin especificado
    // y devolver el valor de la temperatura en grados Celsius
}
 
void setup() {
    Serial.begin(9600);
 
    // Configuramos los pines como salidas o entradas
pinMode(7, OUTPUT); // Salida del motocompresor
pinMode(8, OUTPUT); // Salida forzador refrigerador
pinMode(9, OUTPUT); // Resistencia de calefacción
pinMode(10, OUTPUT); // Led Encendido
pinMode(11, OUTPUT); // Led Compresor
pinMode(12, OUTPUT); // Led Deshielo
pinMode(A6, INPUT); // Entrada potenciómetro
pinMode(LED_BUILTIN, OUTPUT); // Solo para saber que subió el programa al Arduino
 
// Inicializamos los pines en el estado deseado
digitalWrite(7, APAGO); // Motocompresor
digitalWrite(8, APAGO); // Forzador del refrigerador
digitalWrite(9, APAGO); // R de calefacción
digitalWrite(10, HIGH); // Led Encendido
digitalWrite(11, LOW); // Led Compresor
digitalWrite(12, LOW); // Led Deshielo
 
// Esperamos 5 segundos por si hubo falso contacto al conectar
delay(5000);
 
Serial.println("inicio"); // Transmite el nivel de frío 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.0 / 1023.0); // Calcula la tensión equivalente
    Serial.print("Tensión equivalente => ");
    Serial.println(Veq);
    Serial.println(" ");
 
    if (Veq > 0 && Veq < 1.5) {
        digitalWrite(10, LOW); // Led Encendido
    }
 
    if (Veq > 1.5 && Veq < 2.5) {
        digitalWrite(10, HIGH); // Led Encendido
        digitalWrite(8, ENCIENDO); // Forzador del refrigerador
    }
 
    if (Veq > 2.5 && Veq < 3.5) {
        digitalWrite(10, HIGH); // Led Encendido
        digitalWrite(8, ENCIENDO); // Forzador del refrigerador
        digitalWrite(9, ENCIENDO); // R de calefacción
    }
 
    if (Veq > 3.5) {
        digitalWrite(10, LOW); // Led Encendido
    }
 
    // Control del congelador
    if (TEMP_F <= TempEF && ciclo_freezer == 0) {
        digitalWrite(7, ENCIENDO); // Motocompresor
        digitalWrite(11, HIGH); // Led Compresor
        Tem = Tem + 1;
        Serial.println("Congelador Encendido");
    }
 
    if (TEMP_F >= TempAF && ciclo_freezer == 0) {
        digitalWrite(7, APAGO); // Motocompresor
        digitalWrite(11, LOW); // Led Compresor
        Tem = 0;
        Serial.println("Congelador Apagado");
    }
 
    // Control del refrigerador
    if (TEMP_R >= TempER && ciclo_freezer == 0) {
        digitalWrite(8, ENCIENDO); // Forzador del refrigerador
        digitalWrite(9, ENCIENDO); // R de calefacción
        Serial.println("Refrigerador Encendido");
    }
 
    if (TEMP_R <= TempAR && ciclo_freezer == 0) {
        digitalWrite(8, APAGO); // Forzador del refrigerador
        digitalWrite(9, APAGO); // R de calefacción
        Serial.println("Refrigerador Apagado");
    }
 
    // Control del ciclo de descongelación
    if (Tem >= 240 && ciclo_freezer == 0) {
        ciclo_freezer = 1;
        contador = millis();
        Serial.println("Inicio del ciclo de descongelación");
        digitalWrite(12, HIGH); // Led Deshielo
    }
 
    if (ciclo_freezer == 1) {
        digitalWrite(7, ENCIENDO); // Motocompresor
        digitalWrite(11, HIGH); // Led Compresor
        Tem = Tem + 1;
        if (millis() - contador >= 3600000) {
            ciclo_freezer = 0;
            contador = 0;
            digitalWrite(7, APAGO); // Motocompresor
            digitalWrite(11, LOW);
            digitalWrite(12, LOW); // Led Deshielo
            Serial.println("Fin del ciclo de descongelación");
        }
    }
 
    delay(60000); // Espera 60 segundos para volver a realizar la medición
}
 
// Función para leer la temperatura
float leo_tempp(int pn_temp)
{
    int i = 0;
    float temp = 0;
    float temp_media = 0;
 
    for (i = 0; i < 3; i++) {
        temp = temp + (analogRead(pn_temp) * 0.004882814); // Valor de la temperatura
        delay(100);
    }
 
    temp_media = temp / 3;
    return temp_media;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar