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}
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.
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.