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...
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);
}
}