Sonde DS18B20

Bonjour,

je cherche à obtenir la température de l’eau de ma piscine à partir d’une sonde DS18B20. A ce stade j’y suis arrivé.

Mais maintenant pour améliorer mon projet, je voudrais ajouter une autre sonde DS18B20 pour obtenir la Température de mon chauffage solaire.

Mon problème, comme modifier le code pour lire les sondes une après l’autre. J’avoue que la gestion des octets est plus compliqué.

Je suis parti d’un code simple trouvé sur le net pour ma première sonde.

#include <OneWire.h> // Inclusion de la librairie OneWire

#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 6 // Broche utilisée pour le bus 1-Wire

OneWire ds(BROCHE_ONEWIRE); // Création de l’objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d’erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté

if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}

if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l’adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur

if (addr[0] != DS18B20) // Vérifie qu’il s’agit bien d’un DS18B20
return false; // Si ce n’est pas le cas on retourne une erreur

ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(3000); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad

for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus

// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;

// Pas d’erreur
return true;
}

// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
}

// loop()
void loop() {
float temp;

// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {

// Affiche la température
Serial.print(" Temperature : " );
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write("C");
Serial.println();
}

 

}

merci pour vos commentaires.

Personne pour me renseigner ou me donner un conseil.

Cordialement.

Tu as aussi sur le net la solution avec 2 ( ou plus) sondes :

Et si tu ne veux pas t'embêter à gérer des adresses de sondes, tu peux choisir de brancher tes sondes sur des pin différentes.

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
OneWire ds2(BROCHE2_ONEWIRE); // Création d'un autre objet OneWire ds2

Ok mais si je ne gère pas les adresse que faut il modifier dans le code après avoir rajouté le 2 eme objet onewire ds2. Dans le code l adresse de onewire ds est 0x28 mais pour le 2eme je met quoi?

Én branchant sur des pins différents cela revient à gerer le sensor de façon classique j’ai bien tout compris.

Cordialement.

Bon allez, tu as de la chance je suis dans un bon jour ;D
Fait en deux minutes, pas testé, mais y a des chances que ça marche :

#include <OneWire.h> // Inclusion de la librairie OneWire

#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE1_ONEWIRE 6 // Broche utilisée pour le bus 1-Wire
#define BROCHE2_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire

OneWire ds1(BROCHE1_ONEWIRE); // Création de l'objet OneWire ds
OneWire ds2(BROCHE2_ONEWIRE); // Création de l'objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(OneWire *ds, float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté

if (!ds->search(addr)) { // Recherche un module 1-Wire
ds->reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}

if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur

if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur

ds->reset(); // On reset le bus 1-Wire
ds->select(addr); // On sélectionne le DS18B20

ds->write(0x44, 1); // On lance une prise de mesure de température
delay(3000); // Et on attend la fin de la mesure

ds->reset(); // On reset le bus 1-Wire
ds->select(addr); // On sélectionne le DS18B20
ds->write(0xBE); // On envoie une demande de lecture du scratchpad

for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds->read(); // Et on stock les octets reçus

// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;

// Pas d'erreur
return true;
}

// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
}

// loop()
void loop() {
float temp;

// Lit la température ambiante à ~1Hz
if(getTemperature(&ds1, &temp)) {
// Affiche la température
Serial.print(" Temperature1 : " );
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write("C");
Serial.println();
}

if(getTemperature(&ds2, &temp)) {
// Affiche la température
Serial.print(" Temperature2 : " );
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write("C");
Serial.println();
}

}

Merci, super sympa je testerai ce soir. 2 minutes pour un spécialiste mais pas mal de galère pour un amateur qui apprend au fur et a mesure et qui ne peut pas deviner.

En tout cas, super forum.

Cordialement.