Mensagem

"Sonhar mais um sonho impossível, lutar quando é fácil ceder, vencer o inimigo invencível, negar quando a regra é vender."
Miguel de Cervantes.

"Os microprocessadores RISC funcionam a partir do princípio genial de se encarregar das coisas mais fáceis e deixar todas as partes difíceis para outras pessoas resolverem."
Douglas Adams.

Sensor de Temperatura LM35 na IDE do Arduino

   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 */