Cours Complet : Mesurer la Température avec le Capteur DS18B20
- Arduino
- 0 comments
1. 🎯 Objectif Pédagogique
À la fin de ce cours, tu sauras mesurer la température avec précision grâce au capteur DS18B20, afficher les résultats dans le moniteur série de ton Arduino, et même créer tes propres projets de thermomètre intelligent ! C'est comme avoir un petit thermomètre numérique magique que tu peux programmer pour surveiller la température de ta chambre, de l'eau, ou même de ton aquarium. Tu vas découvrir comment transformer ton Arduino en station météo miniature !
2. 📡 Présentation du Module DS18B20
Le DS18B20 est un capteur de température numérique super populaire chez les makers ! Imagine-le comme un petit espion qui observe la température et transmet ses découvertes à ton Arduino.
Pourquoi il est génial ?
Il mesure de -55°C à +125°C (du congélateur au four !)
Il est très précis (±0,5°C)
Il existe en version étanche (parfait pour mesurer la température de l'eau)
Il communique avec seulement 1 fil de données (protocole "1-Wire")
Tu peux même en brancher plusieurs sur la même broche !
C'est un peu comme avoir un thermomètre médical ultra-précis, mais qui parle le langage de l'Arduino. Il ressemble à un petit composant noir avec 3 pattes (ou un câble avec 3 fils pour la version étanche).
3. 🛠️ Matériel Nécessaire
Pour cette aventure thermique, voici ta liste de courses :
1 carte Arduino (Uno, Nano, Mega... peu importe !)
1 capteur DS18B20 (version classique ou étanche)
1 résistance de 4,7 kΩ (jaune-violet-rouge ou jaune-violet-noir-marron)
Quelques fils de connexion
1 breadboard (plaque d'expérimentation)
1 câble USB pour connecter l'Arduino à ton ordinateur
Budget estimé : Environ 3-5€ pour le capteur, ultra abordable !
4. 🔍 Explication du Fonctionnement
Comment ça marche ?
Imagine le DS18B20 comme un petit détective de température. À l'intérieur, il y a un minuscule thermomètre électronique qui ressent la chaleur. Quand la température change, il transforme cette information en signal numérique (des 0 et des 1) que l'Arduino peut comprendre.
Le protocole 1-Wire : la magie d'un seul fil !
Contrairement à d'autres capteurs, le DS18B20 utilise un protocole intelligent appelé "1-Wire". C'est comme une conversation par téléphone : ton Arduino pose une question ("Quelle est la température ?"), et le capteur répond sur le même fil ! Pour que cette conversation fonctionne bien, on ajoute une résistance de 4,7 kΩ entre le fil de données et l'alimentation. C'est comme mettre un micro-amplificateur pour que les deux se comprennent mieux.
Les 3 pattes du capteur :
GND (masse) : le fil noir, la référence
VCC (alimentation) : le fil rouge, +5V ou +3,3V
DATA (données) : le fil jaune, la ligne de communication
5. 💻 Premier Code Minimaliste
Câblage simplifié (vue de face du DS18B20, pattes vers le bas) :
DS18B20 Arduino
------- -------
GND (gauche) → GND
DATA (milieu) → Pin 2 (+ résistance 4,7kΩ vers 5V)
VCC (droite) → 5V
Résistance 4,7kΩ : entre DATA et VCC (appelée "pull-up")
Installation préalable :
Avant de téléverser le code, installe les bibliothèques nécessaires :
Ouvre l'IDE Arduino
Va dans Croquis → Inclure une bibliothèque → Gérer les bibliothèques
Cherche "DallasTemperature" et installe-la (elle installera aussi "OneWire")
Le code :
#include <OneWire.h>
#include <DallasTemperature.h>
// Le capteur est connecté sur la broche 2
#define BROCHE_CAPTEUR 2
// Création des objets pour communiquer
OneWire oneWire(BROCHE_CAPTEUR);
DallasTemperature capteurs(&oneWire);
void setup() {
Serial.begin(9600); // Démarre la communication série
capteurs.begin(); // Initialise le capteur
Serial.println("=== Thermometre DS18B20 ===");
}
void loop() {
// Demande au capteur de mesurer la température
capteurs.requestTemperatures();
// Récupère la température en degrés Celsius
float temperature = capteurs.getTempCByIndex(0);
// Affiche le résultat
Serial.print("Temperature : ");
Serial.print(temperature);
Serial.println(" °C");
delay(1000); // Attend 1 seconde avant la prochaine mesure
}
Teste-le ! Téléverse le code et ouvre le moniteur série (loupe en haut à droite). Tu devrais voir la température s'afficher toutes les secondes. Essaie de pincer le capteur entre tes doigts : la température va monter ! 🌡️
6. 🔬 Décryptage du Code
Ligne par ligne, comme un détective :
#include <OneWire.h>
#include <DallasTemperature.h>
Ces deux lignes importent les "boîtes à outils" nécessaires. OneWire permet de parler le langage 1-Wire, et DallasTemperature facilite la communication spécifique avec le DS18B20.
#define BROCHE_CAPTEUR 2
On donne un nom à notre broche (pin 2), comme donner un surnom à ton ami. C'est plus facile à retenir !
OneWire oneWire(BROCHE_CAPTEUR);
DallasTemperature capteurs(&oneWire);
On crée deux "assistants" : oneWire gère la communication bas niveau, et capteurs est ton traducteur personnel qui parle directement au DS18B20.
capteurs.requestTemperatures();
C'est ici qu'on demande poliment au capteur : "Dis-moi, quelle est la température ?" Il prend quelques millisecondes pour mesurer.
float temperature = capteurs.getTempCByIndex(0);
On récupère la réponse. Le 0 signifie "le premier capteur" (car on pourrait en brancher plusieurs !). float veut dire "nombre à virgule" (ex : 23.5).
Erreurs courantes à éviter :
❌ Oublier la résistance de 4,7 kΩ → lectures erratiques ou -127°C
❌ Inverser VCC et GND → rien ne fonctionne (mais pas de danger)
❌ Ne pas installer les bibliothèques → erreur de compilation
6bis. 🧬 BONUS : Dans les Coulisses du DS18B20 (Le Scratchpad)
Pour les curieux qui veulent comprendre "sous le capot" !
Quand ton Arduino demande la température au DS18B20, le capteur lui envoie en réalité 9 octets d'informations dans ce qu'on appelle le "scratchpad" (bloc-notes). C'est comme une petite lettre codée que l'Arduino doit décrypter !
📜 Exemple concret : décryptons un message réel
Imaginons que ton capteur envoie : 86 01 00 00 7F E1 3C AA D3
Voici ce que signifie chaque octet (petit paquet de données) :
OctetValeurSignification086Température partie basse (LSB)101Température partie haute (MSB)200Alarme haute (TH) - non configurée300Alarme basse (TL) - non configurée47FConfiguration de la résolution (12 bits)5-7E1 3C AAOctets réservés (usage interne)8D3CRC (code de vérification)
🌡️ Comment calculer la température ?
On combine les octets 0 et 1 :
0x0186= 390 en décimal
On divise par 16 (car on est en résolution 12 bits) : 390 ÷ 16 = 24,375°C
En Fahrenheit : 24,375 × 9/5 + 32 = 75,88°F
🎚️ La résolution, c'est quoi ?
L'octet 4 (Config = 0x7F) indique la précision de la mesure :
0x1F= 9 bits → précision 0,5°C (temps de conversion : 94ms)
0x3F= 10 bits → précision 0,25°C (188ms)
0x5F= 11 bits → précision 0,125°C (375ms)
0x7F= 12 bits → précision 0,0625°C (750ms) ← Le plus précis !
Plus c'est précis, plus ça prend du temps. C'est comme choisir entre une photo rapide floue ou une photo nette qui prend plus de temps !
🛡️ Le CRC : le garde du corps de tes données
Le dernier octet (D3 dans notre exemple) est un code de vérification (CRC-8). C'est comme la somme de contrôle d'un code postal : ça permet de détecter si les données ont été abîmées pendant le voyage sur le fil !
Pourquoi c'est important ?
Le bus 1-Wire peut être long (plusieurs mètres) → risques d'interférences
Des parasites électriques peuvent altérer les données
Le CRC détecte environ 99,6% des erreurs (255/256)
Comment ça marche en pratique ?
L'Arduino reçoit les 9 octets
Il recalcule le CRC sur les 8 premiers octets
Il compare avec l'octet 8 reçu
✅ Si ça correspond : données valides !
❌ Si ça diffère : relire le capteur
📝 Code pour vérifier le CRC toi-même :
void afficherScratchpad() {
byte data[9];
// Demande une conversion de température
capteurs.requestTemperatures();
delay(1000);
// Lit le scratchpad (les données brutes)
oneWire.reset();
oneWire.write(0xCC); // Skip ROM (1 seul capteur)
oneWire.write(0xBE); // Read Scratchpad
Serial.println("\\n=== Scratchpad Brut ===");
for (int i = 0; i < 9; i++) {
data[i] = oneWire.read();
Serial.print("Byte ");
Serial.print(i);
Serial.print(": 0x");
if (data[i] < 16) Serial.print("0");
Serial.print(data[i], HEX);
Serial.print(" (");
Serial.print(data[i]);
Serial.println(")");
}
// Calcul de la température
int16_t tempBrut = (data[1] << 8) | data[0];
float tempCalculee = tempBrut / 16.0;
Serial.print("\\nTemperature calculee : ");
Serial.print(tempCalculee);
Serial.println(" °C");
// Vérification du CRC
byte crcCalcule = OneWire::crc8(data, 8);
Serial.print("CRC recu : 0x");
Serial.println(data[8], HEX);
Serial.print("CRC calcule : 0x");
Serial.println(crcCalcule, HEX);
if (crcCalcule == data[8]) {
Serial.println("✓ CRC VALIDE - Donnees integres !");
} else {
Serial.println("✗ ERREUR CRC - Donnees corrompues !");
}
}
💡 Que faire si le CRC échoue souvent ?
Vérifie ta résistance pull-up (4,7 kΩ présente ?)
Raccourcis les fils (idéalement < 3 mètres)
Utilise des fils blindés si l'environnement est bruyant
Vérifie l'alimentation (5V stable)
Ajoute un condensateur 100nF entre VCC et GND (filtre anti-parasites)
🎓 En résumé : pourquoi c'est utile de comprendre ça ?
Tu comprends comment fonctionne vraiment ton capteur
Tu peux diagnostiquer les problèmes de communication
Tu peux optimiser la résolution selon tes besoins (vitesse vs précision)
Tu peux programmer des alarmes de température (octets 2 et 3)
Tu deviens un vrai expert du DS18B20 ! 🚀
La bibliothèque DallasTemperature fait tout ça automatiquement pour toi, mais maintenant tu sais ce qui se passe dans les coulisses !
6ter. 🚨 Guide de Dépannage : Comprendre les Codes d'Erreur
Quand ton capteur "parle" en codes bizarres !
Parfois, au lieu d'une température normale (genre 23,5°C), tu vois des valeurs étranges comme -127°C, 85°C ou même 0°C qui ne bougent pas. Pas de panique ! Ces valeurs sont des messages d'erreur que le capteur t'envoie. Décodons-les ensemble comme un vrai détective ! 🔍
🥶 Erreur n°1 : -127°C (ou -196,6°F)
Ce que tu vois :
Temperature : -127.00 °C
Temperature : -127.00 °C
Temperature : -127.00 °C
Qu'est-ce que ça signifie ?
C'est la valeur par défaut de la bibliothèque DallasTemperature quand elle ne détecte AUCUN capteur sur le bus. C'est comme si tu appelais quelqu'un au téléphone et que personne ne répondait !
Valeur brute : Le scratchpad contient 0x50 0xFF (soit -2048 en décimal, divisé par 16 = -127).
🔧 Comment résoudre :
CauseSolutionNiveauPas de résistance pull-upAjoute une résistance de 4,7 kΩ entre DATA et VCC⭐ EssentielCâblage incorrectVérifie : GND→GND, VCC→5V, DATA→Pin 2⭐⭐Capteur défectueuxTeste avec un autre capteur DS18B20⭐⭐⭐Mauvais contactResserre les connexions sur la breadboard⭐Fils trop longsUtilise des fils < 3 mètres sans blindage⭐⭐
✅ Test rapide :
void setup() {
Serial.begin(9600);
capteurs.begin();
// Compte les capteurs détectés
int nbCapteurs = capteurs.getDeviceCount();
Serial.print("Capteurs détectés : ");
Serial.println(nbCapteurs);
if (nbCapteurs == 0) {
Serial.println("❌ AUCUN capteur trouvé !");
Serial.println("→ Vérifie le câblage et la résistance pull-up");
}
}
🔥 Erreur n°2 : 85°C (ou 185°F) fixe
Ce que tu vois :
Temperature : 85.00 °C
Temperature : 85.00 °C
Temperature : 85.00 °C
Qu'est-ce que ça signifie ?
85°C est la valeur Power-On-Reset du DS18B20. C'est la température par défaut stockée dans le scratchpad quand le capteur s'allume, avant qu'il n'ait fait sa première mesure réelle.
Valeur brute : Le scratchpad contient 0x50 0x05 (soit 1360 en décimal, divisé par 16 = 85).
Pourquoi ça arrive ?
Tu lis la température trop vite, avant que le capteur ait eu le temps de faire sa conversion ! C'est comme demander à quelqu'un de te donner une réponse avant même qu'il ait réfléchi.
⏱️ Temps de conversion selon la résolution :
9 bits : 94 ms minimum
10 bits : 188 ms minimum
11 bits : 375 ms minimum
12 bits : 750 ms minimum (par défaut)
🔧 Comment résoudre :
void loop() {
// ❌ MAUVAIS : lecture immédiate
capteurs.requestTemperatures();
float temp = capteurs.getTempCByIndex(0); // → 85°C !
// ✅ BON : attendre la conversion
capteurs.requestTemperatures();
delay(800); // Au moins 750ms pour 12 bits
float temp = capteurs.getTempCByIndex(0); // → température réelle
Serial.println(temp);
delay(1000);
}
💡 Solution élégante avec setWaitForConversion() :
void setup() {
Serial.begin(9600);
capteurs.begin();
// L'Arduino attend automatiquement la fin de la conversion
capteurs.setWaitForConversion(true); // ← La magie !
}
void loop() {
capteurs.requestTemperatures(); // Attend automatiquement 750ms
float temp = capteurs.getTempCByIndex(0); // Toujours une vraie valeur
Serial.println(temp);
delay(1000);
}
🔍 Vérification :
Si tu lis le scratchpad juste après requestTemperatures() sans délai, tu verras 0x50 0x05 (85°C). Après 750ms, tu verras la vraie température !
❄️ Erreur n°3 : 0°C (ou 32°F) fixe
Ce que tu vois :
Temperature : 0.00 °C
Temperature : 0.00 °C
Temperature : 0.00 °C
Qu'est-ce que ça signifie ?
Plusieurs causes possibles, car 0°C peut être une vraie température... mais si ça ne bouge jamais, c'est suspect !
Valeur brute : Le scratchpad contient 0x00 0x00.
🔧 Causes et solutions :
CauseExplicationSolutionFaux DS18B20 (clone)Certains clones bon marché renvoient toujours 0°CAchète un capteur authentique MaximMauvaise adresseTu lis le mauvais index de capteurUtilise getDeviceCount() pour vérifierCorruption mémoireLe scratchpad est effacé (rare)Reset le capteur : débranche 5 secondesVraie températureIl fait vraiment 0°C !Teste : pince le capteur, ça doit monter
✅ Test d'authenticité :
void verifierCapteur() {
capteurs.requestTemperatures();
delay(800);
float temp1 = capteurs.getTempCByIndex(0);
// Pince le capteur 5 secondes
Serial.println("Pince le capteur maintenant !");
delay(5000);
capteurs.requestTemperatures();
delay(800);
float temp2 = capteurs.getTempCByIndex(0);
if (abs(temp2 - temp1) < 0.5) {
Serial.println("⚠️ Capteur suspect (pas de variation)");
} else {
Serial.println("✓ Capteur fonctionne correctement");
}
}
🌡️ Erreur n°4 : Valeurs erratiques (ex: 127°C, -55°C aléatoire)
Ce que tu vois :
Temperature : 24.5 °C
Temperature : 127.0 °C
Temperature : 23.8 °C
Temperature : -55.0 °C
Temperature : 24.2 °C
Qu'est-ce que ça signifie ?
Des interférences électromagnétiques perturbent la communication 1-Wire. C'est comme essayer de téléphoner pendant un orage : le message est brouillé !
🔧 Solutions par ordre d'efficacité :
Ajoute un condensateur de filtrage :
Condensateur 100nF (0,1µF) entre VCC et GND du capteur
→ Filtre les parasites haute fréquence
Raccourcis les fils :
Sans blindage : < 3 mètres max
Avec câble blindé : jusqu'à 20 mètres
Vérifie la résistance pull-up :
Trop forte (10 kΩ) : signaux faibles
Trop faible (1 kΩ) : trop de courant
Idéal : 4,7 kΩ (ou 3,3 kΩ pour fils longs)
Éloigne des sources d'interférences :
Moteurs électriques
Transformateurs
WiFi/Bluetooth
Alimentations à découpage
✅ Code avec détection d'erreur CRC :
void loop() {
capteurs.requestTemperatures();
delay(800);
float temp = capteurs.getTempCByIndex(0);
// Vérifie si la valeur est dans une plage réaliste
if (temp > -55 && temp < 125) {
Serial.print("✓ Temperature valide : ");
Serial.println(temp);
} else {
Serial.println("❌ Erreur : valeur hors limites !");
Serial.println("→ Vérifie le câblage et les interférences");
}
delay(1000);
}
🔌 Erreur n°5 : Valeur qui se fige après un moment
Ce que tu vois :
Temperature : 24.5 °C
Temperature : 24.8 °C
Temperature : 25.1 °C
Temperature : 25.1 °C ← Figé !
Temperature : 25.1 °C
Qu'est-ce que ça signifie ?
Le capteur a probablement perdu l'alimentation ou le bus 1-Wire s'est "planté".
🔧 Solutions :
-
Alimentation insuffisante :
Vérifie que ton Arduino fournit bien 5V stable
N'alimente pas trop de capteurs sur le même bus (max 10-20 selon les fils)
Utilise une alimentation externe si besoin
Reset automatique du bus :
void loop() {
capteurs.requestTemperatures();
delay(800);
float temp = capteurs.getTempCByIndex(0);
// Détecte si la valeur ne change jamais
static float dernierTemp = 0;
static int compteurFige = 0;
if (abs(temp - dernierTemp) < 0.01) {
compteurFige++;
if (compteurFige > 10) { // 10 lectures identiques
Serial.println("⚠️ Capteur figé, reset du bus...");
capteurs.begin(); // Réinitialise
compteurFige = 0;
}
} else {
compteurFige = 0;
}
dernierTemp = temp;
Serial.println(temp);
delay(1000);
}
📊 Tableau récapitulatif des codes d'erreur
Valeur affichéeValeur bruteSignificationSolution rapide-127°C0xFF50Aucun capteur détectéVérifie résistance pull-up et câblage85°C0x0550Lecture avant conversionAttends 750ms après requestTemperatures()0°C0x0000Clone ou mauvaise adresseTeste en pinçant, vérifie authenticitéValeurs follesVariableInterférences/CRC invalideCondensateur 100nF, raccourcis filsValeur figéeN/APerte alimentation/bus plantéReset du bus, vérifie alimentation-55°C/-67°F0xFC90Limite basse atteinteTempérature réelle ou capteur défectueux125°C/257°F0x07D0Limite haute atteinteTempérature réelle ou surchauffe
🛠️ Code de diagnostic complet
Voici un programme qui teste automatiquement ton capteur :
#include <OneWire.h>
#include <DallasTemperature.h>
#define BROCHE_CAPTEUR 2
OneWire oneWire(BROCHE_CAPTEUR);
DallasTemperature capteurs(&oneWire);
void setup() {
Serial.begin(9600);
Serial.println("=== DIAGNOSTIC DS18B20 ===\\n");
capteurs.begin();
capteurs.setWaitForConversion(true);
// Test 1 : Détection
int nb = capteurs.getDeviceCount();
Serial.print("1. Capteurs détectés : ");
Serial.println(nb);
if (nb == 0) {
Serial.println(" ❌ ERREUR : Aucun capteur !");
Serial.println(" → Vérifie résistance pull-up 4,7kΩ");
Serial.println(" → Vérifie GND, VCC, DATA");
return;
} else {
Serial.println(" ✓ OK");
}
// Test 2 : Lecture température
Serial.println("\\n2. Test de lecture...");
capteurs.requestTemperatures();
float temp = capteurs.getTempCByIndex(0);
Serial.print(" Température : ");
Serial.print(temp);
Serial.println(" °C");
if (temp == -127) {
Serial.println(" ❌ Erreur -127°C : capteur non détecté");
} else if (temp == 85) {
Serial.println(" ⚠️ Attention : 85°C = pas de conversion");
Serial.println(" → Augmente le délai ou utilise setWaitForConversion(true)");
} else if (temp == 0) {
Serial.println(" ⚠️ Attention : 0°C suspect (pince le capteur pour tester)");
} else if (temp < -55 || temp > 125) {
Serial.println(" ❌ Valeur hors limites : interférences probables");
Serial.println(" → Ajoute condensateur 100nF");
} else {
Serial.println(" ✓ Valeur cohérente");
}
// Test 3 : Variation
Serial.println("\\n3. Test de variation (pince le capteur 5 sec)...");
float temp1 = temp;
delay(5000);
capteurs.requestTemperatures();
float temp2 = capteurs.getTempCByIndex(0);
float variation = abs(temp2 - temp1);
Serial.print(" Variation : ");
Serial.print(variation);
Serial.println(" °C");
if (variation < 0.3) {
Serial.println(" ⚠️ Pas de variation : capteur figé ou clone");
} else {
Serial.println(" ✓ Capteur réactif");
}
// Test 4 : CRC
Serial.println("\\n4. Test CRC (10 lectures)...");
int erreursCRC = 0;
for (int i = 0; i < 10; i++) {
capteurs.requestTemperatures();
// La bibliothèque vérifie automatiquement le CRC
float t = capteurs.getTempCByIndex(0);
if (t == -127 || t == 85) erreursCRC++;
delay(100);
}
Serial.print(" Erreurs CRC : ");
Serial.print(erreursCRC);
Serial.println(" /10");
if (erreursCRC > 2) {
Serial.println(" ❌ Trop d'erreurs : interférences");
Serial.println(" → Condensateur, fils blindés, pull-up");
} else {
Serial.println(" ✓ Communication stable");
}
Serial.println("\\n=== FIN DIAGNOSTIC ===");
}
void loop() {
// Vide
}
💡 Astuce pro : Lance ce diagnostic avant de créer ton projet. Il détecte 90% des problèmes en 30 secondes !
🔧 Version Optimisée pour Mémoire Limitée
#include <OneWire.h>
#include <DallasTemperature.h>
#define BROCHE_CAPTEUR 2
#define MAX_CAPTEURS 10
OneWire oneWire(BROCHE_CAPTEUR);
DallasTemperature capteurs(&oneWire);
void setup() {
Serial.begin(9600);
Serial.println(F("=== DIAGNOSTIC DS18B20 v2.0 ===\n"));
capteurs.begin();
capteurs.setWaitForConversion(true);
// TEST 1 : Détection
int nbCapteurs = capteurs.getDeviceCount();
Serial.println(F("--- TEST 1 : DETECTION ---"));
Serial.print(F("Capteurs detectes : "));
Serial.println(nbCapteurs);
if (nbCapteurs == 0) {
Serial.println(F("\nERREUR : Aucun capteur !"));
Serial.println(F("SOLUTIONS :"));
Serial.println(F("1. Resistance pull-up 4.7k (DATA->VCC)"));
Serial.println(F("2. Cablage : GND, VCC(5V), DATA(pin2)"));
Serial.println(F("3. Teste autre capteur"));
return;
}
Serial.println(F("OK\n"));
// TEST 2 : Adresses ROM
Serial.println(F("--- TEST 2 : ADRESSES ROM ---"));
DeviceAddress adresse;
for (int i = 0; i < nbCapteurs; i++) {
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
if (capteurs.getAddress(adresse, i)) {
for (uint8_t j = 0; j < 8; j++) {
if (adresse[j] < 16) Serial.print(F("0"));
Serial.print(adresse[j], HEX);
if (j < 7) Serial.print(F(":"));
}
if (adresse[0] == 0x28) {
Serial.println(F(" OK (DS18B20)"));
} else {
Serial.print(F(" Type: 0x"));
Serial.println(adresse[0], HEX);
}
} else {
Serial.println(F("ERREUR lecture"));
}
}
Serial.println();
// TEST 3 : Températures
Serial.println(F("--- TEST 3 : TEMPERATURES ---"));
capteurs.requestTemperatures();
bool tousOK = true;
for (int i = 0; i < nbCapteurs; i++) {
float temp = capteurs.getTempCByIndex(i);
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
Serial.print(temp);
Serial.print(F(" C"));
if (temp == -127.00) {
Serial.println(F(" ERR: Non detecte"));
tousOK = false;
} else if (temp == 85.00) {
Serial.println(F(" ERR: Pas conversion"));
tousOK = false;
} else if (temp == 0.00) {
Serial.println(F(" WARN: 0C suspect"));
} else if (temp < -55 || temp > 125) {
Serial.println(F(" ERR: Hors limites"));
tousOK = false;
} else {
Serial.println(F(" OK"));
}
}
if (!tousOK) {
Serial.println(F("Certains capteurs en erreur"));
}
Serial.println();
// TEST 4 : Réactivité
Serial.println(F("--- TEST 4 : REACTIVITE ---"));
Serial.println(F("Pince capteur 5 sec..."));
capteurs.requestTemperatures();
float temperatures1[MAX_CAPTEURS];
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
temperatures1[i] = capteurs.getTempCByIndex(i);
}
delay(5000);
capteurs.requestTemperatures();
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
float temp2 = capteurs.getTempCByIndex(i);
float variation = abs(temp2 - temperatures1[i]);
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
Serial.print(temperatures1[i], 1);
Serial.print(F(" -> "));
Serial.print(temp2, 1);
Serial.print(F(" C (Delta="));
Serial.print(variation, 2);
Serial.print(F("C)"));
if (variation < 0.3) {
Serial.println(F(" Fige"));
} else {
Serial.println(F(" OK"));
}
}
Serial.println();
// TEST 5 : Stabilité CRC
Serial.println(F("--- TEST 5 : STABILITE CRC ---"));
Serial.println(F("10 lectures..."));
int erreursParCapteur[MAX_CAPTEURS] = {0};
for (int lecture = 0; lecture < 10; lecture++) {
capteurs.requestTemperatures();
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
float temp = capteurs.getTempCByIndex(i);
if (temp == -127 || temp == 85 || temp < -55 || temp > 125) {
erreursParCapteur[i]++;
}
}
delay(100);
}
bool communicationOK = true;
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
Serial.print(erreursParCapteur[i]);
Serial.print(F(" err/10"));
if (erreursParCapteur[i] == 0) {
Serial.println(F(" Excellent"));
} else if (erreursParCapteur[i] <= 2) {
Serial.println(F(" Acceptable"));
} else {
Serial.println(F(" Mauvais"));
communicationOK = false;
}
}
if (!communicationOK) {
Serial.println(F("\nSOLUTIONS :"));
Serial.println(F("1. Condensateur 100nF VCC-GND"));
Serial.println(F("2. Fils courts <3m"));
Serial.println(F("3. Cable blinde si long"));
Serial.println(F("4. Eloigner interferences"));
}
Serial.println();
// TEST 6 : Résolution
Serial.println(F("--- TEST 6 : RESOLUTION ---"));
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
if (capteurs.getAddress(adresse, i)) {
uint8_t resolution = capteurs.getResolution(adresse);
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
Serial.print(resolution);
Serial.print(F(" bits ("));
switch(resolution) {
case 9: Serial.print(F("0.5C,94ms")); break;
case 10: Serial.print(F("0.25C,188ms")); break;
case 11: Serial.print(F("0.125C,375ms")); break;
case 12: Serial.print(F("0.0625C,750ms")); break;
}
Serial.println(F(")"));
}
}
Serial.println();
// RÉSUMÉ
Serial.println(F("=== RESUME ==="));
int capteursOK = 0;
capteurs.requestTemperatures();
for (int i = 0; i < nbCapteurs && i < MAX_CAPTEURS; i++) {
float temp = capteurs.getTempCByIndex(i);
if (temp > -55 && temp < 125 && temp != 85 && temp != -127) {
capteursOK++;
}
}
Serial.print(F("Capteurs OK : "));
Serial.print(capteursOK);
Serial.print(F(" / "));
Serial.println(nbCapteurs);
if (capteursOK == nbCapteurs) {
Serial.println(F("TOUS FONCTIONNENT !"));
} else if (capteursOK > 0) {
Serial.println(F("Certains necessitent attention"));
} else {
Serial.println(F("AUCUN FONCTIONNE"));
}
Serial.println(F("\nDiagnostic termine.\n"));
}
void loop() {
static unsigned long dernierAffichage = 0;
if (millis() - dernierAffichage > 5000) {
dernierAffichage = millis();
Serial.println(F("--- Lecture continue ---"));
capteurs.requestTemperatures();
int nb = capteurs.getDeviceCount();
for (int i = 0; i < nb && i < MAX_CAPTEURS; i++) {
Serial.print(F("Capteur #"));
Serial.print(i);
Serial.print(F(" : "));
Serial.print(capteurs.getTempCByIndex(i));
Serial.println(F(" C"));
}
Serial.println();
}
}
🎯 Checklist de dépannage rapide
Avant de poser une question sur un forum, vérifie dans l'ordre :
-
La résistance 4,7 kΩ est bien présente entre DATA et VCC
-
Le câblage est correct : GND→GND, VCC→5V, DATA→Pin 2
-
Les connexions sont bien enfoncées dans la breadboard
-
Tu attends au moins 750ms après
requestTemperatures()
-
Tu as installé les bibliothèques OneWire et DallasTemperature
-
Le capteur n'est pas un clone de mauvaise qualité
-
Les fils font moins de 3 mètres (ou sont blindés)
-
Il n'y a pas de source d'interférences à proximité
-
L'alimentation 5V est stable (test avec un multimètre)
-
Le code de diagnostic ci-dessus passe tous les tests
Si tout est OK et que ça ne marche toujours pas : Le capteur est probablement défectueux (ça arrive, même aux meilleurs !). Teste avec un autre DS18B20.
7. 🧪 Expérimentation Guidée
Maintenant, amuse-toi à explorer ! Voici des défis progressifs :
Niveau 1 : Touche et observe
Pince le capteur entre tes doigts. La température monte !
Souffle dessus. Elle descend légèrement.
Mets-le près d'une tasse chaude (attention, pas dedans si ce n'est pas la version étanche !).
Niveau 2 : Modifier le code
// Affiche aussi en Fahrenheit
float temperatureF = capteurs.getTempFByIndex(0);
Serial.print(" / ");
Serial.print(temperatureF);
Serial.println(" °F");
Niveau 3 : Ajoute des alertes
if (temperature > 25) {
Serial.println("🔥 Il fait chaud !");
} else if (temperature < 18) {
Serial.println("❄️ Il fait froid !");
}
Niveau 4 : Change la vitesse de mesure
Remplace delay(1000) par delay(500) pour mesurer 2 fois par seconde, ou par delay(5000) pour toutes les 5 secondes.
Niveau 5 : Teste le scratchpad !
Ajoute la fonction afficherScratchpad() de la section bonus dans ton code et appelle-la dans le setup() pour voir les données brutes du capteur. C'est fascinant de voir ce qui se passe réellement !
Niveau 6 : Lance le diagnostic
Utilise le code de diagnostic complet pour tester la santé de ton capteur. C'est comme faire passer un examen médical à ton DS18B20 !
Question ouverte : Que se passe-t-il si tu mesures trop vite ? Teste avec delay(10) ! (Indice : le capteur a besoin de 750ms pour une conversion 12 bits)
8. 🚀 Projet Libre ou Bonus
Idées de projets créatifs :
🌡️ Thermomètre d'aquarium
Utilise la version étanche du DS18B20 pour surveiller la température de l'eau. Ajoute une LED rouge qui s'allume si l'eau est trop chaude (>28°C) et une LED bleue si elle est trop froide (<22°C).
🏠 Station météo miniature
Combine le DS18B20 avec un afficheur LCD pour créer un thermomètre mural. Affiche la température actuelle, minimale et maximale de la journée.
🌱 Serre intelligente
Programme un système qui déclenche un ventilateur (avec un relais) si la température dépasse 30°C, parfait pour protéger tes plantes !
❄️ Détecteur de gel
Crée une alarme sonore (buzzer) qui se déclenche si la température descend sous 2°C, utile pour protéger les canalisations en hiver.
🔍 Détecteur d'anomalies
Utilise la fonction de vérification CRC pour compter et afficher les erreurs de transmission. Si tu vois beaucoup d'erreurs, c'est le signe d'un problème de câblage ou de parasites !
🌈 Multi-capteurs
Branche plusieurs DS18B20 sur la même broche et compare les températures de différentes pièces ! (Cherche "DS18B20 multiple sensors" pour le code adapté)
📊 Logger de température
Enregistre les températures sur une carte SD avec horodatage. Idéal pour analyser les variations sur 24h ou plus !
Défi ultime expert :
Programme les alarmes internes du DS18B20 (octets 2 et 3 du scratchpad) pour que le capteur lui-même signale quand il dépasse un seuil, sans que l'Arduino ait besoin de vérifier constamment !
9. 📝 Résumé
Ce que tu as appris aujourd'hui :
✅ Le DS18B20 est un capteur de température numérique précis et facile à utiliser
✅ Il communique via le protocole 1-Wire (un seul fil de données)
✅ Une résistance de 4,7 kΩ est indispensable entre DATA et VCC
✅ Les bibliothèques OneWire et DallasTemperature simplifient la programmation
✅ Tu peux mesurer de -55°C à +125°C avec une précision de ±0,5°C
✅ Il existe en version étanche pour mesurer la température de liquides
✅ BONUS : Le scratchpad contient 9 octets d'informations (température, config, CRC)
✅ BONUS : Le CRC vérifie l'intégrité des données pour éviter les erreurs
✅ BONUS : Tu peux ajuster la résolution (9 à 12 bits) selon tes besoins vitesse/précision
✅ NOUVEAU : Tu sais décoder les codes d'erreur (-127°C, 85°C, 0°C, etc.)
✅ NOUVEAU : Tu peux diagnostiquer et résoudre 90% des problèmes courants
Le + important : Tu es maintenant capable de créer des projets intelligents qui réagissent à la température, ET de résoudre les problèmes quand ça ne marche pas ! C'est une compétence clé pour la domotique, les objets connectés, et plein d'autres applications créatives. Et si tu as exploré les bonus, tu comprends même comment le capteur communique réellement avec l'Arduino et comment détecter les erreurs !
Prochaines étapes : Combine ce capteur avec des actionneurs (LED, relais, moteurs) pour créer des systèmes automatisés qui réagissent à la température !
10. 📚 Ressources Complémentaires
Pour aller plus loin :
🌐 Documentation officielle :
Site Arduino.cc : cherche "DS18B20 tutorial"
Datasheet du DS18B20 (spécifications techniques complètes, PDF gratuit chez Maxim)
Protocole 1-Wire de Maxim/Dallas : explications détaillées du bus de communication
Application Note 162 : "Interfacing the DS18X20 with Microcontrollers"
🎥 Tutoriels recommandés :
Cherche "DS18B20 Arduino français" sur YouTube pour des vidéos explicatives
PlaisirArduino.fr pour d'autres projets ludiques
"DS18B20 scratchpad explained" pour comprendre les données brutes
"DS18B20 troubleshooting" pour le dépannage avancé
📖 Bibliothèques utilisées :
DallasTemperature sur GitHub (exemples avancés inclus)
OneWire sur Arduino.cc (pour comprendre le protocole)
Exemples intégrés dans l'IDE : Fichier → Exemples → DallasTemperature
🛠️ Projets inspirants :
"Arduino temperature logger" : enregistre les températures sur carte SD
"Multiple DS18B20 sensors" : utilise plusieurs capteurs simultanément
"DS18B20 with LCD display" : affiche les données sur un écran
"DS18B20 alarm function" : configure les seuils d'alarme internes
"DS18B20 CRC error handling" : gère les erreurs de transmission
"DS18B20 waterproof aquarium" : surveillance de température aquatique
🔬 Pour les experts :
OneWire Search Algorithm : pour découvrir automatiquement tous les capteurs sur le bus
Parasitic power mode : alimenter le DS18B20 avec seulement 2 fils !
Résolution adaptative : change la résolution selon la vitesse souhaitée
Interruptions et callbacks : lecture asynchrone sans bloquer le programme
🚨 Dépannage et forums :
Forum Arduino francophone : entraide communautaire
Reddit r/arduino : projets et support international
Stack Exchange Arduino : questions techniques avancées
GitHub Issues des bibliothèques : bugs connus et solutions
💡 Astuce finale : Joins des communautés en ligne (forums Arduino, Reddit r/arduino) pour partager tes créations et trouver de l'aide. Les makers adorent aider les débutants ! N'hésite pas à poser des questions sur le scratchpad, le CRC ou les codes d'erreur, c'est en explorant qu'on apprend le mieux.
📊 Outils de diagnostic :
Utilise le moniteur série pour afficher les données brutes du scratchpad
Compte les erreurs CRC sur 100 lectures pour évaluer la qualité de ton bus
Compare les différentes résolutions (9-12 bits) pour trouver le bon compromis
Lance le code de diagnostic complet avant chaque nouveau projet
🛒 Acheter des composants de qualité :
Privilégie les DS18B20 authentiques Maxim (logo Maxim sur le chip)
Méfie-toi des lots ultra bon marché sur AliExpress (beaucoup de clones)
Les versions étanches coûtent 2-3€ de plus mais sont ultra pratiques
Achète plusieurs résistances 4,7 kΩ (elles se perdent facilement !)
Félicitations ! Tu viens de maîtriser un capteur professionnel utilisé dans l'industrie, tu comprends même comment il fonctionne au niveau des données brutes, ET tu sais résoudre les problèmes comme un pro ! Continue d'expérimenter, tu es sur la bonne voie ! 🎉🌡️🚀