Navigator

Termômetro com PIC12F675 e LM35 e comunicação serial RS-232

ThermoPIC
 


This is like deja vu all over again.
-- Yogi Berra

* Esta página está em construção *

Introdução

Este projeto tem por objetivo a construção de um termômetro digital com as seguintes características:

  • O circuito deve ser barato, simples, compacto e exato em pelo menos 0.5°C.
  • A temperatura deve ser comunicada a um PC por meio da porta serial padrão RS-232.
  • A transferência de dados deve ser feita de modo confiável.
  • O consumo deve ser baixo e a alimentação deve ser obtida da própria interface RS-232.
  • O circuito deve medir e informar continuamente, em intervalos regulares, digamos a cada segundo, a temperatura registrada.
  • O termômetro deve medir a temperatura atmosférica, mas deve permitir modificações simples tanto no hardware como no software para acomodar outros tipos de uso (por exemplo em freezers, saunas, etc).

Parece que todos os dias uma dezena de novos termômetros digitais surgem na Internet. No entanto, após realizar várias buscas, não pude encontrar nenhum projeto que atendesse simultaneamente a todos os requisitos acima.

Teoria de operação

O circuito proposto consiste dos seguintes blocos: um sensor analógico de temperatura, um amplificador/condicionador para o sinal do sensor, um microcontrolador para converter esse sinal analógico em um dado digital e acoplamento com o PC por meio de uma interface RS-232. Um diagrama exibindo esses blocos é apresentado na Figura 1.

  • Temperatura e o LM35
  • Amplificação com LM358 (Condicionamento do sinal)
  • Alimentação e o 78L05
  • Comunicação RS-232
  • CRC

O circuito

O diagrama esquemático do circuito pode ser visto na Figura 2.

A alimentação é obtida através das linhas DTR, RTS e terra da interface RS-232. A tensão positiva presente nos dois primeiros pinos varia conforme o hardware, mas seja qual for, provavelmente é superior a 5V e capaz de fornecer alguns poucos miliamperes.

Como estes sinais podem oscilar entre uma tensão positiva e outra negativa, estes foram conectados ao circuito por meio de diodos 1N4148. Um capacitor de 33uF ou mais foi usado como buffer de tensão, caso ambos os sinais transitem cortando a alimentação momentaneamente.

A tensão máxima para o PIC12F675 é 5.5V e a mínima para o sensor LM35 é 4.0V, mas como veremos adiante, o terra deste chip será ligado em cerca de 0.5V, e portanto a alimentação para o sensor não pode ser menor do que 4.5V. Isso nos deixa praticamente nos obriga a trabalhar com uma tensão regulada de 5V, o que é feito por um regulador miniatura 78L05.

Para que o sinal serial seja corretamente detectado pelo PC precisamos de uma alimentação negativa, que obtemos através da lina TX da interface RS-232. Um diodo 1N4148 assegura o correto sentido da corrente, carregando negativamente um capacitor de 10uF.

O sensor de temperatura escolhido é um LM35, por ser barato preciso e ter uma ampla faixa linear de medição que vai de -55°C a 150°C. Este CI informa a temperatura por meio de uma tensão em volts. Se a referência for a terra, então 23.5°C será apresentada na saída como 0.235V. Cada incremento de 0.1°C representa um incremento de 1mV na tensão.

Temperaturas negativas não são muito comuns na maior parte do Brasil mas estas podem ocorrer. Uma outra possibilidade seria poder usar este circuito em geladeiras, freezers e outras câmaras frias, onde a temperatura rotineiramente vai abaixo dos 10 graus negativos.

Para poder registrar essas temperaturas, devemos deslocar a referência do sensor para cima. Escolhemos arbitrariamente deslocar de 0.450V, ligando o terra do LM35 a esta tensão. Com isto, 0°C será lido como 0.450V, -10°C como 0.350, etc.

Desse modo, a temperatura -46.8°C será registrada como 0V, e 0°C com 0.468V. A escala do LM35 vai de -55°C a 150°C, mais do que o suficiente para este projeto. De fato, por razões que serão apresentadas mais adiante, nossa escala vai de -46.8°C a 55.7°C.

Como a mínima tensão de referência possível para o PIC escolhido é de 2.1V, e este tem resolução de 10 bits (ou seja, sua escala de 0 a 2.1V está dividida em 1024 pedaços), sua resolução mínima é de 2.05mV. Isto é suficiente para medir temperaturas de 0.2 em 0.2°C, mas não é suficiente para a resolução do LM35.

Além disso, 2.1V representaria 163.27°C, bem acima da mais alta temperatura já registrada na superfície da terra (ver trivia) e também além do fim da escala do LM35. Para tirari pleno proveito da resolução desse componente, será preciso amplificar o sinal.

Mas amplificar de quanto? Escolhendo a tensão de referência de 2.5V, que é muito fácil de criar com apenas dois resistores ou usando uma fonte de referência como o LM336-2.5, temos 2.5V/1023=2.44mV. Portanto, para casar perfeitamente as variações do LM35 com as possíveis valores de amostragem do conversor A/D, basta amplificarmos seu sinal 2.44 vezes.

Essa amplificação pode ser feita convenientemente pelo amplificador operacional LM358. Para que o ganho se aproxime de 2.44, escolhemos um resistor de 33K e outro de 23K, obtendo um ganho de (33+23)/23 = 2.434782609 que é bastante próximo de 2.44. O resistor de 23K é de fato um de 22K e outro de 1K.

Substituindo o resistor de 1K por um trimpot multivoltas, é possível ajustar mais precisamente o ganho em 2.44. No entanto, neste projeto decidimos deixar esse ajuste por conta do software. A contrapartida é que o ganho precisa ser medido cuidadosamente com um multímetro.

No meu projeto, determinei o ganho do meu amplificador ligando a entrada do LM358 a um trimpot multivoltas de 50K, com uma extremidade ligada a 5V e outra à terra. Em seguida, ajustei o trimpot até que a tensão de 0.5V fosse exatamente medida na entrada (para isso, usei um voltímetro de alta impedância). Num circuito ideal, eu deveria esperar 0.5V*2.44=1.22V na saída, mas eu encontrei 1.219V, ou seja, um ganho de 1.219/0.5=2.438, o que me pareceu bastante satisfatório.

Se o valor medido pelo conversor A/D é s, a tensão em Volts na saída do LM35 dever ser t = 2.5*s/2.44/1023. Para transformar essa tensão em temperatura em graus Celsius, fazemos T = 100*(t-0.468)°C.

O topo da escala é atingido quando a tensão na entrada do conversor A/D chega a 2.5V, o que corresponde a leitura do valor s=1023. Substituindo esse valor nas fórmulas acima, resulta em T=55.7°C. A menos que você more em Al Azizia, Libia, isto deve bastar.

Para que os valores reais fossem o mais próximo possível do teórico, conectei o LM35 ao LM358 e este ao PIC por resistores de 1K, aumentando efetivamente as impedâncias de conexão. Isso tem o efeito extra de limitar a corrente pelo circuito.

A conversão A/D e a interpretação do número obtido (no intervalo de 0 a 1023) como temperatura é feita pelo PIC12F675. O sinal analógico do amplificador é conectado à entrada analógica AN2 (GPIO2).

Tendo sido determinado a temperatura, esta é codificada em NRZ (non return to zero) e enviada para a saída digital GPIO4. A tensão de referência de 2.5V foi produzida com um divisor de tensão usando dois resistores de 10K e esta foi ligada à entrada analógica AN1 (GPIO1) do PIC.

A saída serial produzida pelo pino GPIO4 foi condicionada aos níveis requeridos pela RS232 por um transístor PNP. Por sua vez, a saída deste conversor de níveis foi ligado à linha RX da RS-232.

Opcionalmente, um LED pode ser ligado à saída GPIO5 do PIC via resistor de 330 Ohms. Este tem por objetivo apenas acusar o funcionamento contínuo do circuito por meio de piscadas breves.

Dependendo do consumo do LED, pode ser proibitivo manté-lo aceso por muito tempo. Por isso fazemos o LED piscar por apenas 2.25ms (como?), o que basta para confirmar o funcionamento.

Para desenhar o esquema elétrico (Figura 2) e o layout da placa de circuito impresso (Figura 3 e Figura 3) usamos o excelente software kicad.

Os componentes

O software

Conclusões

O circuito proposto atende a todos os requisitos estabelecidos, mas ainda se pode perguntar se não é possível simplificá-lo ainda mais. A resposta é afirmativa. De fato, o próprio PIC pode ser usado como termômetro, sem mesmo necessitar do conversor A/D, mas eu ainda não tentei fazer isso.

Ao invés de usar um sensor analógico, poderiamos ter empregado um sensor digital, como o Maxim/Dallas DS18B20, dispensando todos os componentes analógicos relacionados com o sensor.

No entanto, todos os sensores desse tipo que pude encontrar custavam mais caro do que todo este projeto tal como está, sem apresentar benefícios adicionais.

É muito fácil modificar o circuito para permitir chegar ao fundo de escala de -55°C do sensor, bastando para isso que tensão terra de referência do LM35 seja maior ou igual a 0.550V (e inferior a 1V), mas devido a largura da escala isso irá reduzir a temperatura máxima para 47.5°C.

Por outro lado, baixando o terra de referência, podemos elevar a temperatura máxima até 65.5°C, mas este é um limite do software. Para superar esse limite, será preciso representar a temperatura com mais do que 16bits, ou então dividir a temperatura por 10, podendo assim chegar aos 150°C do sensor.

O comprimento da escala é determinado pela resolução do conversor A/D, pelo ganho do amplificador e pela tensão de referência escolhidas. A resolução é fixa em 10 bits, mas a tensão de referência pode variar entre 2.1V e 4.6V e o ganho também pode variar bastante, o que dá uma certa flexibilidade na determinação da escala. Neste projeto, com os valores escolhidos, temos um comprimento de 102.5°C.

Um projeto que permita não apenas medir, mas registrar as temperaturas em determinados instantes de tempo permitem realizar outras coisas além de simplesmente observar e ficar informado acerca de um valor particular dessa grandeza física em determinado local.

Por causa dos registros, torna-se possível observar também observar as variações, associar esse fenômeno a outros, como a pressão e a umidade, e até mesmo realizar previsões acerca da temperatura.

Trivia

  • Um raio, ao atingir a superfície da Terra, momentaneamente a aquece a 23700°C. Esta é provavelmente a temperatura mais quente associada a um fenômeno natural na Terra.
  • A temperatura externa do ônibus espacial durante a reentrada é de cerca de 1648°C e o chumbo ferve a 1749°C. Alguém ai quer uma sopa da pesada?
  • Temperatura atmosférica mais quente registrada na superfície da Terra: 58°C, em Al Azizia, Libia, 1922 (veja a wikipédia). Esta temperatura récorde foi medida por uma estação meteorológica, cujos termômetros oficialmente residem na sombra e a uma altura de 1.6m do solo.
  • Temperatura atmosférica mais fria registrada na superfície da Terra: -89°C, em Vostok, Antartica, 1983.
  • Zero Absoluto: -273.15°C, é o Santo Graal da Física.

Créditos

  • Agradeço a Luiz Nardelli da Prefeitura municipal de Rio do Oeste, por me trazer ao conhecimento o seu projeto de termômetro e por várias discussões a esse respeito via e-mail.
  • gputils é uma coleção de ferramentas para trabalhar com os microcontroladores PIC da Microchip
  • kicad Kicad é um programa open source (GPL) para a criação de esquemas eletrônicos e circuitos impressos. Não é tão funcional e cheio de recursos como Eagle, mas é grátis, ainda bastante poderoso e muito convivial para o usuário principiante.
  • piklab é um ambiente de desenvolvimento integrado (IDE) para aplicativos baseados nos PIC's e dsPIC's da Microchip

Referências

Fig. 1 - Diagrama de blocos - Ampliar figura (11Kb)

Fig. 2 - Esquema elétrico (versão PDF) - Ampliar figura (61Kb)

Fig. 3 - Desenho da placa, lado cobreado (versão PDF) - Ampliar figura (16Kb)

Fig. 4 - Desenho da placa, lado dos componentes (versão PDF) - Ampliar figura (29Kb)

Fig. 5 - Renderização do circuito no kicad - Ampliar figura (38Kb)

Fig. 6 - Transfer - Ampliar figura (295Kb)

Fig. 7 - Placa, lado do circuito impresso - Ampliar figura (236Kb)

Fig. 8 - Placa, lado dos componentes - Ampliar figura (216Kb)

Fig. 9 - Resultado final, vista lateral - Ampliar figura (222Kb)

Fig. 10 - Resultado final, vista superior - Ampliar figura (241Kb)

Fig. 11 - Circuito funcionando em seu local definitivo - Ampliar figura (266Kb)


Updated on  Mon Jul 15 13:27:35 2013
Copyright © 1997-2014, Waldeck Schutzer
 
http://twitter.com/ityessal http://twitter.com/liminft