Controlar nevera con un PID

Buenas noches a todos,

Primero aclarar que no soy un experto en estos temas y me estoy iniciando. Me gustaría agradecerles de ante mano por dedicarme su tiempo a ayudarme.

Voy a intentar describir de la mejor forma posible mi problema.

Estoy realizando un proyecto en el cual el objetivo o cuyo fin es crear una nevera con una placa peltier y con un controlador PID, y que este funcione en las mejores condiciones posibles. Mi proyecto no es nada del otro mundo, es una cosa sencilla pero que me ha ayudado mucho a avanzar en la programación y el uso del arduino.

Mi proyecto presenta un hardware que se compone de los siguientes elementos: A pesar que en el esquema eléctrico ponga Arduino Leonardo es Arduino UNO, 1 potenciómetro linea rotativo cuyo fin es marcar el Setpoint de la temperatura que se quiere dentro de la cámara de la nevera, 1 sensor tipo ds18b20 cuyo objetivo es marcar la temperatura de la cámara, 1 transistor bjt PNP modelo BC636 utilizado como driver para controlar 1 MOSFET tipo N modelo IRF630 conectado a una placa peltier 12V 60W (Tec1 - 12706 40x40mm), 1 ventilador, 1 disipador de calor para la placa peltier, y un display tipo I2C, 1 fuente externa de PC 500W modelo 51838 y sus correspondientes resistencias.

Mi Software lo he realizado con la libreria PID y otras, el código es el siguiente:

  #include <DallasTemperature.h>
  #include <OneWire.h>
  #include <LiquidCrystal_I2C.h>
  #include <PID_v1.h>

  //Asignación de pines
  #define PIN_SENSOR  5
  #define PIN_POTEN   A0
  #define PIN_PELTIER 4
  //dejar pendiente poner los valores de los parametros con potenciometro

  //declaracion de variables Setpoint, Input, Output
  double Setpoint, temp_sensor, senal_peltier;
  //declaracion de los parametros
  double consKp = 100.0,consKi = 0.5,consKd = 0.025;

  //creador del simbolo de grados para la lcd
  byte grados[]={0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00};

  //Definir el PID
  PID mi_nevera(&Setpoint, &senal_peltier, &temp_sensor, consKp, consKi,consKd, DIRECT); //Directamente proporcional (DIRECT)

  //Pantalla lcd. Inicia el LCD en la dirección 0x27, con 16 caracteres y 2 líneas 
  LiquidCrystal_I2C lcd(0x27, 16, 2);  

  //Pin para el sensor

  OneWire CamaraTemp(PIN_SENSOR); //Dentro del paréntesis variable declarada
  DallasTemperature Sensor(&CamaraTemp); //dentro del paréntesis nueva variable

  void setup() {
    
 //Declarar las entradas y salidas
 pinMode(PIN_SENSOR, INPUT); //Entrada porque se encarga de medir temperatura cámara
 pinMode(PIN_POTEN, INPUT); //Entrada se encarga de marcar consigna de la cámara
 pinMode(PIN_PELTIER, OUTPUT); //Salida de peltier encendida o apagada dependiendo de la condición

//Espacio por si en caso se quisiera poner los parámetros por potenciometros

//Se inicia la comunicacion serie
  Serial.begin(9600);

//Se inicia las librerias del sensor de temperatura
  Sensor.begin();

//Se inicia el lcd
  lcd.begin();
  lcd.backlight(); //Para que se encienda el fondo de la pantalla

  //Se añade el caracter para que se vea en el lcd
  lcd.createChar(0, grados);

  //Pendiente en caso de querer leer los valores de los parametros

  //Designar unos limites para la señal de salida del PID (min, max)
  mi_nevera.SetOutputLimits(0.0, 100.0);

  //Iniciamos el PID en automatico
  mi_nevera.SetMode(AUTOMATIC);
}

  void loop() {

  //Leer la temperatura del potenciometro (Setpoint)

  Setpoint = 5.0+(25.0/1024.0)*float(analogRead(A0));
 
  //Enviar comandos para obtener la temperatura
  Sensor.requestTemperatures();
  
  //Guarda los valores en esta direccion
  temp_sensor = Sensor.getTempCByIndex(0);

  //Condición para el encendido o apagado de la Peltier 

 if (senal_peltier <30.0) digitalWrite (PIN_PELTIER, LOW); //Si es menor de 30.0 apaga la Peltier
 else if (senal_peltier>80.0) digitalWrite (PIN_PELTIER, HIGH); //Si es mayor de 80.0 enciende la Peltier

 //Display sensor de temperatura

  lcd.setCursor(0,1);
  lcd.print("SB:");
  lcd.print(temp_sensor,1);
  lcd.write(0); 
  lcd.print("C");

  //Display potenciometro
  lcd.setCursor(0,0);
  lcd.print("T:");
  lcd.print(Setpoint,1);
  lcd.write(0); //Escribe el signo creador en el display
  lcd.print("C");

  //Display Señal
  lcd.setCursor(9,0); //El 9 indica la columna y el 0 la fila
  lcd.print("S:");
  lcd.print(senal_peltier,1); //El uno quiere decir el número de decimales visibles.
  
  //senal_peltier
  Serial.println (senal_peltier); //Pantalla Serial ordenador

  //Gestiona el controlador PID
  mi_nevera.Compute();
 
}

Hasta aquí todo bien. Mi problema radica que una vez conectado todo el MOSFET se calienta como el demonio, he intentado resolverlo pero no he podido, es por ello que me dirijo a ustedes a través de este foro.

Por si les es de utilidad les dejo el esquema eléctrico (lo adjunto con una imagen), cuyo error puede estar ahí.

Un saludo, Trezano.

Modelo de peltier???
Modelo de Mosfet???

Buenas noches,

Gracias se me había pasado, ya he rectificado el post.

Un saludo, Trezano.

Definitivamente tu problema es la forma que polarizas (o eso intentas) el transistor bjt, estas haciendo que el mosfet trabaje en la zona lineal comportándose como resistencia, por lo que disipa mucha potencia.
Por cierto: ¿por que conectaste así el bjt?
Mejor usa un transistor npn y conecta lo de la siguiente manera

Mosfet-conexion-canal-n.png

dejo la fuente de la imagen pásate por allá y dale un vistazo, explica muy bien como usar un mosfet con arduino

P.D ten en cuenta que el sistema trabaja con logica inversa, es decir, cuando tu mandes un high de arduino la celula se apaga y viceversa

Mosfet-conexion-canal-n.png

@Trezano, las imagenes deben verse, consulta el apartado complementario de las normas del foro que explican como visualizar una imagen adjunta y edita tu post para que se vea dicha imagen.

Buenas tardes,

Perdona por contestarte tan tarde.

Conecté el transistor bjt así porque pensé que podría funcionar con uno tipo PNP. Ahora probaré como usted lo ha pasado, que no disponía de los materiales y hoy ya los tengo. También le echaré un ojo a la página y ya después me pondré con ello a ver si funciona.

¡Muchas gracias!

Un saludo, Trezano.

Bien cuentanos como te va, ya pudiste hacer andar la chachara? Sube fotos, siempre enchulan los post.

Saludos. -Alex.