LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: joaopedrocmp em 31 de Março de 2012, 21:04

Título: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 31 de Março de 2012, 21:04
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:
Código: [Seleccione]
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?
Título: Re: Sensor temperatura LM35DZ
Enviado por: CBX em 31 de Março de 2012, 21:42
retira a resistência de 2.2k, está ai a mais...
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 31 de Março de 2012, 22:11
Ja tirei, mas n da.

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

:X
Título: Re: Sensor temperatura LM35DZ
Enviado por: senso em 31 de Março de 2012, 22:16
Altera isto:
Código: [Seleccione]
temp = (5*val*100/1024);

Para:
Código: [Seleccione]
temp = (5.0*val*100.0/1024.0);

Para obrigar o compilador a fazer todas as contas em virgula flutuante.
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 31 de Março de 2012, 22:39
Se fizer isso, aparece.me "0.00" em todos os resultados, independentemente do analogread.
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 04 de Abril de 2012, 23:42
Pode ser o sensor estragado?
Título: Re: Sensor temperatura LM35DZ
Enviado por: Njay em 05 de Abril de 2012, 01:49
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.
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 05 de Abril de 2012, 17:16
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:

Código: [Seleccione]
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?
Título: Re: Sensor temperatura LM35DZ
Enviado por: Njay em 05 de Abril de 2012, 18:36
É 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.
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 05 de Abril de 2012, 19:58
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
Título: Re: Sensor temperatura LM35DZ
Enviado por: Njay em 05 de Abril de 2012, 22:06
Dá uma olhada no Serial.xxx na doc do arduino.
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 06 de Abril de 2012, 01:49
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

Título: Re: Sensor temperatura LM35DZ
Enviado por: zordlyon em 06 de Abril de 2012, 11:02
Usa o Itoa e converte para String e já consegues mandar o numero como quiseres...

Título: Re: Sensor temperatura LM35DZ
Enviado por: Njay em 06 de Abril de 2012, 12:03
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?
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 06 de Abril de 2012, 13:22
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....
Título: Re: Sensor temperatura LM35DZ
Enviado por: joaopedrocmp em 06 de Abril de 2012, 13:40
Boas outra vez,

Entretanto experimentei esta função , mas continua igual:

Código: [Seleccione]
void printDouble( double val, byte precision){
  // prints val with number of decimal places determine by precision
  // precision is a number from 0 to 6 indicating the desired decimial places
  // example: printDouble( 3.1415, 2); // prints 3.14 (two decimal places)

  Serial.print (int(val));  //prints the int part
  if( precision > 0) {
    Serial.print("."); // print the decimal point
    unsigned long frac;
    unsigned long mult = 1;
    byte padding = precision -1;
    while(precision--)
mult *=10;

    if(val >= 0)
frac = (val - int(val)) * mult;
    else
frac = (int(val)- val ) * mult;
    unsigned long frac1 = frac;
    while( frac1 /= 10 )
padding--;
    while(  padding--)
Serial.print("0");
    Serial.print(frac,DEC) ;
  }
}