Librairie OneWire et DS18B20

Bonjour,

en testant la librairie avec un capteur DS18B20, j’ai remarqué une ligne non commentée, à savoir

present = ds.reset();

Quel est le but de cette ligne ? A part que sans, ça ne fonctionne pas.
Mais j’ai eu beau chercher sur le net et sur le site officiel arduino, tous les codes sont les mêmes, mais jamais cette ligne n’est commentée.
Si je ne la met pas, la valeur de température est proche de zéro et les valeurs lues en hexa valent FF ??

Quelqu’un a une idée ?

Merci :wink:

#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
float temp;
boolean getTemperature(){
byte i;
byte present = 0;
byte data[12];
byte addr[8];
//find a device
if (!ds.search(addr)) {
ds.reset_search();
return false;
}
if (OneWire::crc8( addr, 7) != addr[7]) {
return false;
}
if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
return false;
}
ds.reset();
ds.select(addr);
// Start conversion
ds.write(0x44, 1);
// Wait some time…
delay(850);
present = ds.reset();
ds.select(addr);
// Issue Read scratchpad command
ds.write(0xBE);
// Receive 9 bytes
for ( i = 0; i < 9; i++) {
data = ds.read();
}
// Calculate temperature value
temp = ( (data[1] << 8) + data[0] )*0.0625;
return true;
}[/quote]

Totche:
Quel est le but de cette ligne ? A part que sans, ça ne fonctionne pas.

Ben déjà c'est une bonne raison. Cette ligne sert à faire marcher le programme :stuck_out_tongue_closed_eyes:

Peu nombreux sont ceux qui ne se contentent pas de cette raison.
Et donc pour eux : c'est parce que le protocole oneWire est ainsi fait.
Le maître du bus démarre tout ordre par une impulsion de reset : maintien du bus à 0V en continu pendant au moins 480 microsecondes.
Reset auquel les esclaves répondent par une impulsion de présence, d'une durée de 60 microsecondes.

D'ailleurs la méthode reset retourne 1 si au moins un esclave a signalé sa présence, et 0 si le maître parle dans le vide (il n'est pas interdit d'aller zieuter l'intérieur du source OneWire.cpp)

Le Maître : "Attention je vais parler"
Les esclaves : "Oui ?"
Le Maître : etc.

Bref c'est comme à la maison (sauf que là le Maître c'est ma femme)

Merci pour la "réponse".

En effet, la variable present retourne "1" en cas de présence d'un capteur.
Et la lecture du scratchpad est correcte ainsi que la température convertie.

Par contre sans cette ligne, il n'y a que des 'FF' de lus dans ce scratchpad, c'est le but de la question, surtout que la variable en question est utilisée avant la commande de lecture du scratchpad.

Ben déjà c'est une bonne raison. Cette ligne sert à faire marcher le programme smiley-yell

Peu nombreux sont ceux qui ne se contentent pas de cette raison.
Et donc pour eux : c'est parce que le protocole oneWire est ainsi fait.
Le maître du bus démarre tout ordre par une impulsion de reset : maintien du bus à 0V en continu pendant au moins 480 microsecondes.
Reset auquel les esclaves répondent par une impulsion de présence, d'une durée de 60 microsecondes.

D'ailleurs la méthode reset retourne 1 si au moins un esclave a signalé sa présence, et 0 si le maître parle dans le vide (il n'est pas interdit d'aller zieuter l'intérieur du source OneWire.cpp)

Donc, il y a pas de raison que la lecture du scratchpad soit erronée sans cette ligne ?

Ok si Onewire est ainsi fait,et j'ai aussi regardé le fichier cpp (ça dépasse mon niveau actuel), donc en gros, je n'ai toujours pas compris, désolé.

Merci.

Je vais essayer d'être plus clair

L'Arduino et le DS18B20 dialoguent en utilisant un seul fil.
Pour se comprendre, ils appliquent le protocole de communication OneWire.
Le protocole définit un ensemble de règles à respecter de la part de chacun.

Au plan électrique, le fil de données (DQ) doit être par défaut à une tension de 5V (d'où la présence d'une résistance de pull up). Celui qui veut causer sur le fil force la tension à 0V, selon des durées et fréquences imposées par le protocole.

Et le protocole est très clair : à chaque fois que l'Arduino veut envoyer un ordre au DS18B20, il doit commencer par envoyer une séquence de réinitialisation. C'est l'objectif principal de la fonction reset(). L'objectif secondaire étant d'attendre l'acquittement des périphériques connectés, pour retourner 0 ou 1 à l'appelant, l'informant ainsi de la présence de quelqu'un à l'autre bout du fil.

Par ailleurs, si tu regardes le datasheet du DS18B20, tu verras que celui-ci ne renvoie le contenu de son scratchpad que s'il a reçu la bonne séquence 1.initialisation 2.demande de lecture scratchpad (ordre 0xBE)

Ceci appliqué à ton programme donne :

  1. la variable present ne sert à rien car non utilisée.
    Elle est juste là à titre didactique, pour rappeler que la fonction reset retourne une information.
  2. l'appel à la fonction reset() est obligatoire avant toute autre commande envoyée au DS18B20.
    Sans ce reset, le DS18B20 ne comprend pas l'ordre reçu.
    Il ne renvoie pas le contenu de son scratchpad
    La ligne reste à 5V
    Ton read ne retourne que des bits 1, d'où FF en bout de course

Après les read, tu devrais appeler la fonction de vérification du CRC de la trame reçue. Cela te permettra de vérifier la validité des données avant de les propager pour traitement.
A mon sens, cette vérification est obligatoire et manque dans ton code.

Voilou
J'espère que cette réponse te convient mieux :sweat_smile:

Rebonjour,

Et remerci pour la réponse.

Effectivement, il manque un reset (le code vient de la page de la librairie onewire OneWire Arduino Library, connecting 1-wire devices (DS18S20, etc) to Teensy
Et +1 pour la variable didactique non commentée.

Merci.

Pour le contrôle CRC de la température relevée(=validité du scratchpad reçu du DS18B20) voir ici : Arduino Playground - OneWire