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
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!");
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"); } }
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; }
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.