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:
// Teste do sensor LM35

void setup () {
  Serial.begin (38400);
  analogReference (DEFAULT);
}

void loop () {
  int vSensor = analogRead(A1);
  long temp = (vSensor*5000L)/1024L;
  Serial.print (vSensor);
  Serial.print (' ');
  Serial.print (temp/10);
  Serial.print (',');
  Serial.println (temp % 10);
  delay (1000);
}
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:
// Teste do sensor LM35
// Referencia interna no ADC
void setup () {
  Serial.begin (38400);
  analogReference (INTERNAL);
}

void loop () {
  int vSensor = analogRead(A1);
  long temp = (vSensor*11000L)/1024L;
  Serial.print (vSensor);
  Serial.print (' ');
  Serial.print (temp/100);
  Serial.print (',');
  Serial.println (temp % 100);
  delay (1000);
}

Testes

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




Nenhum comentário: