Projeto sensor de temperatura usando o LM35 com LCD


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pinoAnalogico = 3;
int valorAnalogico;
int temperatura;
int pinoPotenciometro = 0;
long valorPotenciometro = 0;

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
}

void loop()
{
escrever_LCD();
}

void escrever_LCD()
{
valorPotenciometro = analogRead(pinoPotenciometro);
temperatura = ler_Temperatura();

lcd.setCursor(0, 0);
lcd.print("Temperatura");
lcd.setCursor(13, 0);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperatura);
lcd.setCursor(12, 1);
}

int ler_Temperatura()
{
valorAnalogico = analogRead(pinoAnalogico);
temperatura = (5 * valorAnalogico * 100/1024);
Serial.println(temperatura);
return temperatura;
delay(1000);
}

Exibições: 418

Responder esta

Respostas a este tópico

Eu fiz assim: 

#define tempPin 0 // sensor de temperatura pin analog
int temp;
float C, F;

...

// obter dados do sensor de temperatura
temp = analogRead(tempPin);
// converter para Celsius e Faranheit
C = (5.0 * temp * 100.0)/1024.0; //convert the analog data to temperature
F = ((C * 1.8) + 32);

Verifique se você ligou os pinos do LM35 corretamente, 

 

A variavel valorAnalogico e temperatura , sendo int , só podem armazenar valores de -32767 a +32768 ,

isto inclui resultados intermediarios durante calculos feitos com estas variaveis.

no seu caso ao multiplicar tudo , antes de dividir estoura estes limites.

Experimente fazer as contas , separadamente em varias linhas , de modo que não estoure os limites,fazendo uma multiplicação , depois uma divisão e só no final faça a ultima multiplicação , ou use variaveis float , mas lembre-se que calculos com float demoram muito mais que calculos com int.

experimente fazer assim :

int ler_Temperatura()
{
valorAnalogico = analogRead(pinoAnalogico); // (ficou entre 0 e 1023)

temperatura = 25 * valorAnalogico; //(ficou entre 0 e 25575 , não estourou o limite , mas chega perto)

temperatura =( temperatura /51); //(retornou para 0 a 501 valor final do calculo )

Serial.println(temperatura);
return temperatura;
delay(1000);

}

Observe que alterei os coeficientes da conta para manter os resultados maximos o mais alto possíveis , sem estourar o limite,e manter o erro minimo.O coeficiente anterior era 500/1024=0,4882 e o novo é 0,4902 , erro de apenas 0,4% .

Abração

Enio

Enio,

Também é possivel fazer os cálculos com precisão usando variaveis do tipo long int de 4 bytes, que podem armazenar valores de 0 a 4294967295 sem a demora das variaveis do tipo float.

Um abraço

É verdade , bom lembrar !

Insisti em demonstrar como fazer com int normal ,por fins didáticos para mostrar como patrulhar a execução do codigo, com os valores possíveis e ter a CERTEZA que não vai falhar.

Usar um log int resolveria este caso , mas numa conta mais complexa , com números maiores , o problema poderia voltar a acontecer ( mais raro , mas possivel ) sem uma explicação clara , tornando a ainda mais misteriosa.

Creio que muitos problemas de bugs misteriosos que acontecem sem explicação , programas instáveis , etc vem da pouca familiaridade com este método , que avalia os valores possíveis contra as limitações impostas pela implementação da linguagem pelo compilador (tem gente que nem sabe de sua existencia)

Outro motivo é que as vezes não temos memória disponível para centenas de variáveis long int , ou não temos o tempo extra (não tão grande) no caso de execuções rápidas em interrupções etc.

Abração

Enio

 mano, qual a função do potenciometro?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço