You are on page 1of 6

SEL629 – Aplicações de Microprocessadores I

Prof. Responsável: Marcelo Andrade da Costa Vieira 05/06/2013

PRÁTICA 4 – Termômetro Digital
Beatriz Midena Capelli Júlio Cesar Simões Mathias no. 7243230 no. 6445481

Introdução
Essa prática tem como objetivo a implementação de um termômetro digital com os periféricos display de LCD, resistor de potência (ligado entre VCC e GND para gerar aquecimento) e sensor de temperatura LM35 do “Kit PIC Genios”. O sensor de temperatura LM35 está ligado no canal analógico 2 (RA2), e gera um valor de 10 bits (0 a 1023) nesse pino, correspondente à temperatura que está medindo. Nesse caso, a temperatura do resistor de potência. A ideia é imprimir o valor de 10 bits no LCD e utilizar um termômetro externo para medir o valor em °C correspondente – feito isso para um número suficiente de pontos, é traçada uma reta que mapeia o valor de 10 bits em um valor em °C. Encontrada a função que descreve a reta, basta adicionar no código esse cálculo dentro de um loop infinito. Dessa forma, a cada laço, o valor gerado pelo sensor é lido e a temperatura é calculada e impressa no LCD.

Esquemático
O esquemático foi feito na ferramenta Eagle e pode ser visto na figura 1.

Figura 1 - Esquemático do circuito utilizado

Gráfico dos pontos e reta aproximada . e com o “Método dos Mínimos Quadrados” aproximamos esses pontos para uma reta. geramos um gráfico de pontos. Com isso. O resultado (pontos e reta) pode ser vistos na figura 2. tivemos que fazer várias medições da temperatura utilizando um multímetro com função de termômetro enquanto o valor gerado pelo LM35 (de 10 bits) era impresso no LCD. Tabela 1 . geramos as relações descritas na tabela 2.Relações entre valores de 10 bits e valores em °C VALOR DE 10 BITS 50 52 55 57 60 63 68 72 76 80 86 90 97 VALOR EM °C 20 25 30 35 40 45 50 55 60 65 70 75 80 Com esses valores e a ferramenta Microsoft Excel. Figura 2 .Cálculos Para determinar o valor da temperatura em °C.

então. o gráfico da figura 4. ao olhar para o gráfico da figura 2. porém. . que os pontos encontrados se aproximavam mais de uma função logarítmica do que de uma reta (apesar de o esperado ser uma função linear).A função gerada pelo Excel ao aplicar o método é a seguinte: Resultados O resultado foi perto do esperado. Figura 3 . Geramos.Configurações do LCD Percebemos. e 3 configurações do LCD são mostradas na figura 3.

porém. Para reduzir os erros. LATD5_bit. LATD0_bit. LATD3_bit. Apêndice – Codificação sbit sbit sbit sbit sbit sbit sbit sbit sbit LCD_RS LCD_EN LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 at at at at at at at at at LATE2_bit. LATE1_bit. LATD1_bit. LATD2_bit. a primeira função (figura 2) foi mantida na versão final do código.Pontos e função logarítmica aproximada A função gerada pelo Excel a partir desse segundo gráfico é a seguinte: Essa segunda função se adapta melhor aos valores encontrados. para calcular uma média dos valores e chegar em um resultado melhor. LATD6_bit. posição do termômetro. seria necessário realizar várias medidas em diversas condições. . sensibilidade diferente do termômetro externo e do sensor LM35. como era esperado que encontrássemos uma reta. entre outros. LATD4_bit. pois existem vários fatores que podem influenciar nas medidas.Figura 4 . como a temperatura ambiente. Conclusões Concluímos que a prática não é muito precisa.

rb1 = 0. 0)) { portc.txt). portb.sbit LCD_D7 at LATD7_bit. Lcd_Init().11. char value[15].rb0. TRISD7_bit.49 * log(leitura) .rb6 = 0. Lcd_Cmd(_LCD_CURSOR_OFF).327. portb.rb5 = 0. // Clear display // Cursor off . como entrada = 0b00001000. TRISD2_bit. portb.03. //deslliga resistência portc. Lcd_Out(1.84. //equação logaritimica //aux = 89. //equação linear aux = 1. TRISD0_bit.rc5 = 0. int leitura. value).26 * leitura . FloattoStr(aux. TRISD5_bit. while(1) { //Aperto botão RB3 p/ (des)ligar a resistência e acender um Led if (Button(&PORTB. TRISE1_bit. char txt[] = "T = ". //apaga leds portb portb. = 0. portb. = 0. TRISD1_bit. 1. TRISD6_bit.rb4 = 0.rb0 = 0.38.rc5 = ~portc.rc5. portb. ADC_Init(). TRISD4_bit.rb7 = 0. //Iniciando LCD Lcd_Out(1. } leitura = ADC_Read(2). portb. portb."oC"). Lcd_Cmd(_LCD_CLEAR). void main() //an2 trisa trisd //rb3 trisb trisc { como entrada = 0b00000100. TRISD3_bit.1.rb2 = 0. float aux.RB0 = ~portb. sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit LCD_RS_Direction LCD_EN_Direction LCD_D0_Direction LCD_D1_Direction LCD_D2_Direction LCD_D3_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction at at at at at at at at at at TRISE2_bit. 3.

value). //atualiza valor no LCD Lcd_Out(1. value[4] = '\0'. } } .5.//limita casas decimais xx.