Go Down

Topic: lire ds18b20 , temperature negative. (Read 262 times) previous topic - next topic

jean81

Bonjour,

Quelle commande faut-il utiliser pour lire des températures négatives avec une sonde ds18b20 ?



Merci.

lesept

Voir ici. Extraits :

Quote
Comme tout périphérique 1-Wire, le DS18B20 contient un "scratchpad" qui est une sorte de mémoire tampon sécurisée ou l'on peut venir lire et / ou écrire des données. C'est dans cette mémoire qu'on vient lire les données de mesures et écrire les informations de configuration du capteur.
Quote
Le scratchpad du capteur DS12B20 est divisé en quatre parties :
  • Le résultat de la dernière mesure de température (deux octets),
  • Deux octets à usages divers (le capteur dispose d'un mode "alarme", mais cela ne sera pas traité dans ce tutoriel),
  • Le registre de configuration du capteur,
  • Une somme de contrôle.
Ce qui nous intéresse, ce sont les deux premiers octets qui contiennent le résultat de la mesure de température.
Quote
Les deux octets forment un nombre flottant sur 11 bits, plus le signe (+ / -).

Pour avoir la température en degré Celsius il faut appliquer la formule suivante : temperature_celsius = (int16_t) ((MSB << 8 ) + LSB) * 0.0625.

N.B. A noter que le calcul doit être réalisé avec des nombres signés (pouvant être négatifs ou positifs), faute de quoi, les températures négatives créeront des problèmes.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

jean81

Quelqu'un pourrait-il me donner le code à appliquer pour récupérer la température négative sur cette sonde .

Merci

Jambe

C'est la même que pour les températures positives

bricoleau

Ben tu as de la chance, j'ai pile ce qu'il te faut.
Mais il faut te taper l'anecdote qui va avec :

Il y a quelques semaines, à la maison, nous avons sorti un bac de glace vanille du congélateur et là, surprise, il était dur comme un caillou.
Mais dur de chez dur comme je n'avais jamais vu.
La cuillère spéciale à glace, trempée dans de l'eau bouillante, ne s'y enfonçait pas d'un millimètre.

A l'évidence, le thermostat du congélateur était parti en vrille, et celui-ci refroidissait à n'en plus finir.

Ni une, ni deux, j'attrape une arduino uno, un lcd de base, une sonde ds18b20 étanche avec cable, et hop je torche vite fait le programme ci-dessous.
Code: [Select]
#include <LiquidCrystal.h>
#include <OneWire.h>

const byte d4 = 4, d5 = 5, d6 = 6, d7 = 7, rs = 8, en = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

OneWire  ds(3);
byte addr[8];

void setup() {
  Serial.begin(9600);
  Serial.println("Debut programme");

  lcd.begin(16, 2);
  lcd.setCursor(2, 0);
  lcd.print("Temperature");

  if (ds.search(addr)) {
    Serial.println("Sonde trouvee");
    if (OneWire::crc8(addr, 7) == addr[7]) {
      Serial.println("Identifiant valide");
    } else {
      Serial.println("Identifiant invalide");
    }
  } else {
    Serial.println("Sonde non trouvee");
  }
}

void loop() {
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);
  delay(1000);
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  byte data[12];
  for (byte  i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  int16_t raw = (data[1] << 8) | data[0];
  float   celsius = (float)raw / 16.0;
  Serial.println(celsius, 2);

  char signe = '+';
  if (raw < 0) {
    signe = '-';
    raw = 0 - raw;
  }
  byte degres = raw >> 4;
  byte dixiemes = (((raw & 15) * 10) + 8) >> 4;
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(5, 1);
  lcd.print(signe);
  lcd.print(degres);
  lcd.print(',');
  lcd.print(dixiemes);
  delay(1000);
}


enfin "hop", il m'a quand même fallu 45 minutes pour pondre tout ça, logiciel + assemblage du montage.
Pendant ce temps la glace s'est réchauffée donc après ça allait pour la manger :)

Verdict : -34°2 dans le congélo, au lieu des -18 attendus.

Au final, j'ai juste débranché / rebranché le congélo et le thermostat s'est remis à fonctionner normalement.

Et pour m'achever, ma femme m'a fait remarquer à juste titre que j'aurais pu commencer par ça, au lieu de faire le malin avec mes bidouilles  :smiley-evil:

Après plusieurs jours de surveillance et de fonctionnement normal, j'ai désassemblé le montage.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

jean81

A bricoleau


Avant les remerciements qu'il se doit, tu vas te taper mon anecdote ! lol

Moi c'est l'inverse température trop haute et ma crème glacé à la vanille en état liquide !

A déguster avec une paille ! lol


Je te remercie pour ton aide, car là moi plouf !!

Encore merci.

jean81

#include <OneWire.h>
const byte BROCHE_ONEWIRE = 5;
const byte SENSOR_ADDRESS_1[] = { 0x28, 0xFF, 0x09, 0x48, 0x30, 0x17, 0x03, 0xF9 };
const byte SENSOR_ADDRESS_2[] = { 0x28, 0xFF, 0xC3, 0x44, 0x30, 0x17, 0x03, 0x74 };
OneWire ds(BROCHE_ONEWIRE);
 float getTemperature(const byte addr[]) {
  byte data[9];
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);
  delay(800);
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for (byte i = 0; i < 9; i++) {
    data = ds.read();
  }
  return ((data[1] << 8) | data[0]) * 0.0625;
}


--------------------debut  boucle loop--------

float temperature[3];
temperature[0] = getTemperature(SENSOR_ADDRESS_1);
temperature[1] = getTemperature(SENSOR_ADDRESS_2);




Bricoleau,

Extrait de mon code.

Comment intégrer ton code ? (calcul partie négative)

J'essaye mais je cale !

Merci

68tjs

Code entre balise code s'il te plait !
C'est exigé sur ce forum.

Voir le message épinglé "Faire un nouveau sujet avec les balises"
Tant que y sera tu pourra lire aussi "Règles du forum francophone" il n'y a pas que des règles il y a aussi des conseils pour donner les bons renseignements qui permettent d'avoir une réponse adaptée dans les meilleurs délais.

Merci.

jean81

Ok pardon,

Je refais un nouveau message car je sais pas comment modifier mon erreur !

Si un modo peut effacer ce "topic" afin de ne pas polluer le forum.

Merci

lesept

Pas besoin, il suffit que tu édites ton message #6 (option modify) puis tu sélectionnes ton code et tu appuies sur l'icone </>
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up