Saltar al contenido

Monitoreo de Temperatura en Horno con PIC

Hola controleros y controleras, en esta entrada aprenderemos a realizar un monitoreo de temperatura, para un horno calefactor por resistencia utilizando una interfaz gráfica en MATLAB mostrado la evolución y el comportamiento dinámico de la variable temperatura en el computador. Adicionalmente, la comunicación entre el computador y el microcontrolador PIC se hará a través de una comunicación inalámbrica por radiofrecuencia utilizando dos módulos XBEE.

Antes de comenzar con la explicación detallada y antes de mostrarte los códigos Gratuitos, te invito a que ves el 👉 curso de microcontroladores PIC Gratuito del sitio web.

Horno Eléctrico

Para el proceso de este proyecto, vamos a utilizar un horno electrico de 110VAC, de esos comerciales que podemos encontrar en nuestro hogar.

Horno electrico con PIC

Este tipo de hornos funciona con una resistencia calefactora, la idea entonces será colocar un relé de estado sólido en serie con la fase para poder regular la corriente que circula por la resistencia y de esa forma regular la temperatura.

Lectura de la Temperatura con Termocupla tipo K y PIC

El sensor de temperatura empleado en esta aplicación será un termopar tipo K, el cual estará conectado al PIC por medio de un integrado MAX6675.

Por lo tanto, la lectura de mV del sensor termopar tipo K sera interpretada por el MAX6675 y esta será enviada al microcontrolador PIC utilizando la comunicación SPI.

Si deseas conocer cómo realizar esta integración y como realizar la lectura de temperatura con el PIC, dale un vistazo a la entrada anterior:

👉

Etapa de Potencia

Para poder controlar la potencia del horno utilizando un microcontrolador PIC, se empleará un Relé de Estado Sólido.

Relé de Estado Solido con PIC

Este relé de estado sólido tendrá que tener una entrada que acepte los 5VDC del microcontrolador PIC, por lo tanto, puede ser una entrada de 3-32VDC y una salida que acepte el voltaje alterno del horno de temperatura, que para esta práctica, se tiene un horno de 110VAC, por lo tanto la salida del relé puede ser entre 24-380VAC.

Por lo tanto, el Relé de Estado sólido, recibirá en la entrada, la señal de PWM del PIC, con lo cual el relé actuará como un SWITCHE de alta velocidad abriendo y cerrando rápidamente.

PWM PIC
15. PWM

Este switcheo de alta velocidad, conseguirá regular la corriente que circula por la resistencia y por lo tanto, la energía calorífica entregada por la misma.

Comunicación inalámbrica con PIC y XBEE

Para podernos comunicar con el computador, el microcontrolador PIC hará uso de la comunicación Serial RS232, sin embargo, en lugar de realizar una comunicación por cable, haremos la comunicación por radiofrecuencia.

Dispositivo XBEE
22. Configuración XBEE (Radiofrecuencia)

Para esto sustituimos el cable, por dos módulos de radiofrecuencia XBEE, logrando así una comunicación inalámbrica entre el PIC y el computador, para poder mandar los datos de temperatura y poderlos mostrar en la interfaz gráfica de MATLAB.

Puedes ver aquí como configurar los módulos XBEE.

Interfaz Gráfica con MATLAB

La comunicación entre el PIC y Matlab, será la esencia de este proyecto donde podremos monitorear la temperatura al interior de un horno.

Por lo tanto, en MATLAB vamos a desarrollar una interfaz gráfica capaz de mostrar tanto numéricamente cuanto gráficamente el comportamiento dinámico de la temperatura a lo largo de todo el experimento.

Dicha interfaz graficará en tiempo real la evolución de la temperatura al interior del horno, los cuales están siendo sensados por el microcontrolador PIC, para esto haremos uso de la interfaz gráfica de usuario GUIDE.

Puedes ver aquí como programar la interfaz gráfica con MATLAB animada.

Esquema del Circuito de Monitoreo de Temperatura con PIC

Monitoreo de Temperatura con PIC

Código de Implementación

A continuación tienes el código de implementación para que lo descargues gratuitamente, solo debes compartir el contenido de este post con cualquiera de los siguientes tres botones, de esa manera ayudas a que más personas aprendan a hacer estos proyectos.

[sociallocker id=948]

Código en PIC C Compiler CCS C

Para descargar la librería del MAX6675 deberás hacerlo desde el post anterior: 👉  

Código en PIC usando CCS C

#include <18F4550.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES HS

#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define TC_CLK     PIN_B1  
#define TC_CS      PIN_C0 
#define TC_DATA    PIN_B0



#include "max6675.c"
#include <stdlib.h>
#include <string.h>

long deg=0;

short timeout_error;
char car[10];

char timed_getc() { 
   long timeout;
   
   timeout_error=FALSE; 
   timeout=0; 
   
   while(!kbhit()&&(++timeout<50000)) // 1/2 second 
      delay_ms(100); 

   if(kbhit()) 
      return(getc()); 
   else { 
      timeout_error=TRUE; 
      return(0); 
   } 
}

//Define la interrupción por recepción Serial
#int_RDA
void RDA_isr()
{
 int i=0,ini=0,fin=0;
 char dat[5];
 char degC[5];
 long duty;
 
 // Almacena 10 datos leidos del serial
  for(i=0;i<5;i++){
     dat[i]=getc();
     putc(dat[i]);
    }



//Busco el valor del escalon en los datos recibidos
for(i=0;i<5;i++){
  if(dat[i]=='S'){
    ini=i+1;
    i=10;
  }
 }
 for(i=ini;i<5;i++){
  if(dat[i]=='
){
    fin=i-1;
    i=10;
  }
 }
 if(ini!=0 && fin!=0){
    // salvo en degC el caracter con el escalon
    for(i=ini;i<=fin;i++){
     degC[i-ini]=dat[i];
    }
    
     deg = atol(degC); //Convierte el String en un valor numerico
     
     // valida que el escalón esté ente 0 y 300 grados celcius
     
     if(deg>600)
         deg=600;
     if(deg<0)
         deg=0;
    
        duty=deg*10/6;
    set_pwm1_duty(duty);      // set PWM del PIC
 }
}
//! 

void main() 
{ 
   
   char msg[32]; 
   delay_ms(50);      //allow oscillator to stabilise 
   setup_timer_2(t2_div_by_4,249,1);   //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
   setup_ccp1(ccp_pwm);                //Configurar modulo CCP1 en modo PWM
   set_pwm1_duty(0);                   //Dejo en cero la salida PWM
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   while(1){ 
      delay_ms(1000); 
      //sprintf(msg,"%3.2f%cC\r\n",do_everything(),0xB0); 
      sprintf(msg,"I%3.2fFI%3.2fFI%3.2fF",do_everything(),do_everything(),do_everything()); 
      printf("%s",msg); 
   } 
} 

Código en MATLAB

%% Ejemplo Monitoreo de señales en tiempo Real
function varargout=monitoreo(varargin)
parar=false;
fclose('all')
global y
fig(1)=figure('name','Monitor','menubar','none','position',[200 200 800 700],'color',[0.9 0.6 0.3])
movegui(fig(1),'center');
axe(1)=axes('parent',fig(1),'units','pixels','position',[60 80 600 550],'xlim',[0 40],'ylim',[0 200],'xgrid','on','ygrid','on')
set(get(axe(1),'XLabel'),'String','Tiempo (Seg)')
set(get(axe(1),'YLabel'),'String','Temperatura (°C)')

lin(1)=line('parent',axe(1),'xdata',[],'ydata',[],'Color','r','LineWidth',2.5);
lin(2)=line('parent',axe(1),'xdata',[],'ydata',[],'Color','k','LineWidth',2);


bot=uicontrol('parent',fig(1),'style','pushbutton','string','Detener','position',[680 50 100 50],'callback',@stop,'fontsize',11)
txbx=uicontrol('parent',fig(1),'style','pushbutton','string','Temp','position',[680 150 100 50],'callback',@texto,'fontsize',11)
    %% Funcion Pare
    function varargout=stop(hObject,evendata)
        parar=true;
        fclose(SerialP);
        delete(SerialP);
        clear SerialP;
    end
    %% funcion Graficar
   % function varargout=grafique(hObject,evendata)
        tiempo=[0];
        salida=[0];
   
        dt=1;
        limx=[0 40];
        set(axe(1),'xlim',limx);
        
        
    %% Configura el Puerto Serial
    
    SerialP=serial('COM8');
    set(SerialP,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
    set(SerialP,'StopBits',1); % se configura bit de parada a uno
    set(SerialP,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
    set(SerialP,'Parity','none'); % se configura sin paridad

    fopen(SerialP);
              
     %% Grafico
     k=5;nit = 800;
        while(~parar)
            % Lectura del Dato por Puerto Serial
            variable= (fread(SerialP,20,'uchar'));
            ini=find(variable==73); %Busca el retorno de carro (Primer dato)
            ini=ini(1)+1;
            fin=find(variable==70); %Busca operador grados (ultimo dato)
            fin= fin(find(fin>ini))-1;
            fin=fin(1);
            tempC=char(variable(ini:fin))';
            temp=str2num(tempC);
            
            set(txbx,'string',tempC);
            %Actualiza las variables del grafico
           
             tiempo=[tiempo tiempo(end)+dt];
             salida=[salida temp];
             set(lin(1),'xdata',tiempo,'ydata',salida);
             pause(dt); %% espera 0.1 seg para cada interación
             if tiempo(end)>=limx % actualizo grafica cuando llega a su limite en tiempo real
             limx=[0 limx(2)+40]
             set(axe(1),'xlim',limx) 
             end
             
             k=k+1;
             if(k==nit)
                 parar=true;
             end
        end
        parar=false;
end

[/sociallocker]

Recuerda que si deseas apoyar mi trabajo, puedes invitarme a un café y seguirme ayudando a mantener los servidores de este sitio web, es muy barato el café y contribuyes con el tiempo y esfuerzo invertidos en las clases elaboradas en el canal y pagina web: 👉Invitar a un Café a Sergio ☕️

Espero que esten muy bien y nos vemos en la próxima.