Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser ;)

En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.

Topic "Mesurer une température avec un capteur 1-Wire DS18B20 et une carte Arduino / Genuino"

Flux RSS des posts récents dans ce topic ( Flux Atom)


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#278 | Signaler ce message


Dans ce tutoriel, nous allons apprendre ensemble à utiliser un capteur 1-Wire DS18B20 pour mesurer une température au moyen d'une carte Arduino / Genuino. Nous verrons aussi comment mesurer plusieurs températures en même temps avec plusieurs capteurs sur un même bus. En bonus, on verra comment faire plusieurs mesures en parallèle et comment réduire le temps entre deux mesures.

Lire la suite de l'article sur le site

Derniére modification le par skywodd


Pas de photo de profil

artouste

Membre

#279 | Signaler ce message


Bonsoir Fabien Je pressens que que tu va pas apprécier mon commentaire !

Mais qui aime bien … :D

Le capteur DS18B20 existe dans le commerce en deux versions : en boitier TO-92 (format transistor, en photo un peu plus haut) pour des utilisations standards en intérieur, ou en format "sonde étanche" pour des applications en milieu humide / extérieur.

Le DS18B20 existe en d'autres formats que le TO-92 Le DS18B20 en version "tubé" n'est pas au catalogue "constructeur capteur" , ce n'est que de l'adaptation d'un capteur "par tiers"

Il communique via un bus 1-Wire et possède une précision numérique de 12 bits (programmable, voir chapitre bonus)

Les ds18B20 ont une précision au mieux de +/- 0.5 °C sur une plage limitée (--->DS) faut pas confondre précision et résolution , dans ton article au demeurant bien fait en ce qui concerne "le codage" :D , tu mélange très allégrement ces deux notions.

NB : j'ai mis tes portions entre balises code je n'ai pas trouvé de balises "citations"

Derniére modification le par skywodd


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#280 | Signaler ce message


Le DS18B20 existe en d'autres formats que le TO-92 Le DS18B20 en version "tubé" n'est pas au catalogue "constructeur capteur" , ce n'est que de l'adaptation d'un capteur "par tiers"

par artouste

Je sais, mais je place du point de vue du lecteur. La version SO/SOP n'a par exemple pas grand intérêt pour l'utilisateur lambda, contrairement à la version sonde/TO-92. Je me suis donc permis un petit raccourci facile ;)

Les ds18B20 ont une précision au mieux de +/- 0.5 °C sur une plage limitée (--->DS) faut pas confondre précision et résolution , dans ton article au demeurant bien fait en ce qui concerne "le codage" :D , tu mélange très allègrement ces deux notions.

par artouste

Après relecture, j'ai effectivement inversé précision et résolution, en particulier dans le dernier chapitre. J'ai fait une modification de l'article. Normalement, maintenant c'est bon. Au bout de la vingtième page de texte, mon cerveau a décider de faire grève apparemment.

NB : j'ai mis tes portions entre balises code je n'ai pas trouvé de balises "citations"

par artouste

C'est le petit triangle / citation, ou simplement [quote]...[/quote] ;)


Photo de profil de Cyberfifi

Cyberfifi

Membre

#334 | Signaler ce message


Bonjour! Tout d'abord, merci beaucoup pour cet excellent article !!! Je cherchais depuis longtemps un article avec les explications et programmes pour utiliser plusieurs capteurs 1-Wire…Et vraiment le votre est top !! Aucun soucis pour mettre en œuvre votre programme, ça marche nickel !! J'ai une question : je voudrais mettre 3 capteurs sur le même fil avec une longueur max de 5 mètres pour le derniers capteurs: est-ce OK, pas de risque de perte d'info sur une telle longueur ? L'idée est de collecter la T de mon congel + T de l'eau du chauffage au sol + T de l'eau chaude sanitaire. Tout ceci est au sous sol et les data seront envoyées via le réseau (filaire !! ça reste le must…)à ma box Jeedom ! J'ai déjà testé 1 capteur DS18B20 + Arduino + W5100 + Jeedom, ça marche nickel, mais avec 3 sondes ce sera encore mieux !! Merci pour ton aide !


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#336 | Signaler ce message


J'ai une question : je voudrais mettre 3 capteurs sur le même fil avec une longueur max de 5 mètres pour le derniers capteurs: est-ce OK, pas de risque de perte d'info sur une telle longueur ?

Aucun soucis du moment que le câble est de bonne qualité. Du câble ethernet CAT5e fait très bien l'affaire pour ce genre de câblage.


Photo de profil de Cyberfifi

Cyberfifi

Membre

#337 | Signaler ce message


J'ai une question : je voudrais mettre 3 capteurs sur le même fil avec une longueur max de 5 mètres pour le derniers capteurs: est-ce OK, pas de risque de perte d'info sur une telle longueur ?

Aucun soucis du moment que le câble est de bonne qualité. Du câble ethernet CAT5e fait très bien l'affaire pour ce genre de câblage.

par skywodd

Bonsoir, Merci pour votre réponse ! Je vais utiliser du câble CAT5e. Pour info, j'ai mis en test un programme avec en plus l'envoi des températures dans Jeedom via le réseau. Il est en test depuis hier, ça marche nickel avec trois capteurs DS18B20 !!! :) J'ai utilisé votre programme avec lecture simultanée de plusieurs capteurs. Encore merci pour ce Topic !


Pas de photo de profil

jean29

Membre

#372 | Signaler ce message


Bonjour, Peut-être pourriez vous m'aider ? J'ai utilisé votre programme pour afficher la température avec le DS18B20 et une carte Arduini uno mais lorsque je fais téléverser le logociel m'indique une erreur de compilation : collect2.exe: error: ld returned 5 exit status

Plusieurs bibliothèque trouvées pour "OneWire.h" Utilisé : C:\Documents and Settings\Leveque\Mes documents\Arduino\libraries\OneWire Non utilisé : C:\Program Files\Arduino\libraries\OneWire Utilisation de la bibliothèque OneWire version 2.3.2 dans le dossier: C:\Documents and Settings\Leveque\Mes documents\Arduino\libraries\OneWire exit status 1 Erreur de compilation pour la carte Arduino/Genuino Uno Sans doute j'ai fait une erreur quelque part mais je ne sais pas où. Pourriez-vous m'aider ? Merci


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#378 | Signaler ce message


(…) Plusieurs bibliothèque trouvées pour "OneWire.h" (…)

par jean29

Le message d'erreur est on ne peut plus clair ;)

Il existe plusieurs copies de la bibliothèque OneWire dans le dossier "libraries" de votre installation Arduino. Supprimez les copies et la compilation devrait se terminer sans erreur.


Pas de photo de profil

jean29

Membre

#388 | Signaler ce message


Merci pour votre réponse. J'ai changé d'ordinateur. Mais cela ne fonctionne toujours pas. Voici le texte d'erreur : C:\Program Files (x86)\Arduino\libraries\OneWire\OneWire.cpp:85:24: fatal error: WConstants.h: No such file or directory

#include "WConstants.h" J'ai du mal installer la bibliothèque "OneWire". Pouvez-vous m'aider ? (si je n'abuse pas) Merci


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#391 | Signaler ce message


Voici le texte d'erreur : C:\Program Files (x86)\Arduino\libraries\OneWire\OneWire.cpp:85:24: fatal error: WConstants.h: No such file or directory

par jean29

La version installée sur cet ordinateur est manifestement trop ancienne.

Téléchargez une version "propre" du logiciel Arduino depuis arduino.cc, puis installer le plugin Teensyduino. Il fera tout le travail d'installation pour vous ;)


Pas de photo de profil

jean29

Membre

#410 | Signaler ce message


Merci pour votre réponse et vos conseils. ça fonctionne !


Pas de photo de profil

faro

Membre

#462 | Signaler ce message


Bonjour,

Une coquille a été judicieusement insérée dans votre code concernant le tableau de conversion afin de vérifier combien de personnes vont jusqu'au bout du tutoriel ;) :

1
2
3
const float RESOLUTION_CONSTANTS[4] = {
  0.5, 0.25, 0.125, 0.0625
};

En fait, il faut inverser les valeurs du tableau pour que la conversion fonctionne :

1
2
3
const float RESOLUTION_CONSTANTS[4] = {
  0.5, 0.25, 0.125, 0.0625
};

Merci beaucoup pour ce tutoriel très instructif. + F.

Edit: En fait, mon capteur est un peu particulier. En effet, quelque soit la précision (9 ou 12 bits), je dois toujours multiplier la valeur obtenue par 0.0625 : data[0]=110000 data[1]=1 data[2]=0 data[3]=0 data[4]=11111 data[5]=11111111 data[6]=10000 data[7]=10000 data[8]=11000000 Temperature : 152.00°C (ici on a 130h=304d, 304x0.5=152, alors que 304x0.0625=19).

La référence de mon capteur est : DALLAS 18B20 1631C4 +517AF

Derniére modification le par faro


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#471 | Signaler ce message


En fait, il faut inverser les valeurs du tableau pour que la conversion fonctionne :

1
2
3
const float RESOLUTION_CONSTANTS[4] = {
  0.5, 0.25, 0.125, 0.0625
};
par faro

Heu … C'est exactement les valeurs d'origine de l'article. J'ai raté un truc ?

En fait, mon capteur est un peu particulier. En effet, quelque soit la précision (9 ou 12 bits), je dois toujours multiplier la valeur obtenue par 0.0625 :

par faro

Il vient d'où ce capteur ?


Pas de photo de profil

faro

Membre

#485 | Signaler ce message


En fait, il faut inverser les valeurs du tableau pour que la conversion fonctionne :

1
2
3
const float RESOLUTION_CONSTANTS[4] = {
  0.5, 0.25, 0.125, 0.0625
};
par faro

Heu … C'est exactement les valeurs d'origine de l'article. J'ai raté un truc ?

En fait, mon capteur est un peu particulier. En effet, quelque soit la précision (9 ou 12 bits), je dois toujours multiplier la valeur obtenue par 0.0625 :

par faro

Il vient d'où ce capteur ?

par skywodd

Mon capteur vient de ebay


Pas de photo de profil

aquabiofarm

Membre

#487 | Signaler ce message


Voici le texte d'erreur : C:\Program Files (x86)\Arduino\libraries\OneWire\OneWire.cpp:85:24: fatal error: WConstants.h: No such file or directory

par jean29

La version installée sur cet ordinateur est manifestement trop ancienne.

Téléchargez une version "propre" du logiciel Arduino depuis arduino.cc, puis installer le plugin Teensyduino. Il fera tout le travail d'installation pour vous ;)

par skywodd

Bonjour, J'avais également le même problème, j'ai télécharger la dernière version de la librairie OneWire, 2.3.3 actuellement. Merci pour ton tuto qui fonctionne parfaitement Jérôme


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#496 | Signaler ce message


Mon capteur vient de ebay

par faro

Cherche pas plus loin, tu as du tomber sur une contre-façon chinoise.

Merci pour ton tuto qui fonctionne parfaitement

par aquabiofarm

Merci d'avoir pris le temps de le lire ;)


Pas de photo de profil

artiman

Membre

#568 | Signaler ce message


j'ai egalement dû laisser la cte à 0.0625 pour toutes les resolutions… et ça marche impec quand même ! tout se passe comme si diminuer le temps compensait la multiplication de la constante… mon capteur est un "chinois" datant de 2015 environ … j'ai fait l'essai sur plusieurs capteurs d'origines differentes , c'est idem ! de plus il faut imperativment lancer une copie scratchcard APRES avoir changé la reso sinon risque de perdre l'info en cas de suppression de l'alim capteur (mon cas car je coupe l'alim entre chaque mesure)

sinon merci pour le tuto tres clair ! cdlt


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#572 | Signaler ce message


j'ai fait l'essai sur plusieurs capteurs d'origines differentes , c'est idem !

par artiman

Vraiment étrange …

Je n'ai pas observé ce comportement lors de mes tests. Je vais faire des essais dés que possible pour en être sûr. Je suis peu être passer à côté d'un truc.

de plus il faut impérativement lancer une copie scratchcard APRES avoir changé la reso sinon risque de perdre l'info en cas de suppression de l'alim capteur (mon cas car je coupe l'alim entre chaque mesure)

par artiman

C'est le comportement normal du code et du capteur. Il est préférable de configurer le capteur à chaque démarrage plutôt que de garder en mémoire la configuration.

Ça évite de ce retrouver avec des configurations qui ne correspondent pas à ce qu'attend le code.

Derniére modification le par skywodd


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#574 | Signaler ce message


IMPORTANT

J'ai découvert une erreur au niveau de l'illustration "breadboard" de l'article. Le capteur est à l'envers (broches GND/VCC inversées). J'ai corrigé l'article et l'illustration en conséquence.

J'ai aussi pu observer le comportement anormale du code de changement de résolution avec un capteur officiel. Je suis en train d'essayer de comprendre pourquoi cela ne fonctionne pas comme prévu.


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#575 | Signaler ce message


J'ai définitivement merdé quelque part au niveau des vérifications pré-publication de cet article. Je suis sincèrement désolé pour ces deux grosses erreurs.

Conclusion des tests d'aujourd'hui :

La modification de la résolution ne change absolument pas la constante de multiplication. J'ai lu de travers la documentation constructeur et j'ai écrit/codé n'importe quoi !

Le changement de résolution ne joue QUE sur la durée de la conversion (et sa précision). Les bits de données "non utilisés" sont fixés à 0 mais le calcul de température reste le même qu'importe la résolution.

J'ai fait une erreur dans mon code "de test", erreur qui figée la valeur de multiplication à 0.25 (data[4] > 5 au lieu data[4] >> 5, ce qui retourne toujours 1). Lors des tests, au lieu de lire 20°C je devais lire 80°C. Mais comme je me rappelle avoir fait des tests avec une flamme juste avant de tester les codes bonus, à coup sûr, je n'ai pas remarqué l'énorme bêtise que j'était en train de documenter.

J'ai mis à jours le chapitre bonus. Désolé pour les prises de tête que ces deux erreurs ont pu provoquer.


Pas de photo de profil

artiman

Membre

#577 | Signaler ce message


ça confirme bien nos essais ! et ça ne remet pas en cause que le topic est tres bien fait, et les petites erreurs ici et là ne sont pas graves puisque elles donnent l'occasion d'approfondir et de bien comprendre le fonctionnement de ces petites bêtes… et si je n'etais pas tombé par hasard sur ce sujet, je serais passé a coté de la possibilité de modifier la resolution : ça n'a aucun interet en utilisation normale, mais quand le capteur est alimenté par piles, ça prend toute son importance pour diminuer la conso de l'arduino (qui est obligé d'attendre la fin de la mesure) et utiliser une patte de l'arduino pour alimenter la bébête cycliquement uniquement pendant la mesure ! j'ai par contre apparemment aléatoirement des mesures nulles une fois par jour, suivant les jours… je ne sais pas si c'est le capteur ou le reste … si quelqu'un a deja eu ça…??


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#579 | Signaler ce message


j'ai par contre apparemment aléatoirement des mesures nulles une fois par jour, suivant les jours… je ne sais pas si c'est le capteur ou le reste … si quelqu'un a deja eu ça…??

par artiman

Longueur de fil trop grande ? Faux contact ? Peut être un délai d'attente trop court après la mesure ou le démarrage du capteur ?


Pas de photo de profil

artiman

Membre

#580 | Signaler ce message


non, ce n'est pas une question de matériel ni de reglage du temps d'attente : j'ai plusieurs capteurs à base de ds18b20 + pro mini 3v3 alimentés par piles, qui envoient à une carte MEGA soit par emetteur sans fil 433 Mhz soit par NRF24L01 la mesure au travers d'une structure à 5 octets, 1 byte (ID) et 1 float (Temp1) : coté Mega, j'utilise la même structure pour récuperer sachant que je scrute en boucle l'arrivée du message (1 fois par mn) et qu'entre temps je mets à zero coté carte MEGA le float de reception Temp_mes1 … or de temps en temps donc peut etre 1 fois tous les 3 jours, ou moins, ou plus, le float reçu est "semble t-il" nul bien que je teste avant emission, les 2 octets du scratcard pour savoir si ils sont nuls ou pas (si nul je n'envoie pas) donc je soupconne un probleme de cast : voici le code correspondant coté emetteur …

1
2
3
4
5
6
 // Calcul de la température en degré Celsius
 *temp1 = ((data[1] << 8) | data[0]) * 0.0625;
   
  // cas d'erreur temp=0.00 - on teste ici la valeur en bits MSB+LSB
  // l'erreur est peut etre coté boitier arti (pb reception)
  if (data[0]|data[1]) return true; else return false;

et celui coté recepteur :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  temp_mes1 = inbuff.Temp;
// filtre erreur mesure temp=0.00 ou test localisation (l'emetteur envoie 0° toutes les 10 sec)
// temp = 0.00 est donc un cas theorique non detecté... peu probable en realité
  if (temp_mes1 != 0) {
  temp_mes1_moy = temp_mes1_moy + temp_mes1; // cumul des mesures pour calcul moyenne capteur 1
  etat_temp1++;  // mis a +1 si au moins 1 reception valide en 5 mns
  Serial.print("temp1<>0 ");
  }
         Serial.print("-- Temp1 ");  Serial.println(temp_mes1);
if (temp_mes1 < 0.01)     Serial.println("temp1=0 ");

et curieusement, quand j'ai le probleme, le test (temp_mes1 != 0) renvoie true et affiche "temp1 <> 0" puis j'ai l'affichage — Temp1 = 0.00 et enfin le deuxieme test (temp_mes1 < 0.01) renvoi true et affiche "temp1=0"

je commence a manquer d'idées pour expliquer cela…

nota : si je teste simpelment if (temp_mes1) j'ai le meme resultat que if (temp_mes1 !=0)

je soupconne un pb purement reception (et non pas DS18b20) coté ARDUINO pour bien gerer les floats vu que ce n'est qu'un micro 8 bits

bon, je comprends que ce soit un peu sioux a comprendre mais peut etre quelqu'un a t'il eu peu ou prou le meme souci, vu qu'on utilise des floats et des emetteurs pour gerer l'envoi de temp avec ce capteur… ?

PS: la "parade" qui semble marcher est de tester (temp_mes1 < 0.01)pour detecter temp_mes1 à zero, les autres tests semblent se tromper…


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#584 | Signaler ce message


Un nombre flottant est toujours une approximation (cf Norme IEEE 754). Faire une comparaison égale ou différent avec un nombre flottant est une erreur de programmation.

Exemple classique d'approximation en nombre flottant : 0.1 + 0.2 - 0.3 = 5.551115123125783e-17

Dans ton code, je pense qu'en plus tu as un arrondi caché quelque part lors de l'affichage avec println().

Derniére modification le par skywodd


Pas de photo de profil

dib258

Membre

#612 | Signaler ce message


Bonjour skywodd,

Merci pour ce tutoriel tres clair et precis !

J'ai aussi le soucis avec la double definition des methode avec le fichier OneWire qu'on inclut tout en haut du fichier. J'avais pourtant bien installe la librairie a partir du menu Sketch > Include Library > Manage Libraries…

Et bien sur, pas de double include dans le code. Cependant, apres avoir efface tout le projet et recree un nouveau, (j'ai aussi supprime la librairie OneWire qui etait dans un dossier different) au lieu de choisir la derniere version 2.3.3 j'ai installe la 2.3.2 et la avec le meme code (copier/coller du tiens pour etre sur) plus de soucis lors de la compilation.

De plus lors du premier plug et test live. J'ai ouvert le moniteur Serial pour voir ce qu'il se passait et la horreur. J'avais des messages du style : '???d?/????k????c?' et j'avais beau reverifier mes raccords recommencer la procedure rien n'y changeait :(

J'ai quand meme essayer de chipoter un peu dans ce moniteur et c'est la que j'ai vu tout en bas a droite le select avec des valeurs numerique en baud. J'ai cherche sur le net et au final on dirait que le baud a un rapport avec la valeur passee en parametre dans le setup Serial.begin(). La valeur par defaut etait de 9600 baud ce pourquoi j'avais du charabiat incomprehensible !

Tu sais m'en dire un peu plus sur ce baud et le rapport avec l'initialisation du port de serie ?

Voila, juste pour expliquer un peu mon parcours dans ce projet et si ca peut aider quelqu'un d'autre tant mieux ! :p

Derniére modification le par dib258