SOBRE

LightBlog
Responsive Ads Here

domingo, 2 de junho de 2013

#10 Lendo temperatura com LM35




Neste experimento vamos ver mais uma forma de interação com o ambiente, através da análise de temperatura. Ao término do experimento será possível receber valores de temperatura na tela do computador através da porta Serial e do Serial Monitor da própria IDE do Arduino. A imagem abaixo lista os componentes necessários para realizar o experimento.



Para poder captar a temperatura ambiente usaremos um CI chamado de LM35.


Olhando de frente para a escrita do CI, ou a parte plana dele, temos os 3 pinos, da esquerda para direita:
1 - Alimentação (Entre 2.7 e 5.5 volts)
2 - Saída analógica (Valor analógico a ser interpretado pelo arduino)
3 - Terra (0v)

Para interpretar o sinal vindo do LM35 você irá precisar entender um pouco sobre Entrada Analógica, se ainda não conferiu o artigo sobre isso clique aqui .
Se quiser mais informações sobre o LM35 acesse o datasheet clicando aqui.

A imagem abaixo mostra como os componentes devem ser ligados na protoboard. É importante que os componentes sejam ligados ao Arduino quando ele estiver desligado para não correr o risco de danificar a placa.



Após ligados os componentes conforme a imagem acima é preciso programar. 
Ligue o Arduino no computador, abra a interface de desenvolvimento e cole o código abaixo. 
Abaixo do código segue uma breve explicação.

const int LM35 = A0; // Pino Analogico onde vai ser ligado ao pino 2 do LM35
const int REFRESH_RATE = 2000;  //Tempo de atualização entre as leituras em ms
const float CELSIUS_BASE = 0.4887585532746823069403714565; //Base de conversão para Graus Celsius ((5/1023) * 100)
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("Temperatura: ");
  Serial.println(readTemperature());
  delay(REFRESH_RATE);
}

float readTemperature(){
  return (analogRead(LM35) * CELSIUS_BASE); 
}

Explicação:

Nas primeira 3 linhas definimos constantes, 

LM35 -> é o Pino onde vamos colocar o sensor analógico do sensor (A0)
REFRESH_RATE -> Tempo de atualização entre uma leitura e outra, em milisegundos
CELSIUS_BASE -> Taxa de conversão para usar ao transformar a temperatura em digital. Esta variavel e FLOAT justamente por estarmos trabalhando com um número mais preciso.

Esta constante é definida ao calcularmos a base do de conversão analógica do arduino que é 10 bits, mais uma vez lembrando que quem não leu o artigo sobre entrada analógica pode ter a explicação completa acessando o post.


Constante é definida então por: {[5 / (2^10)] * 100}



Dentro da Void loop, simplesmente enviamos para serial o valor retornado pela função readTemperature,
que é um função que retorna o valor da temperatura, esta função possui o cálculo que pega o valor analógico do pino, do LM35 e multiplica pela constante de conversão, acima explicada, gerando um valor final em graus celsius.

Para visualizar o valor recebido pelo potenciômetro é necessário abrir o Serial Monitor. 
Clique no botão  no menu superior direito e irá abrir uma tela parecido com a mostrada abaixo. 





Aperfeiçoando a leitura

Podemos também, com algumas práticas de programação, aperfeiçoar a leitura mostrando um valor mais preciso, baseado em uma técnica clássica de programação chamada buffer de leitura.

A técnica consiste em ler muitas vezes o valor de um sensor, ou de uma variável, em um curto espaço de tempo, e depois criar uma média deste valor. 

Pensando um pouco perceberemos que o próprio sensor tem margens de erro na hora de transmitir uma informação, e que a temperatura é algo extremamente instável, ao ar livre por exemplo, uma leve corrente de ar pode lhe dar a falsa impressão de uma mudança drástica de temperatura, o buffer tende a corrigir estes tipos de erros, criando uma média mais precisa assim diminuindo a margem de erro do sensor.

Veja o código abaixo dos 2 tipos de leitura sendo comparados, com e sem buffer, será que da muita diferença?
const int LM35 = A0; // Pino Analogico onde vai ser ligado ao pino 2 do LM35
const int BUFFER_SIZE = 1000; //Quantidade de vezes que vai ler para cria a média
const int REFRESH_RATE = 2000; //Tempo de atualização entre as leituras em ms
const float CELSIUS_BASE = 0.4887585532746823069403714565; //Base de conversão para Graus Celsius ((5/1023) * 100)
void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop() {
  Serial.print("Temperatura: ");
  Serial.println(readTemperature());
  Serial.print("Temperatura com buffer: ");
  Serial.println(readTemperatureWithBuffer());
  delay(REFRESH_RATE);
}


float readTemperature(){
  return (analogRead(LM35) * CELSIUS_BASE);
}

float readTemperatureWithBuffer(){
  float buffer = 0;
  for (int i = 0; i < BUFFER_SIZE; i++){
      buffer += analogRead(LM35);
  }
  return ((buffer/BUFFER_SIZE) * CELSIUS_BASE);
}


Explicação:

Criamos mais uma constante chamada BUFFER_SIZE, que vai ser usada para determinar quantas vezes queremos ler o sensor antes de criar a média final, isso seria a nossa 'resolução', quanto mais melhor, MAS ao mesmo tempo existe uma defasagem, pois quanto mais vezes lermos a variável para criar o loop, maior vai ser o número a ser tratado, mais tempo vai ser gasto no processamento, isso sem controle pode simplesmente travar o seu arduino, então tome cuidado.

Como puderam perceber a diferênça não passa de 0,5 na maioria dos casos,  e em boa parte deles também é a mesma, o que nos informa que o ambiente testado é estável, em ambientes abertos, com vento, esta taxa de variação entre a leitura com buffer e sem buffer é bem maior.
Mesmo sendo pequena a diferença, em alguns ambientes é crucial para a aplicação que a precisão seja a maior possível.