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
-
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?
-
retira a resistência de 2.2k, está ai a mais...
-
Ja tirei, mas n da.
tenho 23 no termometro e 17 no arduino, e quando aumento a temp, fica 64, 43.
:X
-
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.
-
Se fizer isso, aparece.me "0.00" em todos os resultados, independentemente do analogread.
-
Pode ser o sensor estragado?
-
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.
-
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?
-
É 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.
-
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
-
Dá uma olhada no Serial.xxx na doc do arduino.
-
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
-
Usa o Itoa e converte para String e já consegues mandar o numero como quiseres...
-
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?
-
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....
-
Boas outra vez,
Entretanto experimentei esta função , mas continua igual:
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) ;
}
}