lunes, 14 de noviembre de 2016

PROYECTO: Control temperatura LM35 en PIC16F877A con LCD y teclado 4x4

Este proyecto está hecho en Lenguaje C, al final estará el proyecto completo para descargar (código + simulación)


¡Hola SkullTraper! Bienvenidos a un nuevo artículo "Publicación de un proyecto"  Donde Vamos a ver  un proyecto 100% funcional lo hemos desarrollado con unos compañeros de la Universidad en algunos 3 o 4 días tuvimos algunos líos de manejo de teclado con el PIC pero todo bien.



¿DE QUÉ TRATA EL PROYECTO? 
Mira el funcionamiento del proyecto en este vídeo ;)

El Proyecto como el título lo indica se trata de controlar temperatura con un LM35 pero más a fondo el problema planteado es el siguiente:

Se desea implementar un sistema regulador de temperatura, que adquiera y visualice en una pantalla LCD el valor de temperatura registrado por medio de un LM35, y lea por un teclado matricial valores de alarma de temperatura alta y baja. Si los valores límites son alcanzados debe mostrarse en la pantalla mensajes que así lo indiquen. En la pantalla debe mostrarse siempre la temperatura leída, y un mensaje que indique si está baja, normal o alta.


DESARROLLO COMPLETO DEL PROYECTO

Aclaro de inicio como siempre se usó MPLAB y PIC C para ejecutar archivos, además se hizo uso de librerías para LCD y el teclado es importante que no modifiques nada de las librerías salvo que seas excelente manejando C, si no mueves nada y lo haces tal cuál el proyecto te funcionará:

1. Materiales y componentes

Para este proyecto los materiales y componentes a precisión fueron los siguientes:

- x1 Programador de PICS (Pickit 2 el que usamos)
- x1 PIC16F877A
- x1 LCD 16x2
- x1 teclado matricial 4x4
- x1 fuente de voltaje, 5v está bien para trabajar.
- Jumpers o puentes de cable UTP para conexiones.
- x1 Potenciometro de 10k
- x1 LM35 para sensar la temperatura
- x1 Cristal de Cuarzo de 4MHz
- x1 Protoboard (Ahí cabe todo el proyecto)

¡Listo! con esto iniciamos el proyecto sin problema alguno.


2. Simulación Proteus
La simulación en Proteus aunque es una captura apenas, sería algo así, recuerden que al final del post dejaré el link para descargar el proyecto completo si lo desean:



3. Código completo, programar PIC 

En el proyecto completo están incluídas las librerías las cuales son "DriverTec4x4.c" y "LCD.c" no hace falta modificarlos en lo absoluto.

El código del proyecto en sí completo (Hay que tener en cuenta las librerías de teclado y LCD) es el siguiente:
#include <16F877A.h>  
#device ADC=10    
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)

#include <lcd.c>          //Librería especial
#include <DriverTec4x4.c> //Librería especial

int8 dig1,min0,dig2,min3,imprime,dig3,atencion,dig,max0,max3;
int1 detector;
int16 ayuda,temperatura,temp,Tmax,Tmin,min1,max1;


lcd_init();

void EjecuConversor(){
   setup_adc(ADC_CLOCK_INTERNAL);    // Configura el conversor
   setup_adc_ports(AN0);          // Entrada RA0 como analógica
   set_tris_A(0xFF);            // Todo el PortA como entrada
   set_adc_channel(0);            // Seleccionar un canal (en este caso Canal 0)
   delay_us(10);               // Retardo necesario entre la selección de canal y la adquisición.
}
void DescomponerDigitos(int16 Dato){
   int16 aux;
   
   Dig1= Dato/1000;
   Dig2= (Dato%1000)/100;
   aux= Dato%100;
   Dig3= aux/10;   
}
void ProcesarSenal(){
   int32 Read;
   
   Read= ayuda;
   temperatura=(100)*((Read*5.0)/1023.0)*(100);
   //temperatura=*100;
   DescomponerDigitos(temperatura);
   

   
   Dig1+= '0';
   Dig2+= '0';
   Dig3+= '0';
     
}


void ProcesarTeclado(){   // Esta función ejecuta la acción requerida por cada pulsador del teclado.
       
   switch (atencion){
      case 0:               
           imprime="X";
          
          break;
            
      case 1:               
          imprime="X";
         
            break;
      case 2:               
          imprime="X";
          break;
         
      case 3:               
         imprime="X";
          break;
      case 4:              
          imprime="3";
          dig=3;
          detector=1;
          break;
      case 5:               
          imprime="9";
          dig=9;
          detector=1;
          
          break;
      case 6:               
          imprime="6";
          dig=6;
          detector=1;
          break;
      case 7:              
          imprime="X";
          break;
      case 8:               
          imprime="2";
          dig=2;
          detector=1;
          break;
      case 9:               
          imprime="8";
          dig=8;
          detector=1;
          break;
      case 10:            
          imprime="5";
          dig=5;
          detector=1;
          break;
      case 11:            
           imprime="0";
          dig=0;
          detector=1;
         
             break;
      case 12:            
          imprime="1";
          dig=1;
          detector=1;
                   
          
          break;
      case 13:            
          imprime="7";
          dig=7;
          detector=1;
                   
          break;
      case 14:            
           imprime="4";
          dig=4;
          detector=1;
        
          break;
      case 15:            
          imprime="X";
       
   }

   if(atencion!=16){         // Si se oprimió algún pulsador se
      delay_ms(150);      // elimina rebote.
   }
}   
void VisualizarLCD(){

   lcd_gotoxy(1,2);
   lcd_putc("Temp: ");
   lcd_putc(Dig1);
   lcd_putc(Dig2);
   lcd_putc(".");
   lcd_putc(Dig3);
   lcd_putc("    ");
}

//============================EJECUCIÓN DEL PROGRAMA 

void main() {

   lcd_init();
   EjecuConversor();
   set_tris_B(0x0F);
    port_b_pullups(TRUE);
   while(TRUE){
   
lcd_gotoxy(13,1);
    lcd_putc("fHOLA USUARIO");
    lcd_gotoxy(1,2);                 
          lcd_putc("BIENVENIDO");
          delay_ms(4000);
   lcd_putc("fIngresar limites");
   lcd_putc("nTmin: ");
   
   while(TRUE){      
   atencion=LeerTeclado();
   ProcesarTeclado();
   min1=dig;
   lcd_gotoxy(7,2);
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){
      break;
      }
   }imprime=" ";
   detector=0;
   while(TRUE){
   atencion=LeerTeclado();
   ProcesarTeclado();
   min0=dig;
   lcd_gotoxy(8,2);
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){
      break;
      }
      }
   imprime="  ";
   detector=0;
      while(TRUE){
   atencion=LeerTeclado();
   ProcesarTeclado();
   min3=dig;
   lcd_gotoxy(9,2);
   lcd_putc(".");
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){
      break;
      }
      }
      
   imprime=" ";
   detector=0;
   
   Tmin=(min1*100)+(min0*10)+min3;
   
   lcd_putc("fIngresar limites");
   lcd_putc("nTmax:");
  
   while(TRUE){  
   atencion=LeerTeclado();
   ProcesarTeclado();
   max1=dig;
   lcd_gotoxy(7,2);
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){
      break;
      }
   }detector=0;   //DETECTA MI PULSACIO DE TECLA ANTES DE DAR UN SALTO AL SIGUIENTE DIGITO O TEMP
   imprime="  ";
   
   while(TRUE){
   atencion=LeerTeclado();
   ProcesarTeclado();
   max0=dig;
   lcd_gotoxy(8,2);
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){
      break;
      }
      }
      detector=0;
      imprime="  ";
      while(TRUE){
   atencion=LeerTeclado();
   ProcesarTeclado();
   max3=dig;
   lcd_gotoxy(9,2);
   lcd_putc(".");
   lcd_putc(imprime);
   delay_ms(150);
   if(detector==1){    //SI EL DETECTOR SE ACTIVA PASA AL SIGUIENTE REGISTRO LUEGO DE LEER LOS DATOS
      break;
      }
      }
    
   Tmax=(max1*100)+(max0*10)+max3;
   
   lcd_putc("fmin=");
   if(min1==0)
   {min1="0";
      }else
      {
   min1=min1+'0';
   }
   min0=min0+'0';
   lcd_putc(min1);
   lcd_putc(min0);
   if(min3==0){
   min3=" ";
   }else{
   min3=min3+'0';
   lcd_putc(".");
   }
   lcd_putc(min3);
   lcd_gotoxy(9,1);
   
   lcd_putc("max=");
      if(max1==0)
   {max1=" ";
      }else
      {
   max1=max1+'0';
   }
   max0=max0+'0';
    lcd_putc(max1);
   lcd_putc(max0);
   if(max3==0){
   max3=" ";
   }else{
   max3=max3+'0';
   lcd_putc(".");
   }
   lcd_putc(max3);
   

   
   while (true){
      delay_ms(200);
      ayuda= read_adc();         // Adquisición de la señal   
      ProcesarSenal();      // Función encargada de procesar el dato adquirido
      temp=temperatura/10;
      if(temp<=Tmin)
      {
         lcd_gotoxy(1,2);
         VisualizarLCD();
         lcd_gotoxy(13,2);
          lcd_putc("Bajo");
       }else if(temp>Tmin && temp<Tmax)  //COMPARACION BOOLEANA !!!!importante!!!!
         {
            VisualizarLCD();
            lcd_gotoxy(13,2);
            lcd_putc(" :)");
            }else if(temp>=Tmax)
            {
               lcd_gotoxy(1,2);
               VisualizarLCD();
               lcd_gotoxy(13,2);
                  lcd_putc("Alto");
               }   
               
//============INICIO MANEJO DE ERRORES
   if(Tmax==Tmin){
    lcd_gotoxy(13,1);
    lcd_putc("fLOS LIMITES NO");
    lcd_gotoxy(1,2);                 
          lcd_putc("DEBEN SER IGUAL");
          delay_ms(4000);
           lcd_gotoxy(13,1);
           lcd_putc("fINGRESE DATOS");
    lcd_gotoxy(1,2);                 
          lcd_putc("VALIDOS DE NUEVO");
          delay_ms(5000);
          break; 
           
   }
    if(Tmax<Tmin){
        lcd_gotoxy(13,1);
    lcd_putc("fTMin NO DEBE SER");
    lcd_gotoxy(1,2);                 
          lcd_putc("MAYOR QUE TMax");
          delay_ms(4000);
           lcd_gotoxy(13,1);
           lcd_putc("fINGRESE DATOS");
    lcd_gotoxy(1,2);                 
          lcd_putc("VALIDOS DE NUEVO");
          delay_ms(5000);
          break;
             
   }
    
   //=============FIN MANEJO DE ERRORES
      }
      }
}


4. Montaje final proyecto 

El montaje final no siempre es el más estético y no todos deben parecerse jajaja después de todo son proyectos un poquito apresurados pero funcionan al 100 de 100 entonces algo así a los afanes el montaje nos quedó como vemos todo en una sola protoboard:


Es todo el contenido de este proyecto si notas algún error o problema puedes comentar estamos para resolver dudas recuerda visitar nuestra tienda para adquirir nuestros productos.

https://drive.google.com/open?id=0B8xtMFpL-ixBYkhjSnpQUFFtME0


Hasta la próxima,  
Compartir:

2 comentarios:

SkullTrapers

 

CLICK AQUI PARA IR A NUESTRA TIENDA ON LINE ARDUINO, ELECTRÓNICA, COMPONENTES