Pages: [1]   Go Down
Author Topic: [résolu]ds18b20, fonction qui renvoi la température précédente ?!!  (Read 176 times)
0 Members and 1 Guest are viewing this topic.
Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
float temperature = getTemp();
                Serial.print("temperature = ");
                Serial.println(temperature);//ex: 14.06 ou 5.69
« Last Edit: February 19, 2014, 02:47:45 pm by cutprod » Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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"
Logged

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: