domingo, 20 de novembro de 2011

Termômetro com LM35


No projeto abaixo iremos desenvolver um termômetro digital utilizando o PIC18F e o sensor de temperatura LM35.



Projeto:  Medir a temperatura ambiente e mostrá-la no display LCD.

Descrição: O projeto mede a temperatura ambiente através do sensor de temperatura LM35 e a apresenta no display de LCD.

Vantagem: O sensor de temperatura LM35 tem uma precisão de 0.5 grau celsius e em algumas faixas ele é linear.

Resumo de funcionamento do sensor LM35.

Data Sheet

O sensor de temperatura LM35 é um dispositivo que varia a sua tensão de saída conforme a variação da temperatura ambiente, sua faixa de variação é de 10mV por grau Celsius sendo assim podemos utilizar uma regra de 3 para descobrirmos a temperatura atual.




O circuito abaixo ilustra o diagrama elétrico do Kit Easy 18F com o sensor LM35.



Para que o PIC leia o sinal analógico da temperatura é necessário passá-lo pelo conversor analógico/digital, o conversor A/D deste microcontrolador tem uma resolução de 10 bits, sendo assim podemos medir um valor que tenha uma correspondência binária de até 1023.

Ex: tensão de alimentação é de 5V, então o valor máximo de medida é de 1023, e o valor minimo é 0.

Utilizando a regra de 3 para calcular a variação de temperatura na sua correspondência binária.



Sendo assim temos que escolher um canal para efetuar a medida, pois o conversor A/D deste PIC possui 13 canais para mediadas analógicas, iremos escolher somente um canal, pois estaremos medindo somente uma grandeza analógica.


A escolha do canal é feita através da biblioteca do PIC.


Código Fonte: O código fonte foi escrito na linguagem C, para o compilador C18 da microchip.
Segue o código.




/* Termômetro Digital               */
/* Rodrigo Mira de Oliveira        */
/* www.hizvale.com.br */
/* HI-Z Vale */
#include<P18F4520.h>
#include<adc.h>


// *** Bits de Configuração

        #pragma config OSC     = HS     // (8 MHz crystal)
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BORV     = 3
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
        #pragma config CPB      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
        #pragma config WRTB     = ON       // Boot Block Write Protection
        #pragma config WRTC     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
        #pragma config EBTRB    = OFF





#include "LCD8.h"

const char MSG1[] = "Temperatura";

void PrintLCD4(unsigned int data){

/*************************************************************************
Quebra numero de quatro digitos para imprimir no LCD

EX: 1024
1024/1000 = '1'
1024%1000 = 024
024/100 = '0'
024%100 = 24
24/10 = '2'
24%10 = '4'

*************************************************************************/
/*PutLCD(' ');
PutLCD((data / 1000) + 0x30);
data = data % 1000;
PutLCD((data / 100) + 0x30);*/
data = data % 100;
PutLCD((data / 10) + 0x30);
PutLCD((data % 10) + 0x30);
PutLCD(0xDF);
PutLCD('C');


}

void main (void)
{
unsigned int valor,temp;

TRISD = 0;
    TRISC = 0;

// *** Configuração do conversor A/D

OpenADC ( ADC_FOSC_16 &        // FOSC = 8MHz. Tad = 16/10M = 2.0 µS
              ADC_RIGHT_JUST &               // Resultado Justificado para direita
              ADC_2_TAD,                            // Configuração do tempo de aquisição automático.
              ADC_CH0 &                              // Seleciona o canal 0 (AN0)
              ADC_INT_OFF &                      // Desabilita Interrupção
              ADC_VREFPLUS_VDD &        // Vref+ = VCC
              ADC_VREFMINUS_VSS,        // Vref- = GND
              14);          // Habilita somente o canal AN0 como entrada analógica



OpenLCD(); // inicializa LCD



for(;;){

ConvertADC(); // inicia conversão
while(BusyADC());        // espera conversão terminar
valor = ReadADC();        // lê resultado

valor = valor * 500;                 // converte para temperatura.
temp = valor/1023;


  GotoXYLCD(2,1);        // apresenta no display
PrintLCD(MSG1);
GotoXYLCD(6,2);
PrintLCD4(temp);




}
}

Circuito no Proteus.



Este projeto foi desenvolvido no Kit Easy 18F da Hi-Z Vale, assista o vídeo

.





Adquira o módulo de expansão sensores analógicos!






Um comentário:

  1. Aonde eu posso encontrar essa biblioteca LCD8 ?
    Gostei muito do projeto e gostaria de tentar executá-lo
    Parabéns

    ResponderExcluir