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);
}
Tags:
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por