DS18B20 - incompréhension de la datasheet [résolu]

Bonjour,

Pour certaines raisons, je ne veux pas utiliser la librairie DallasTemperature. Je dois donc implémenter moi même la prise de température du capteur DS18B20.

Cependant, j'ai une grosse incompréhension après la lecture de forums et de la datasheet.

A partir de maintenant, je suppose que je suis en résolution de 12 bits.

En page 6 de la datasheet : http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf, on m'explique que je vais obtenir 12 bits utile.

Le bit 11 indiquant une température positive/négative
Les bits 10 à 0 servant à définir une température.

Première question, je ne sais pas si l'arduino me donne les bits dans l'ordre 0->11 ou 11->0 ?
J'ai donc écrit un petit code qui me permet de voir ce que donne l'arduino :

for (byte i = 0; i < 12; i++) {
        data[i] = wire.read();
        Serial.print(data[i]);
        Serial.print(" ");
    }

Quelle n'a pas été ma surprise de recevoir ceci : 76 1 0 0 127 255 4 16 13 255 255 255
Je m'attendais à recevoir soit un 255 ou un 0 ( data est de type byte).
Je ne comprends donc absolument pas d'où viennent c'est valeurs différentes de 0 et 255.

Imaginons maintenant que j'arrive à obtenir correctement ces valeurs avec data déclaré en "bool". Ce qui me permet d'avoir une valeur de 0 ou 1 correspondant au tableau 1 de la datasheet p6.

Si l'ordre est donné de 0->11, le code suivant me permettrait d'obtenir le bon nombre binaire :

int value =0;
for (byte i = 0; i < 12; i++) {
        value = value + wire.read()<<i;
    }

Si je suis la référence : << - Arduino Reference.
Exemple, ma variable "value" = 0000 0000 1111 0101 alors,
bit0 = 1, bit1 = 0, bit2 = 1, bit3 = 0,...

Il ne me reste plus qu'à appliquer 2^(-4) = 0.0625 pour que la variable "value" soit correctement convertie en température.

Passons à l'incompréhension suivante : sur tous les forums/sites, ils n'utilisent absolument pas ce principe... Mais plutôt celui-ci :

/* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  return ((data[1] << 8) | data[0]) * 0.0625;

Plusieurs questions en ressortent :

  • pourquoi une boucle sur 9 et pas 12 sachant que 0.0625 est une résolution de 12 bits ?
  • je ne comprends pas la signification (...<<8 )| ...
    Suivant la référence : & - Arduino Reference
    Il mettrait tous les bits de 7->0 à 0 ou 1 si data[0] vaut respectivement 0 ou 1... C'est stupide non ? ( même si je crois que dans ce cas c'est moi, puisqu'ils font la même chose partout ...).

Si je n'ai pas été clair, n'hésitez pas à me demander un complément d'informations.
Merci d'avance à tous,

Renaud

Bon bah c'est quand on écrit un pâté qu'on se rend compte de la faute..

Pour ceux que ça intéresse. La fonction read() renvoie un byte et non pas un bit comme je pensais.
De plus, p8 de la datasheet, on remarque que ce sont bien les 2 premiers byte qui nous intéresse ( puisque ce sont les bytes de la température).

le <<8 vient du fait qu'on déplace complètement un byte ( qui est stocké sur 8 bit). Bien sur on déplace le Most Significant Byte ( d'où le data [1]).

Je n'ai pas trouver la fonction "supprimer" un topic, encore une fois merci à tous :p.