PID de temperatura aun que no pueda variar la capacidad de refrigeracion?

Hola, buenas pues les cuento, que hace poco vendi un tablero para una camara de refrigeracion con un arduino UNO… Mas… Aqui!!!

Bueno ps ahora el cliente quiere algo mejor… :sunglasses: :sunglasses: :sunglasses: :sunglasses:
Y gracias a la prueba anterior ya se que hay que tener muchos cuidados con algunas cosas;

-Filtro de ruido en fuente de poder
-Los cables de los switches van; vcc—NO---- GND… para que no haya ruido en un digital read de 0.
-Snubbers para los contactores y varistores para eliminar chispa en contactos de contactores…

Y le vamos a agregar algunas cosillas; entre ellas un menu LCD con MENWIZ para que puedan modificar sus temperaturas directamente del arduino, sin tener que depender de un thermostato de terceros, alarmas por humedad por temperatura, estoy viendo que tanto puedo agregar la supervision de corriente del compresor, y un lector de voltaje…Lo que si… deshielo programables y un modo nocturno, quizas un sensor de puerta abierta, o presencial para apagar la refrigeracion mientras haya personal dentro, etc.

La duda como el titulo lo indica, es que tanto me conviene ponerle un control PID a pesar de que no puedo variar la capacidad de la refrigeracion, ya que este compresor y sus ventiladores no son inverter ni DC… Ya he visto una libreria que hace muy sencillo implementar el PID.

He visto por ahi la idea del promedio movil y me ha gustado, pero me pregunto si es la mejor manera de leer el amaperaje del compresor… Por que digamos si nominalmente debemos andar entre 11 y 14Amps en el arranque es muy probable que alacance unos 23 -30 en un instante, aunque despues se normalice y como la idea es poner un paro por alta corriente , no quiero que se me este disparando en cada arranque.

Como ven? Que ideas tienen?
Que me recomiendan ?
Y que no me recomiendan?

Les dejo un snip del codigo que todavia esta en proceso… Revise mi post anterior y vaya que he aprendido mucho, muchas gracias a las personas de este foro!!!

// Control camara Jose rodriguez incluye termostato alternador difusor.ino

/* 
V.1 Este programa controla la camara de refrigeración mediante la sonda de
temperatura DS 1820. Ademas cuando el ciclo de refrigeracion se encuentra 
apagado, el programa mantiene solo un ventilador del difusor encendido para
evitar un aereamiento excesivo de la carne. 

V.2 (actual) En esta version se agrega un menu MENWIZ para controlar la temp
de arranque y paro, ademas de un relog para comenzar y parar el modo nocturno
en el cual la refrigeracion una vez detenida, detendra todos los motores del
difusor. 

Diseñado y construido por; 
Ing. Alejandro Santiago Sevilla. 

*/

//--------------------------------LYBRARIES--------------------------------//
#include "Switch.h"
#include <DallasTemperature.h>       //Libreria Ds1820

#include <OneWire.h>
#include <dht.h>                     //DTH
#include <DallasTemperature.h>       //DS1820 LIB 


//----------------------------GLOBAL VARIABLES-----------------------------//
byte evap_fan = 0; 					//var to on and off one of the 4 fans 
byte state    = 0; 					//var to read  the state of the main switch
float  sensor_temp = 0; 			//var to read the sensor temperature 
float  temp_start  = 0; 			//var to start the refrigeration 
float  temp_stop   = 0;				//var to stop refrigeration 
int    humidity    = 0; 

int state_motors [6][4] ={{HIGH, HIGH, HIGH,  HIGH  } , // All ouputs are fliped HIGH = OFF
                         {LOW,  HIGH, HIGH,  HIGH  } , 
                         {HIGH, LOW , HIGH,  HIGH  } , 
                         {HIGH, HIGH, LOW ,  HIGH  } , 
                         {HIGH, HIGH, HIGH,   LOW } ,
                         {LOW,  LOW,  LOW,   LOW } ,   // all evap fans on
                          };




//----------------------------HARDWARE PINS--------------------------------//
const byte solenoid   = 13;          //pin para el control de la solenoide 
const byte compressor =12;           //Pin para control del compresor 
const byte motors[4] = {8,9,10,11};  //Pines controlar motores del difusor  
const byte ref_led= 5 ;              //Pin para encender el foco de la refrigeracion 
const byte def_led= 6 ;              //Pin para encender el foco deshielo 
const byte comp_led= 7 ;             //Pin para encender el foco compressor
const byte SW2_pin = 3;              //pin para leer el switchh principal
const byte SW1_pin = 2;              //pin para leer el switchh principal


//------------------------------CONSTUCTORS -------------------------------//
Switch SW1_state = Switch(SW1_pin, INPUT, HIGH);  //Refrigeration On instance
Switch SW2_state = Switch(SW2_pin, INPUT, HIGH);  //Defrost On instance 

dht DHT;        			                     //constructor del objeto DTH11
#define DHT11_PIN 5         			         // Pin sensor DTH

#define ONE_WIRE_BUS 2               			//Pin for one wire bus 
OneWire oneWire(ONE_WIRE_BUS);       			//define bus for com protocol 
DallasTemperature sensors(&oneWire); 			//Pass our oneWire reference to DT
DeviceAddress insideThermometer;     			//arrays to hold device address


//---------------------------GLOBAL VARIABLES -----------------------------//
void setup() {
	Serial.begin(9600);
	Serial.println("Starts program"); 
		pinMode(solenoid,   OUTPUT);
		pinMode(compressor, OUTPUT);
		pinMode(ref_led,	OUTPUT);
		pinMode(def_led,	OUTPUT);
		
		for(byte a; a < 4; a++){
			pinMode(motors[a], OUTPUT);

//  we dont inizialited the outputs because will changue the state and 
//wil turn on and off quickly the relays. 
}


}


//================================VOID LOOP================================// 

void loop() {

sensors.requestTemperatures(); 			// request the temperature from sensor 
printTemperature(insideThermometer);	// print the data on variable 


SW1_state.poll();          //This cheks refrigeration state  
SW2_state.poll();         // cheks defrost state  

	if(SW1_state.on()) 							state = 1; 	
	if(SW2_state.on()) 							state = 2;
	if(! SW1_state.on() && ! SW2_state.on()) 	state = 3; 
	else 		 								state = 4; 	
						// This will enter a subrutine to 
						//clean noise or restart program 

switch (state) {
    case 1: refrigerationON(); 
            break;
    
    case 2: defrostON(); 
            break;
    
    case 3:  allOff(); 
      		break;
    
    case 4: noiseOff(); 
    		break;

    default: allOff(); 
      
}
}

//===============================SUB ROUTINES===============================//

void refrigerationON(){
/* This fuction will turn on the compressor, and all the fans of the evap, 
once the set temperature has been reached, the sistem will leave just one 
fan running, alternating the runing fan between cycles					*/

if (evap_fan = 4) evap_fan = 0; 				//reboot the cycle of fans 
												//keeping the cycle from 0 to 3
												//(0,1,2,3) to use the fans array

	if (sensor_temp >= temp_start) {
		digitalWrite(compressor, LOW);			//turn on compressor 
		digitalWrite(comp_led, 	 LOW); 			//turn on comp led 
		digitalWrite(solenoid, 	 LOW);			//turn  on solenoid valve 
	
		for( byte b; b < 4 ; b++){				//turn all the 4 fans on 
			b = b-1; 
			digitalWrite(motors[b], state_motors[5][b]);
		}
	}

	if (sensor_temp => temp_stop){
		if( evap_fan > 4) evap_fan = 0;			//this will keep the arrays from
												//start and stop out of the 0 an 5
												//keeping just one fun on. 

		digitalWrite(compressor, HIGH);			//turn off compressor 
		digitalWrite(comp_led, 	 HIGH); 		//turn off comp led 
		digitalWrite(solenoid, 	 HIGH);			//turn off solenoid valve 
	
		for( byte b; b <= 4 ; b++){				//turn just one of the fans on  
			digitalWrite(motors[b], state_motors[evap_fan][b]);
		}


	}	




} 



void defrostON(){
/* this enable the defrost mode could be call by 
manual mode or clock time 						*/

	Serial.println(F("Defrost Mode")); 
	digitalWrite(compressor,  	HIGH );
	digitalWrite(solenoid,		HIGH );
	digitalWrite(ref_led,  		HIGH );
	digitalWrite(comp_led, 		HIGH);
	digitalWrite(def_led, 		LOW);

	for (byte b; b < 4; b++){
		digitalWrite(motors[b], LOW);
	}
}

Aaaaa

Les dejo este videin de lo que es el promedio movil... solo para comprension.

ALexLPD, crece tu trabajo por lo visto. Te felicito por los avances.

La duda como el titulo lo indica, es que tanto me conviene ponerle un control PID a pesar de que no puedo variar la capacidad de la refrigeracion, ya que este compresor y sus ventiladores no son inverter ni DC... Ya he visto una libreria que hace muy sencillo implementar el PID.

El tema del PID es fabuloso cuando se danta todas las condiciones para poder usarlo.
Primero establezcamos que tienes los elementos para hacerlo.
EL PID Proporcional Integral Diferencial es un sistema que tiene una planta (tu sistema de refrigeración) un sensor (supongo que alguno que mide temperatura) y basicamente tu estableces un setpoint y el PID intentará minimizar el error presente entre setpoint y valor del sensor en todo momento.
Para ello debe poder hacer AJUSTES sutiles tal vez a traves de un elemento de control. Cual es tu elemento de control? El compresor? Si fuera el compresor, entonces prediendo y apagando el compresor no vas a poder lograr un control PID.
Como no quiero divagar, esperaré a que respondas como controlas la temperatura (si es que estoy bien ubicado con tu variable de control).

Saludos!

Si efectivamemte mi variable de control es la temperatura y efectivamenteel compresor es el encargado de bajarla, como mencionas de momento el compresor solo tiene dos estados o encendido o apagado, nada mas y solo funciona al 100 de su capacidad.

en este caso podrías hacer un control tipo fuzzy, yo he obtenido muy buenos resultados con el en hornos en los que se requería un bajo coste (hornos de gas por ejemplo en que el coste entre una válvula todo o nada (que ya existía en la instalación) y una válvula de control es muy grande)

Lo ideal seria que pudieras hacer una prueba de escalón para determinar la función de transferencia del sistema, lo que te evitaría tiempo de prueba y error

Puedes ampliar Go_zalo porque estaba por decirle que usara una válvula IP que regulara la presion del compresor pero me sales con Contro Fuzzy Logic y me mataste.

Tengo situaciones similares y no se como mejorar el control, puede ser de ayuda para mi tambien.
Por cierto, resolviste el tema nRF24?

Vaya ... eso del fuzzy control esta interesantisimo!

Que es una valvula IP @surbyte?

Normalmente te diria que algo asi no se puede... pero ahora que lo pienso es un viejo truco cuando la unidad es mas grande de lo que se requiere... se pone un "puente" de tubo entre la salida de alta presion y la entrada de baja presion...

Es como un resistor que limita la potencia entregada a el curto frio... Poner el tubo, una valvula operada por un servo o algo asi... podria ser posible, incluso podría ser interesarte hacer el experimento.

Gracias!

Estoy viendo un pequeño video de fuzzy logic
Aqui !

@Go_zalo.... me imagino que una prueba de transferecia a la que te refieres es a conocer el volumen de carne... y comenzar el sistema en una temperatura conocida para ver cuanto tiempo toma llegar a otra temperatura conocida...

Ahora bien... Mi set seria temperatura...

Mis reglas serian; muy frio - medio frio - tibio - medio tibio y caliente
Estas se grafican de 0 a 1 en como en el video, pero para darles una escala se usa algo como;

... muy frio digamos; 0°... caliente 8°

Y las salidas?

Gracias.
-Alex.

Las salidas serian encender el compresor y apagarlo al cabo de mas o menos tiempo en función de muy frio…caliente, después esperar un cierto tiempo (de ahí la necesidad de una función de transferencia y de una prueba de escalón) antes de volver a evaluar el estado de las entradas ya que si volvemos a evaluar antes de que la ultima corrección haya tenido efecto pasaremos de muy frío a muy caliente constantemente y si esperamos demasiado els sistema tardara mucho en llegar al SP

No ha habido manera de hacer funcionar los nRF24,

Una válvula IP es un converso de intensidad a presión, pero en este caso no veo viable desmontar el circuito de gas de refrigeración para añadir esta válvula y volver a rellenar el circuito con gas refrigerante.

Alex Lpd lo que comentas es hacer un bypass, se usa habitualmente en la industria en bombas compresores y eyectores, pero debe ser la ultima opción por que es lo enérgicamente menos rentable (aunque por ejemplo para un compresor pequeño o que no este en servicio continuamente sale mas rentable utilizar un bypass que invertir en un variador de frecuencia para el motor)

Y pregunto, si agregaras un variador de velocidad al motor del compresor, puede llegar a funcionar. No se que tipo de motor esta usando el compresor de la camara de refrigeración. Si fuera posible variarle la velocidad, tendrías control sobre el caudal de gas, y por lo tanto podrias controlar su capacidad para refrigerar.

Como lo ven Go_zalo y AlexPLD?
Solo aporto ideas. Claro que prenderlo y apagarlo es mas fácil. Yo usaría en ese caso un rele de estado sólido Crydom con la opción de cruce por cero. (no sugiero armarlo porque hablamos de algo comercial y conviene usar cosas probadas y de calidad).

Así es @Surbyte esa ha sido una idea para solucionar este rollo pero según el foro de refrigeración lo mas que podria hacer con el variador seria quitarle un 20℅ a la capacida... Ya que el compresor no viene preparado para ser usado con variador de velocidad y podria dañarse los devanados si bajamos mas de ese punto o si intentamos ir arriba del 100℅....

Ahora bien en cuanto a lo de fuzzy lógic... La función de transferencia quiero entenderá como la cantidad de frio que es depletada en algún tiempo.... Esa cantidad es conocida por que es así como se selccionan los componentes del sistema. Pero esta función no seria constante.... Por ejemplo si hago la función de transferencia con el.chiller cargado de carne recién llegada será una cosa, si la carne ya esta fría será otra cosa y si por ejemplo sobrecargan la cámara otra mas diferente... Incluso la capacidad de transferencia de frio de la unidad se ve afectada por la temperatura dentro del chiller.... A menor temperatura menor capacidad.

Me podrías mostrar un ejemplo de el horno que mencionas? Digo si no esta bajo alguna proteccion intelectual.

Si efectivamente un bypass, lo de sacarle y meterle el gas es cosa sencilla usamos un equipo para recuperar el refrigerante y dejar vacio al sistema... Pero como dices quizás no sea lo mas adecuado....

Alex.

Cambia el motor o no se puede?

Esa no se me había ocurrido.... Le preguntare al cliente aunque veo dificil q se quiera gastar unos 2000dlrs.

:disappointed_relieved:

Igual y solo se puede controlar por temperatura en este ser ahora mismo. Aunque el PID me viene perfecto para unas incubadoras de gallos q pienso hacer y vals darle una vuelta a eso de fuzzy lógica.... Hasta lavadoras venden con eso...y no tenia idea

Momento. No sabía que el motor costaba tanto.
Porque cambiar el motor es para sumarle un variador que cuesta otro tanto.
Asi que vamos paso a paso. Analicemos bien si es una solucion viable.

si la carga cambia cambia la función de transferencia, pero podrías hacer un calculo de la inercia térmica que tiene el sistema cada vez que se pone en marcha el compresor, esperas x tiempo (inferior al tiempo del ciclo) y ves que cambio ha tenido en la variable controlada, con eso te haces a la idea de la carga que tiene el congelador, mas bien de la cantidad de calor que contiene y ajustar tus parámetros para el siguiente ciclo

Eso de la inercia térmica me agrada mas... Creo q es la solución a este dilema ... Ya que si el abatimiento de la temperatura es muy rápido casi podemos parar en el setpoint....

Y si la temperatura se tarda en bajar es por que hay mas calor latente y habrá que bajar el setpoint.... Mientras mas lento mas baja el ser point... Para no haga arranques y paros muy seguidos...

Me extraña araña. El setpoint nunca jamás se cambia a menos que busques otra temperatura como setpoint.
el setpoint es tu variable a alcanzar y en función de ello gira todo el mundo. Para ello esta el PID o lo que se use como control
Los arranques y paros te deben preocupar si usas contactores pero ya entramos en el terreno de los relays de estado solido, asi que olvida ese problema. El mayor problema es si el motor del compresor se puede afectar con dichos arranques/paradas. Por ello te hablaba de un variador. Con el bajas la velocidad del motor y con ello el caudal de gas que mueve el compresor.
Pero me dijiste que no se puede con ese motor.

ahora pensando los compresores grandes (muy muy grandes) que he visto regulan el caudal estrangulando la aspiración (al revés que lo hacen las bombas estrangulando la impulsión) incluso lo he visto funcionar durante un rato con la aspiración bloqueada completamente.

Si esta técnica es viable en el circuito de refrigeración puede ser muy interesante combinarla con el paro marcha del motor es decir antes de apagarlo ir estrangulando y si llega a estar muy cerrado durante cierto tiempo sin que la temperatura suba, parar el motor.

También te podría interesar conocer la temperatura exterior de la cámara, y el tiempo que esta abierta la puerta que me imagino sera relativamente grande, con estro ya entrarías en el mundo del control avanzado (conocido como DMC) anticipándote a las perturbaciones para minimizar el error sobre la consigna

Vaya, segun yo respondí hace rato desde el teléfono… Si creo que esta es una manera eficiente de implementar algo que funcione mas adecuadamente…

Es un fenómeno observable; cuando entra mucha carne caliente el equipo incia el ciclo… se tarda mas de lo habitual en llegar a su temperatura, se detiene y luego debido a que no se ha terminado de extraer el calor latente… sube la temperatura rápidamente… por lo que vuelve a iniciar el ciclo…

Si podemos maestrear el delta de la temperatura en función al tiempo… podemos definir como bien lo mencionas una carga mayor o menor… y por lo tanto “restar” de acuerdo a esto a nuestro set point normal…

Cosa curiosa cuanto mas queremos agregar puede ser decidido por un control tipo fuzzy mejor que por un agregamiento lineal…

Aunque no he visto uno implementado para arduino… bueno uno… pero era salida de python creo y no dejaba nada leible.

Por unidad de tiempo 1 segundo es muy poco… me imagino que seria mejor entre 10 y 30 segundos… cuestión de hacer una prueba.

Me imagino que para esto se necesitaria un datalogger que guarde el encendido y apagado, el tiempo entre variaciones de temperatura… para darnos una mejor idea.

Bueno… les dejo lo poco que he pensado… corrijanme si me equivoco… esto esta muy interesante!

AlexPLD y todo esto esta implementado sobre que arduino?