terça-feira, maio 07, 2013

Sensor de Temperatura LM35

Vimos que a interpretação da saída do sensor de distância por ultrassom depende da temperatura ambiente. Daí me surgiu a ideia de usar um sensor de temperatura para fazer a devida correção.

O sensor LM35 que veremos aqui é, provavelmente, uma solução exagerada para isto. É um sensor de alta precisão (erro máximo de 3/4 de grau na faixa de -55 a 150° C). O modelo que uso aqui é o LM35DZ (encapsulamento TO-92, operação somente de 0 a 150° C), que você encontra no Brasil por algo em torno de R$4.



O datasheet do LM35 (que coloquei nos arquivos do blog) possui uma boa explicação do uso e alguns circuitos interessantes.

Montagem Básica

A forma mais simples de usar o LM35 é alimentá-lo com uma tensão entre 4 e 20V e medir a tensão na saída; cada 0,01V corresponde a um grau centígrado (independente da tensão de alimentação).


Esta montagem simples permite medir temperaturas de 2 a 150° C, o que é mais que suficiente para medir a temperatura ambiente na maior parte do Brasil. Se você preferir trabalhar com graus Farenheit e tem preguiça de fazer contas, existe o LM34 com saída de 0,01V para cada grau Farenheit.

Medindo Temperaturas Negativas

Se você precisar medir temperaturas negativas, o circuito abaixo permite fazê-lo, você precisará usar os modelos LM35, LM35A ou LM35C (ver detalhes dos limites no datasheet).


O datasheet apresenta outras montagens, por exemplo para situações em que é existirá um cabo grande entre o sensor e o resto do circuito.

Ligando ao Arduino

A ligação básica é trivial: ligar a alimentação e conectar a saída a uma entrada ADC. O programa abaixo é um exemplo simples de leitura da temperatura:
  1. // Teste do sensor LM35  
  2.   
  3. void setup () {  
  4.   Serial.begin (38400);  
  5.   analogReference (DEFAULT);  
  6. }  
  7.   
  8. void loop () {  
  9.   int vSensor = analogRead(A1);  
  10.   long temp = (vSensor*5000L)/1024L;  
  11.   Serial.print (vSensor);  
  12.   Serial.print (' ');  
  13.   Serial.print (temp/10);  
  14.   Serial.print (',');  
  15.   Serial.println (temp % 10);  
  16.   delay (1000);  
  17. }  
Este exemplo simples pode ser melhorado para obter uma melhor precisão. Por padrão o ADC usa como referência os 5V de alimentação do ATmega. Supondo que estamos interessados em medir temperaturas ambientes até 50° C, a tensão de saída do sensor estará entre 0 e 0,5V. Estamos, portanto, usando apenas um décimo da escala do conversor (em outras palavras, apesar do conversor gerar resultados de 0 a 1023 a temperatura lida será mapeada em um valor de 0 até 120). Podemos melhorar isto mudando a referência do ADC, por exemplo para a referência interna de 1.1V (neste caso o resultado da leitura irá variar de 0 a 465). Outra opção, que na maioria dos casos não compensa, é colocar uma referência apropriada (e de alta precisão) no pino AREF. O código abaixo usa a referência interna:
  1. // Teste do sensor LM35  
  2. // Referencia interna no ADC  
  3. void setup () {  
  4.   Serial.begin (38400);  
  5.   analogReference (INTERNAL);  
  6. }  
  7.   
  8. void loop () {  
  9.   int vSensor = analogRead(A1);  
  10.   long temp = (vSensor*11000L)/1024L;  
  11.   Serial.print (vSensor);  
  12.   Serial.print (' ');  
  13.   Serial.print (temp/100);  
  14.   Serial.print (',');  
  15.   Serial.println (temp % 100);  
  16.   delay (1000);  
  17. }  

Testes

Para fechar, um vídeo com alguns testes do sensor.




Nenhum comentário: