Você está na página 1de 6

Aprimorando um projeto - Termmetro com registro

de temperatura mnima, mxima, atual e com


arredondamento de valores lidos.
Antes de iniciar est leitura recomendo que leiam os artigos anteriores especialmente
estes:
utilizando um display de LCD, leitura de temperatura exibindo resultado no
computador e Leitura de temperatura exibindo resultado no LCD

Faa a montagem da placa como mostrado no projeto de leitura de temperatura exibida
no LCD,
este novo projeto somente implementa novas funes ao antigo e no final citar algumas
dicas para tornar este projeto algo ainda melhor, podendo at servir de base para algum
trabalho de concluso de curso tcnico.

Funo para arredondar um valor lido.


Dvidas em relao ao uso de funes? recomendo o seguinte site:
http://www.inf.pucrs.br/~pinho/LaproI/Funcoes/AulaDeFuncoes.htm (acessado no dia
05/07/2011)


Se quisermos mostrar valores dentro de uma faixa pr determinada podemos tratar os
valores lidos pelo sensor e estipular uma regra de controle.
Enviamos um valor a funo (parmetro) este valor ser do tipo float portanto
utilizaremos do seguinte estratagema para calcular somente o valor fracional.

Vamos supor que o sensor envia o seguinte valor para a funo "30,25"
Decalaramos uma varivel temporria do tipo int para armazenar o valor de 30,25
como a vriavel do tipo int ela ignorar o valor fracional.


float arredondado=30,25;
int temp_aux=0;
arredondado=30,25;
temp_aux=arredondado;


Ao lermos o valor da varivel temp_aux leremos somente 30
Ento para calcular somente o valor fracional faremos arredonda-temp_aux que seria
(30,25)-(30)=0,25



float arredondamento(float arredonda)
{
int temp_aux=0;
float temp_fracional=0;
float temp_final=0;
temp_aux=arredonda;
temp_fracional=(arredonda-temp_aux);

if (temp_fracional>=0.125 && temp_fracional<0.375)
{
temp_fracional=0.25;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}
}


O bloco IF acima testa se um valor maior ou igual a 0,125 e menor que 0,375, se as
duas condies forem satisfeitas a temperatura retornada ter um valor de 0,25
adicionada ao seu valor inteiro.


Exibindo valores mnimos e mximos no display LCD



Para exibir toda essa gama de valores precisaremos de um display de 20x4, caso voc
possua um display de somente duas linhas, altere o cdigo para exibir somente os
valores que desejar.

A grande pergunta que deve ser feita neste projeto como descobrir e manter
atualizado os valores mnimos e mximos de temperatura durante um
perodo, para realizar esse controle utilizaremos uma lgica condicional muito simples.
Primeiro devemos declarar duas variveis que iro armazenar os valores mximos e
mnimos definiremos um valor inicial para as mesmas que garantiro uma condio
inicial verdadeira.

float temp_maxima=-150; // valor muito BAIXO para condio de temp MAX
float temp_minima=300; // valor muito ALTO para condio de temp MIN


Repare que as variveis declaradas so do tipo float pois estas recebero valores reais
fracionrios dentro do lao de controle se a condio for verdadeira


Bloco responsvel por imprimir a temperatura mxima
if (temp_maxima<valor_arredondado)
{
temp_maxima=valor_arredondado;
lcd.setCursor(0,2);
lcd.print("Temp max: " );
lcd.print(temp_maxima);
lcd.write(0); // Imprime o caractere
lcd.print("C");
}


Bloco responsvel por imprimir a temperatura mnima

if (temp_minima>valor_arredondado)
{
temp_minima=valor_arredondado;
lcd.setCursor(0,3);
lcd.print("Temp min: " );
lcd.print(temp_minima);
lcd.write(0); // Imprime o caractere
lcd.print(C");
}


O funcionamento deste bloco de cdigo segue a mesma linha do anterior, temp_minima
ter um valor inicial muito alto o que garantir uma condio inicial verdadeira, todo o
controle de impresso no LCD e de posicionamento est no bloco do if para somente ser
executado quando uma condio verdadeira for detectada, garantindo maior velocidade
ao programa.

Repare que como declaramos temp_maxima com o valor de -150 a primeira condio
sempre vai ser verdadeira, por ser verdadeiros o lao do IF ser executado e a varivel
temp_mxima receber o primeiro valor enviado pelo programa e nas prximas
execues ir atualizar o valor somente se temp_maxima<valor_arredondado.


Cdigo fonte


#define sensor 0
#include <LiquidCrystal.h>
/* Biblioteca com funcoes para uso de um LCD baseado no Hitachi HD 44780 */
LiquidCrystal lcd(1, 0, 5, 4, 3, 2); // deve ser colocada fora do setup() para valer em
todos os blocos do programa
/* Define os pinos de ligao do LCD ao arduino com esta ordem LiquidCrystal(rs,
enable, d4, d5, d6, d7) */

float temp_maxima=-150; // valor muito BAIXO para condio de temp MAX
float temp_minima=300; // valor muito ALTO para condio de temp MIN

void setup()
{
//lcd.begin(cols, rows)
lcd.begin(20, 4); /* Tipo de LCD usado no meu caso de 20 colunas por 4 linhas */
lcd.setCursor(0, 0); /* O Cursor iniciara na coluna zero linha 0 */
lcd.print(" Central AVR!");

float le_temp(float x_sensor);
float arredondamento(float arredonda);
}

void loop()
{
byte a[8] =
{ B01110, B01010, B01010, B001110, B00000, B00000, B00000, B00000}; //
Caractete criado
lcd.createChar(0,a); // define nosso caractere como uma varivel
float temperatura_lida, valor_arredondado;

// Bloco responsvel por imprimir a temperatura atual
temperatura_lida=le_temp(sensor); //chama a funo le_temp() e passa como
parametro a variavel sensor
valor_arredondado = arredondamento(temperatura_lida); //chama a funo
arredondamento e passa como parametro temperatura_lida
lcd.setCursor(0,1);
lcd.print("Temp atual: " );
lcd.print(valor_arredondado);
lcd.write(0); // Imprime o caractere
lcd.print("C");

// Bloco responsavel por imprimir a temperatura maxima
if (temp_maxima<valor_arredondado)
{
temp_maxima=valor_arredondado;
lcd.setCursor(0,2);
lcd.print("Temp max: " );
lcd.print(temp_maxima);
lcd.write(0); // Imprime o caractere
lcd.print("C");
}

// Bloco responsavel por imprimir a temperatura mnima
if (temp_minima>valor_arredondado)
{
temp_minima=valor_arredondado;
lcd.setCursor(0,3);
lcd.print("Temp min: " );
lcd.print(temp_minima);
lcd.write(0); // Imprime o caractere
lcd.print("C");
}
}

float le_temp(float x_sensor)
{
float temperatura=0;
float temperatura1=0;
float temperatura2=0;
float temperatura3=0;
float temperatura4=0;
float valor_lido=0;

valor_lido=analogRead(x_sensor); /* L tensao do LM35 */
temperatura1=(valor_lido*5*100)/1024; /* Conversao do valor lido */
delay(50); /* Espera 100 mili segundos antes de prosseguir para a prxima
medio*/
valor_lido=analogRead(x_sensor); /* L tensao do LM35 */
temperatura2=(valor_lido*5*100)/1024; /* Conversao do valor lido */
delay(50); /* Espera 100 mili segundos antes de prosseguir para a prxima
medio*/
valor_lido=analogRead(x_sensor); /* L tensao do LM35 */
temperatura3=(valor_lido*5*100)/1024; /* Converso do valor lido */
delay(50); /* Espera 100 mili segundos antes de prosseguir para a prxima
medio*/
valor_lido=analogRead(x_sensor); /* L tensao do LM35 */
temperatura4=(valor_lido*5*100)/1024; /* Converso do valor lido */
temperatura=(temperatura1+temperatura2+temperatura3+temperatura4)/4;
return temperatura;
}

/* Cdigo responsvel pelo arredondamento */
float arredondamento(float arredonda)
{
int temp_aux=0;
float temp_fracional=0;
float temp_final=0;
temp_aux=arredonda;
temp_fracional=(arredonda-temp_aux);

if (temp_fracional>=0 && temp_fracional<0.125)
{
temp_fracional=0.00;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}

if (temp_fracional>=0.125 && temp_fracional<0.375)
{
temp_fracional=0.25;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}

if (temp_fracional>=0.375 && temp_fracional<0.625)
{
temp_fracional=0.50;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}

if (temp_fracional>=0.625 && temp_fracional<0.875)
{
temp_fracional=0.75;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}

if (temp_fracional>=0.875 && temp_fracional<1)
{
temp_fracional=1;
temp_final=(temp_aux+temp_fracional);
return temp_final;
}
}


Resultado final



Figura 1 - Display LCD 20x4 informando temperatura lida em um perodo.

Dicas para melhorar um projeto com termmetro.


Uma funo adicional de fcil aplicao seria instalar um buzzer no arduino e disparar
um alarme toda vez que uma temperatura pr determinada for atingida. Outra aplicao
interessante mas um pouco mais complexa seria fazer um controlador de temperatura,
onde se usaria uma resistncia para gerar calor, existem duas maneiras simples de
controlar a temperatura, a primeira seria controle ON/OFF e a segunda controle por
PWM, lembrando que o arduino possui pinos dedicados a essa funo.