Tenho visto algumas coisas bizarras relativas a programação do LM35 na IDE do Arduino. Então, resolvi apresentar um código mais elegantes aos robistas.
O primeiro ponto é a tensão de referência que deve ser empregada pelo conversor AD do ATmega328 (o microcontrolador do Arduino), que deve ser ajustada para 1,1V e não 5V como visto por aí. Melhorando a resolução da conversão significativamente.
O segundo ponto é a equação de transformação que deve converter o número digital puro do AD para o valor de temperatura, utilizar ponto flutuante é deveras péssimo em termos de desempenho e consumo de memória.
Os detalhes técnicos podem ser encontrados no meu livro AVR e Arduino: Técnicas de Projeto, Seção 19.4, para aqueles que apenas gostariam de usar o código, segue comentado.
//LEITURA DE TEMPERATURA COM O LM35
//sensor no pino A4
unsigned int valor_temp=0;
void setup()
{
Serial.begin(9600);
//definicao da tensão de final de escala para a conversao (1.1V)
analogReference(INTERNAL);
}
void loop()
{
//equacao de conversao otimizada
valor_temp = analogRead(A4) + analogRead(A4)*19/256;
Serial.print("Temperatura = ");
Serial.print(valor_temp/10);
Serial.print(".");
Serial.print(valor_temp%10);
Serial.write(186);
Serial.println("C");
delay(1000);
}
/* O LM35 apresenta uma saída de 10mV/°C. O valor de leitura do AD é dado por ADC = Vin*1024/Vref, como Vref = 1,1V, para converter o valor do AD para graus Celsius, é necessário multiplicar o valor ADC por 1100/1024 (considerando uma casa decimal antes da vírgula). Utilizando a simplificação matemática e mantendo a variável temperatura com 16 bits, resulta: 1100/1024 = 1 + 19/256 */