Termómetro LCD número y barra


Aprovechando el método utilizado para mostrar la barra de progreso en el display LCD, se implementara un termómetro que mostrara la temperatura de forma numérico en el primer renglón y en modo barra en el segundo renglón.
Se utiliza como sensor el LM35DZ, el mismo nos entrega 10mV/°C, esto quiere decir que cuando medimos 1V tendremos 100°C, pero como es un medidor de temperatura ambiente, lo vamos a limitar a 40°C, lo cual la tensión máxima esperada sera de 400mV.
Utilizar el ADC como viene por defecto de 0 a 5V,  se imaginaran que no es la mejor manera, ya que el fondo de escala de nuestro medidor sera de 0,4V y quedara un 90% de resolución perdida.
Para ello la manera mas común es utilizar un amplificador operacional que nos eleve proporcionalmente esta tensión con un factor de multiplicación de 10 como para tener 5V a la salida cuando hay 500mV a la entrada, de esta forma los 400mV correspondientes a los 40°C serán 4V y asi se aprovecha la resolución del ADC.
Como podrán ver en el circuito, utilizamos el LM358 como seguidor y amplificador x10 para nuestro ADC.
El resto del circuito es solamente el microcontrolador y el LCD.
Este es un circuito que pretende dar uso a la barra gráfica del LCD, pero claramente se puede expandir como un termostato con su setpoint correspondiente, o bien cualquier otra aplicación.
Se utiliza un refresco cada 1 segundo ya que la temperatura no suele variar con mucha velocidad, pero si quieren pueden eliminar ese delay o modificarlo.



El programa funciona igual que en el post del gráfico de barras con LCD, solo que se añade el calculo para mostrar la temperatura del LM35 luego de multiplicarse por 10.
En la función MAP donde definimos los limites de la barra, tenemos como origen de 0 a 40, ya que sera la representación de temperatura que nos interesa, pero podremos modificarlo, si quisiéramos que mida de 0 a 60, deberíamos cambiar ese 40 por un 60, luego como destino de la barra sera el mismo de siempre de 0 a 16 ya que son 16 barras en el LCD.

#include<16f883.h>
#device adc=10
#use delay(int=4000000)
#include<LCD.C> 
double map(float valor, float entradaMin, 
           float entradaMax, float salidaMin, 
           float salidaMax){
   return ((((valor-entradaMin)*
             (salidaMax-salidaMin))/
             (entradaMax-entradaMin))+salidaMin);
}  
void main(){
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   lcd_init();
   int16 salida=0, leeAdc=0, salida_A=0, i=0;
   float temp=0;
   while(true){
      set_adc_channel(0);
      delay_us(10);
      leeAdc = read_adc();
      temp = (leeADC*5.0/1023.0)*10;
      salida = map(temp, 0, 40, 0, 16);
      delay_ms(1000);
      lcd_gotoxy(12,1);
      lcd_putc(0xDF);
      lcd_gotoxy(13,1);
      lcd_putc(0x43);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Temp: %2.1f",temp);
      for(i=1;i<salida+1;i++){
         lcd_gotoxy(i,2);
         lcd_putc(0xFF);
      }
      if(salida_A<salida){
         lcd_gotoxy(salida,2);
         lcd_putc(0xFF);
      }
      if(salida_A>salida){
         lcd_gotoxy(salida+1,2);
         lcd_putc(0x20);
      }
      salida_A = salida;
   }
}


No hay comentarios.:

Publicar un comentario