Go Down

Topic: [résolu]ds18b20, fonction qui renvoi la température précédente ?!! (Read 279 times) previous topic - next topic

cutprod

Bonjour a tous,
j'ai un petit souci avec une sonde de température ds18b20:
Une sonde branché sur une nano équiper d'un module de TX/RX 433mhz low cost.
J'interroge la nano a distance grâce a un signal transmis en 433mhz , celle ci exécute une fonction qui li la température et la retourne via 433mhz.
Mon problème c'est que chaque fois que je laisse passer une heure et que la température a beaucoup changé la première valeur de température lu par la fonction et l'ancienne température : si a 15 heure j'ai lu 11.2°c  a 16 heure si j'interroge la nano distante elle  me donnera 11.2°c et si de suite je ré-interoge elle me donne la vrai température 9.3°c.
Pour tester j'ai mis un pc portable avec la nano distante et debuger la température avec un "Serial.println(temperature)" le résultat et le même, le problème est dans la fonction (je crois?).
J'ai aussi tester d'appeler plusieurs fois la fonction "getTemp()" avant d'envoyer le résultat mais même problème...
Je suis un peux a court d'idée pour résoudre mon problème!
Quelqu'un pour me filer un ptit coup de main?
Merci d'avance a ceux qui voudrons m'aider.

la fonction que j'utilise:
Code: [Select]
float getTemp()
{
 //returns the temperature from one DS18S20 in DEG Celsius

 byte data[9];
 byte addr[8];

 if ( !ds.search(addr)) {
     //no more sensors on chain, reset search
     ds.reset_search();
     return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
     Serial.print("Device is not recognized");
     return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end
 
 
 byte present = ds.reset();
 ds.select(addr);  
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++) { // we need 9 bytes
   data[i] = ds.read();
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;
 
}//fin getTemp


la partie du code ou je l'appelle:
Code: [Select]
float temperature = getTemp();
               Serial.print("temperature = ");
               Serial.println(temperature);//ex: 14.06 ou 5.69

fdufnews

Je ne connais pas trop c'est capteurs car je ne les ai jamais utilisés mais je suis surpris qu'il n'y ait pas de temporisation entre le lancement de la conversion et la lecture du résultat sachant que d'après la doc du composant la conversion prend 750ms.
Tout est là: http://datasheets.maximintegrated.com/en/ds/DS18S20.pdf

D'ailleurs si tu regardes là: http://playground.arduino.cc/Learning/OneWire#.UwJyuR8nrqU il y a une temporisation d'une seconde avant la lecture.


Artouste


Merci pour ta réponse.
Je teste ça...

a resolution max (la precision ne changeant pas ) , si tu ne laisse pas de temps (1 seconde est un bon compromis)
entre demande d'acquisition et lecture du scrtachpad , tu reste sur la derniere acquisition "terminée" , sous reserve que le compo soit resté alimenté (en parasitic power ou en direct)

le bus 1W est tres agreable, mais il faut savoir que c'est un bus "tres lent"

cutprod

a priori l'erreur venait de la!
la température extérieur chez moi n'a pas beaucoup varier +- 0.7°c, mais en faisant les relevés  je ne me retrouve plus avec la dernière température relevé.
Merci a vous pour votre aide, j'attends demain pour mettre le sujet en "résolut" pour être sur.

skywodd

Bonjour,

1 seconde c'est un peu long (mais si on n'est pas pressé c'est pas bien grave).
Perso je met une temporisation de 800ms, ça marche nickel.
http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up