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)
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
#279 |
Bonsoir Fabien Je pressens que que tu va pas apprécier mon commentaire !
Mais qui aime bien …
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" , 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
#280 |
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"
par artouste, tu mélange très allègrement ces deux notions.
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]
#334 |
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 !
#336 |
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.
#337 |
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 !
#372 |
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
#378 |
(…) 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.
#388 |
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
#391 |
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
#410 |
Merci pour votre réponse et vos conseils. ça fonctionne !
#462 |
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
#471 |
En fait, il faut inverser les valeurs du tableau pour que la conversion fonctionne :
par faro
1 2 3 const float RESOLUTION_CONSTANTS[4] = { 0.5, 0.25, 0.125, 0.0625 };
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 ?
#485 |
En fait, il faut inverser les valeurs du tableau pour que la conversion fonctionne :
par faro
1 2 3 const float RESOLUTION_CONSTANTS[4] = { 0.5, 0.25, 0.125, 0.0625 };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 faroIl vient d'où ce capteur ?
par skywodd
Mon capteur vient de ebay
#487 |
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 jean29La 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
#496 |
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
#568 |
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
#572 |
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
#574 |
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.
#575 |
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.
#577 |
ç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…??
#579 |
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 ?
#580 |
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…
#584 |
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
#612 |
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 !
Derniére modification le