• Welcome to LusoRobótica - Robótica em Português.
 

Sensor temperatura LM35DZ

Started by joaopedrocmp, 31 de March de 2012, 21:04

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

joaopedrocmp

Boas pessoal

Tenho um lm35dz,e ja vi alguns codigos e esquemas na net, mas não estou a conseguir obter valores aceitaveis.O melhor que consegui foi a 23.8º (medidos com outro termometro) ele fazia 24, até aí, tudo bem, mas ao aquecer, quando o termometro estava em 55, obtinha o valor 44 no arduino.

E para conseguir fazer isso tive que ligar assim:

lm35dz  + ----------------------- 5v
lm35dz  -  ---------2.2k  -------gnd
lm35dz  data ------------------- A0

com o seguinte código:
int potPin = 0;
float temp = 0;
long val=0;

void setup() {
Serial.begin(9600);
}

void loop(){
val = analogRead(potPin);
temp = (5*val*100/1024);   
Serial.println(temp);
delay(2000);
}


Será problema de calibração?
Como se faz isso?

CBX

retira a resistência de 2.2k, está ai a mais...

joaopedrocmp

Ja tirei, mas n da.

tenho 23 no termometro e 17 no arduino, e quando aumento a temp, fica 64, 43.

:X

senso

Altera isto:

temp = (5*val*100/1024);


Para:

temp = (5.0*val*100.0/1024.0);


Para obrigar o compilador a fazer todas as contas em virgula flutuante.
Avr fanboy

joaopedrocmp

Se fizer isso, aparece.me "0.00" em todos os resultados, independentemente do analogread.

joaopedrocmp


Njay

#6
E tens a certeza que ambos os "termómetros" estavam mesmo à mesma temperatura, ou seja, deste tempo para as temperaturas estabilizarem, etc? A única forma de garantir isso é fixar a temperatura ambiente por igual e dar-lhes tempo para a atingirem, isto mais mais que se lhe diga do que parece, as resistências térmicas dos pacotes são diferentes.

Ficas com melhor precisão se fizeres

long  temp;
temp = ( (5 * val * 100 + 512) / 1024);

Ou então como  senso disse, se quiseres ter casas decimais.

joaopedrocmp

Boas, ja  descobri o problema, não dava tempo suficiente para estabilizarem, tenho apenas uma diferença de 1 / 2 graus.

Obrigado pela dica Njay

Agora surgiu outro , neste momento tenho este codigo:

int potPin = 5;

long temp;
long val;
long temp2;

void setup() {
Serial.begin(9600);
}

void loop(){
val = analogRead(potPin);

temp = 5*val;
temp2 = temp /10.24;

Serial.print(temp);
Serial.print(" - ");
Serial.print(temp2);
Serial.print(" - ");
Serial.println(val);
delay(3000);


Tive que criar aquele temp2, porque se fizesse a conta toda junta, nao dava valores constantes, de vez em quando "saltava" 5 ou mais graus.... erros.. lol

agora, se declarar as variaveis temp como float, e puser  a casa decimal nos numeros dos calculos, apenas obtenho uma casa decimal de valor zero. Nunca muda...

Será do serial print?

Njay

É porque todas as tuas variáveis são do tipo long, que é um tipo inteiro. Para o que queres fazer, temp2 tem que ser do tipo float; como não é, após a divisão por 10.24 a parte decimal é deitada fora e a parte inteira vai então para temp2, pois este só guarda inteiros.

joaopedrocmp

sim, mas se declarar temp2 como float, vai aparecer 0.0 em todos os resultados.

Fiz uma experiencia, em que fazia:

float var = 5.5;

Serial.print (var);
delay(1000);


e no ecran aparece 5.10

:S

Njay

Dá uma olhada no Serial.xxx na doc do arduino.

joaopedrocmp

Boas

em relação a questão li que:
- podia escolher o num de casas decimais que queria assim:  Serial.println(1.23456, 2) gives "1.23"
- As float são enviadas com asci
-Não posso mostrar o valor de uma float com o Serial.write();

mas axo que nada disto me ajuda.

Se eu escrever isto : Serial.print(22.5,1);
Vai-me aparecer:  22.1

E se escrever isto:  Serial.print(22.5,5);
Aparece : 22.10000


zordlyon

Usa o Itoa e converte para String e já consegues mandar o numero como quiseres...

Cumprimentos,
André Carvalho.

Njay

Quote from: joaopedrocmp on 06 de April de 2012, 01:49
Se eu escrever isto : Serial.print(22.5,1);
Vai-me aparecer:  22.1

E se escrever isto:  Serial.print(22.5,5);
Aparece : 22.10000

Esses resultados não estão em conformidade com o que está descrito na documentação, estranho.
E se fizeres

Serial.print((float)22.5)
Serial.print((double)22.5)

o que é que obténs?

joaopedrocmp

Boas Njay:

Serial.print((float)22.5)       ------->  22.10

Serial.print((double)22.5) --------->  22.10


Boas zordlyon

Tambem posso fazer isso, mas devia estar a dar daquela maneira....