Control de Temperatura con 4 sensores LM35

Hola a todos de nuevo:
He realizado un control de temperatura, a mi manera con 4 sensores y de momento asta que lo monte simulado en proteus va bien.
Lo que pasa es que puedo regular la temperatura mínima y máxima de un sensor a mi antojo pero la de los otros 3 no por falta de terminales en el micro, que en este caso es un pic 16f877A, y lo que me gustaría poder hacer, pero no me aclaro como, es que con los pulsadores que tengo para mínimo y máximo poder regularlas todas, es decir que si en un pin diese una pulsación se interpretase que es para regular la temperatura de T1, con 2 pulsaciones seguidas que es para regular de T2 y asi asta 4, y hay es donde estoy encallado.
De paso me gustaría que pegaseis, los que entendéis mas de esto si el código que hecho es correcto o se puede mejorar.
gracias de antemano.

Código:
#include <16f877A.h>
#device adc=10                //Usa resolución de 10 bits.
#include <math.h>
#use delay(clock=4MHz)        //Cristal a usar de 4 Megahercios        
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#include <lcd20X4.c>       //libreria que maneja la lcd 4x20
#use fast_io(B)  
          
int8 temp1,temp2,temp3,temp4;
float A,B,C,D,a1=21,a2=28,b1=21,b2=28,c1=21,c2=28,d1=21,d2=28;

void main()
{


lcd_init(); 
lcd_gotoxy(3,1);                  //Inicia LCD
lcd_putc("CONTORL DIGITAL");
delay_ms(300);
lcd_gotoxy(3,2);
lcd_putc("DE TEMPERATURA");
delay_ms(300);
lcd_gotoxy(7,3);
lcd_putc("CON 4");
delay_ms(300);
lcd_gotoxy(3,4);    //Saca texto
lcd_putc("SENSORES LM-35");         //Saca texto
delay_ms(3000);
lcd_putc("\f");               //Limpia pantalla

      
while (TRUE){

      setup_adc (adc_clock_div_32);
      setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);   //RA0,RA1,RA2 y RA4 miden, RA3 es Vref (5V)
                                  
      setup_adc(ADC_CLOCK_INTERNAL); 
      
      set_adc_channel(0);                           //Elige canal a medir RA0
      delay_us(20);
      temp1=read_adc();                             //Hace conversión AD
      A=(temp1*0.00488758553*100);
      
      set_adc_channel(1);                           //Elige canal a medir RA1
      delay_us(20);      
      temp2=read_adc();                            //Hace la conversion AD
      B=(temp2*0.00488758553*100);
      
      set_adc_channel(2);                          //Elige canal a medir RA2
      delay_us(20);
      temp3=read_adc();                            //Hace la conversion AD
      C=(temp3*0.00488758553*100);
      
      set_adc_channel(4);                          //Elige canal a medir RA4
      delay_us(20);
      temp4=read_adc();                            //Hace la conversion AD
      D=(temp4*0.00488758553*100); 
      
      setup_adc(adc_off);                          //Apaga ADC

      lcd_gotoxy(1,1);
      printf(lcd_putc,"T1:%2.0f,Min:%2.0f,Max:%2.0f",A,a1,a2);       //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,2);
      printf(lcd_putc,"T2:%2.0f,Min:%2.0f,Max:%2.0f",B,b1,b2);       //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,3);
      printf(lcd_putc,"T3:%2.0f,Min:%2.0f,Max:%2.0f",C,c1,c2);      //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,4);
      printf(lcd_putc,"T4:%2.0f,Min:%2.0f,Max:%2.0f",D,d1,d2);       //xxx.x °C
      delay_ms (10);
      
         if(A<a1){output_high(pin_D3);}            //Si es menor a 21ºC manda un 1 al pin D3
         if(A>=a2){output_low(pin_D3);}            //Si es mayor o igual a 28 manda un 0 a D3
         if(B<b1){output_high(pin_C2);}            //Si es menor a 21ºC manda un 1 al pin C0
         if(B>=b2){output_low(pin_C2);}            //Si es mayor o igual a 28 manda un 0 a C0
         if(C<c1){output_high(pin_C1);}            //Si es menor a 21ºC manda un 1 al pin C1
         if(C>=c2){output_low(pin_C1);}            //Si es mayor o igual a 28 manda un 0 a C1
         if(D<d1){output_high(pin_C0);}            //Si es menor a 21ºC manda un 1 al pin C2
         if(D>=d2){output_low(pin_C0);}            //Si es mayor o igual a 28 manda un 0 a C2
         if(input(pin_B0)==0){a1=a1-1,A;}          //Disminuimos el valor minimo
         if(input(pin_B1)==0){a1=a1+1,A;}          //Aumentamos el valor minimo
         if(input(pin_B4)==0){a2=a2-1,A;}          //Disminuimos el valor maximo
         if(input(pin_B5)==0){a2=a2+1,A;}          //Aumentamos el valor maximo
        
}
}
 
Última edición por un moderador:
Bueno pues en vista de que nadie aportaba alguna idea de como hacerlo me puse cabezon, que otra cosa no pero de eso tengo un rato y aqui va la solucion que encontrado, a mi manera, para controlar la temperatura de 4 sensores LM-35 y a la vez mostrarlo en pantalla con temperaturas minimas y maximas que se pueden modificar al capricho de cada uno.
Espero que os guste y si es mejorable agradeceria que dieseis ideas, mas que nada por el chorro de if que hay.
Hay va el codigo compilado:

Código:
#include <16f877A.h>
#device adc=10                //Usa resolución de 10 bits.
#include <math.h>
#use delay(clock=4MHz)        //Cristal a usar de 4 Megahercios        
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <lcd20X4.c>          //libreria que maneja la lcd 4x20
#use fast_io(B)   

int8 temp1,temp2,temp3,temp4;
float A,B,C,D,a1=21,a2=28,b1=21,b2=28,c1=21,c2=28,d1=21,d2=28;

void main()
{

lcd_init(); 
lcd_gotoxy(3,1);                    //Inicia LCD
lcd_putc("CONTORL DIGITAL");
delay_ms(300);
lcd_gotoxy(3,2);
lcd_putc("DE TEMPERATURA");
delay_ms(300);
lcd_gotoxy(7,3);
lcd_putc("CON 4");
delay_ms(300);
lcd_gotoxy(3,4);                    //Saca texto
lcd_putc("SENSORES LM-35");         //Saca texto
delay_ms(3000);
lcd_putc("\f");                     //Limpia pantalla

      
while (TRUE){
      set_tris_b(0xff);
      
      setup_adc(adc_clock_div_32);
      setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);   //RA0,RA1,RA2 y RA4 miden, RA3 es Vref (5V)
                                  
      setup_adc(ADC_CLOCK_INTERNAL); 
      
      set_adc_channel(0);                           //Elige canal a medir RA0
      delay_us(20);
      temp1=read_adc();                             //Hace conversión AD
      A=(temp1*0.00488758553*100);
      
      set_adc_channel(1);                           //Elige canal a medir RA1
      delay_us(20);      
      temp2=read_adc();                            //Hace la conversion AD
      B=(temp2*0.00488758553*100);
      
      set_adc_channel(2);                          //Elige canal a medir RA2
      delay_us(20);
      temp3=read_adc();                            //Hace la conversion AD
      C=(temp3*0.00488758553*100);
      
      set_adc_channel(4);                          //Elige canal a medir RA4
      delay_us(20);
      temp4=read_adc();                            //Hace la conversion AD
      D=(temp4*0.00488758553*100); 
      
      setup_adc(adc_off);                          //Apaga ADC

      lcd_gotoxy(1,1);
      printf(lcd_putc,"T1:%2.0f,Min:%2.0f,Max:%2.0f",A,a1,a2);       //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,2);
      printf(lcd_putc,"T2:%2.0f,Min:%2.0f,Max:%2.0f",B,b1,b2);       //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,3);
      printf(lcd_putc,"T3:%2.0f,Min:%2.0f,Max:%2.0f",C,c1,c2);      //xxx.x °C
      delay_ms (10);

      lcd_gotoxy(1,4);
      printf(lcd_putc,"T4:%2.0f,Min:%2.0f,Max:%2.0f",D,d1,d2);       //xxx.x °C
      delay_ms (10);
      
         if(input(pin_B2)==0)
         {
         if(A<=a1){
               output_high(pin_D3);}            //Si es menor o igual a 21ºC manda un 1 al pin D3
         if(A>a2){
               output_low(pin_D3);}             //Si es mayor a 28 ºC manda un 0 a D3
                         
         if(input(pin_B0)==0)
         {a1=a1-1,A;}                           //Disminuimos el valor minimo de A
         if(input(pin_B1)==0)
         {a1=a1+1,A;}                           //Aumentamos el valor minimo de A
         if(input(pin_B4)==0)
         {a2=a2-1,A;}                           //Disminuimos el valor maximo de A
         if(input(pin_B5)==0)
         {a2=a2+1,A;}                           //Aumentamos el valor maximo de A
         }
         
         if(input(pin_B3)==0)
         {
         if(B<=b1){
               output_high(pin_C2);}            //Si es menor o igual a 21ºC manda un 1 al pin C2
         if(B>b2){
               output_low(pin_C2);}             //Si es mayor a 28 ºC manda un 0 a C2
               
         if(input(pin_B0)==0)
         {b1=b1-1,B;}                           //Disminuimos el valor minimo de B
         if(input(pin_B1)==0)
         {b1=b1+1,B;}                           //Aumentamos el valor minimo de B
         if(input(pin_B4)==0)
         {b2=b2-1,B;}                           //Disminuimos el valor maximo de B
         if(input(pin_B5)==0)
         {b2=b2+1,B;}                           //Aumentamos el valor maximo de B
         }
         
         if(input(pin_B6)==0)
         {
         if(C<=c1){
               output_high(pin_C1);}            //Si es menor o igual a 21ºC manda un 1 al pin C1
         if(C>c2){
               output_low(pin_C1);}             //Si es mayor a 28 ºC manda un 0 a C1
               
         if(input(pin_B0)==0)
         {c1=c1-1,C;}                           //Disminuimos el valor minimo de C
         if(input(pin_B1)==0)
         {c1=c1+1,C;}                           //Aumentamos el valor minimo de C
         if(input(pin_B4)==0)
         {c2=c2-1,C;}                           //Disminuimos el valor maximo de C
         if(input(pin_B5)==0)
         {c2=c2+1,C;}                           //Aumentamos el valor maximo de C
         }
         
         if(input(pin_B7)==0)
         {
         if(D<=d1){
               output_high(pin_C0);}            //Si es menor o igual a 21ºC manda un 1 al pin C0
         if(D>d2){
               output_low(pin_C0);}             //Si es mayor a 28 ºC manda un 0 a C0
               
         if(input(pin_B0)==0)
         {d1=d1-1,D;}                           //Disminuimos el valor minimo de D
         if(input(pin_B1)==0)
         {d1=d1+1,D;}                           //Aumentamos el valor minimo de D
         if(input(pin_B4)==0)
         {d2=d2-1,D;}                           //Disminuimos el valor maximo de D
         if(input(pin_B5)==0)
         {d2=d2+1,D;}                           //Aumentamos el valor maximo de C
         }
         
}           //Fin de While
}           //Fin de main
 
Última edición por un moderador:
Espero que os guste y si es mejorable agradeceria que dieseis ideas, mas que nada por el chorro de if que hay.
Hay va el codigo compilado:

Una mejora que yo veo, es la de utilizar sensores digitales más precisos y que no estén afectados por el ruido eléctrico. Por ejemplo los sensores de temperatura DS18B20, se puede poner en red y hacer un escaneo de temperatura.

Los LM35, hay que poner uno en cada entrada analógica, filtrar toda posibilidad de ruido y adaptar las impedancias para no obtener lecturas falsas.

Un saludo !
 
Atrás
Arriba