Sonde DS18B20 et -127°C

Bonjour,
dans le cadre d'un projet personnel j'utilise des capteurs DS18b20 filaires reliés à un Arduino nano pour faire des mesures de température au cours du temps.
Mon programme semble fonctionner puisqu'il permet d'afficher les températures mais chaque température est -127°C
Le programme est le suivant:

// Inclure les bibliothèques Arduino requises :
#include <OneWire.h>
#include <DallasTemperature.h>

// Définir à quelle broche de l'Arduino le bus 1-Wire est connecté :
#define ONE_WIRE_BUS 2

// Créer une nouvelle instance de la classe OneWire pour communiquer avec n'importe quel appareil OneWire :
OneWire oneWire(ONE_WIRE_BUS);

// Passez la référence oneWire à la bibliothèque DallasTemperature :
DallasTemperature capteurs(&oneWire);

void setup() {
  // Commencer la communication série à un débit en bauds de 9 600 :
  Serial.begin(9600);
  // Démarrez la bibliothèque :
  capteurs.begin();
}

void loop() {
  // Envoyer la commande à tous les appareils sur le bus pour effectuer une conversion de température :
  capteurs.requestTemperatures();

  // Récupérer la température en degrés Celsius pour l'index de l'appareil :
  float tempC = capteurs.getTempCByIndex(0); // l'index 0 fait référence au premier appareil
  // Récupérer la température en degrés Fahrenheit pour l'index de l'appareil :
  float tempF = capteurs.getTempFByIndex(0);

  // Imprimer la température en Celsius dans le Serial Monitor :
  Serial.print("Température : ");
  Serial.print(tempC);
  Serial.print(" \xC2\xB0"); // affiche le symbole du degré
  Serial.print("C | ");

  // Imprimer la température en Fahrenheit
  Serial.print(tempF);
  Serial.print(" \xC2\xB0"); // affiche le symbole du degré
  Serial.println("F");

  // Attendre 1 seconde :
  delay(1000);
}

J'ai tenté de modifier le montage, de changer de capteur, de changer les fils et la résistance mais j'obtiens toujours le même résultat. La résistance est de 4,7 Kilo Ohm d'après les recommandations que j'ai trouvé

En espérant que vous pourrez m'aider

hello
-127° ==> problème de connectique
je viens de tester ton prog, il fonctionne

passes le prog suivant, il te dira s'il trouve ta sonde

/**
 * Scanner 1-Wire (Dallas) pour cartes Arduino et compatible.
 */

/* Dépendances */
#include <OneWire.h>
#include <avr/pgmspace.h>

/** Broche pour le bus 1-Wire */
const byte ONEWIRE_BUS_PIN = 2;

/** L'object OneWire pour communiquer via le protocole 1-Wire sur la broche spécifiée */
OneWire ds(ONEWIRE_BUS_PIN);

/** Fonction setup() */
void setup(void) {
  
  /* Initialise le port série */
  Serial.begin(115200);
  Serial.println(F("~~ Scanner 1-Wire ~~"));
}

/** Fonction loop() */
void loop(void) {
  byte address[8];
  
  /* Cherche un module 1-Wire sur le bus */
  if (!ds.search(address)) {
    Serial.println(F("End of Scan."));
    ds.reset_search();
    for(;;);
  }
  
  /* Module 1-Wire découvert ! */
  Serial.print(F("Found "));
  for(byte i = 0; i < 8; ++i) {
    if (address[i]<0x10) Serial.print("0");
    Serial.print(address[i], HEX);
    Serial.write(' ');
  }

  /* Vérifie si l'adresse est valide */
  if (OneWire::crc8(address, 7) != address[7]) {
      Serial.print(F("(CRC invalid)"));
  }
  
  /* Affiche les informations sur le module */
  Serial.println(get_onewire_family_description(address));
}

/* Dictionnaire des modules 1-Wire connus */
const __FlashStringHelper * get_onewire_family_description(const byte * address) {
  switch(address[0]) {
    case 0: return F("(Link locator): Provide location information");
    case 1: return F("(DS2401, DS1990R, DS2411, DS2490A, DS1990A): 1-Wire serial number");
    case 2: return F("(DS1425, DS1991): Multikey iButton secure memory");
    case 4: return F("(DS2404, DS1994): Econoram NVRAM memory and clock, timer, alarms");
    case 5: return F("(DS2405): Single addressable switch");
    case 6: return F("(DS1993): 4Kb NVRAM memory");
    case 8: return F("(DS1992): 1Kb NVRAM memory");
    case 9: return F("(DS2704, DS2703, DS2502, DS1982): 1Kb EPROM memory");
    case 10: return F("(DS1995): 16Kb NVRAM memory");
    case 11: return F("(DS2505, DS1985): 16Kb EPROM memory");
    case 12: return F("(DS1996): 64Kb NVRAM memory");
    case 15: return F("(DS2506, DS1986): 64Kb EPROM memory");
    case 16: return F("(DS1920, DS18S20): High precision digital thermometer with alarm trips");
    case 18: return F("(DS2406, DS2407): 1Kb EPROM memory, two channel addressable switch");
    case 20: return F("(DS2430A, DS1971): 256-bit EEPROM memory and 64-bit OTP register");
    case 22: return F("(DS1954, DS1957): crypto-ibutton");
    case 24: return F("(DS1963S, DS1962): SHA iButton");
    case 26: return F("(DS1963L): 4Kb NVRAM memory with write cycle counters");
    case 27: return F("(DS2436): Battery monitor and ID");
    case 28: return F("(DS28E04-100): 4Kb EEPROM memory, two channel addressable switch");
    case 29: return F("(DS2423): 4Kb NVRAM memory with external counters");
    case 30: return F("(DS2437): Battery monitor");
    case 31: return F("(DS2409): Microhub, two channel addressable coupler for sub-netting");
    case 32: return F("(DS2450): Quad channel A/D converter");
    case 33: return F("(DS1921, DS1921H, DS1921Z, DS1921G): Thermochron temperature logger");
    case 34: return F("(DS1822, DS1922): Econo Digital Thermometer");
    case 35: return F("(DS1973, DS2433): 4Kb EEPROM memory");
    case 36: return F("(DS1904, DS2415): Real-time clock (RTC)");
    case 38: return F("(DS2438): Smart battery monitor");
    case 39: return F("(DS2417): Real-time clock (RTC) with interrupt");
    case 40: return F("(DS18B20): Programmable resolution digital thermometer");
    case 41: return F("(DS2408): 8-channel addressable switch");
    case 44: return F("(DS2890): 1-channel digital potentiometer");
    case 45: return F("(DS1972, DS2431): 1Kb EEPROM memory");
    case 46: return F("(DS2770): Battery monitor and charge controller");
    case 48: return F("(DS2760, DS2762, DS2761): High precision li+ battery monitor with alerts");
    case 49: return F("(DS2720): Single-cell rechargable lithium battery protection and ID");
    case 50: return F("(DS2780): Battery");
    case 51: return F("(DS1961S, DS2432): 1Kb protected EEPROM with SHA-1");
    case 52: return F("(DS2703): SHA-1 Battery");
    case 53: return F("(DS2755): Battery");
    case 54: return F("(DS2740): High precision Coulomb counter");
    case 55: return F("(DS1977): Password-protected 32KB (bytes) EEPROM");
    case 58: return F("(DS2413): Dual channel addressable switch");
    case 59: return F("(DS1825, MAX31826): Temperature and memory");
    case 61: return F("(DS2781): Battery");
    case 65: return F("(DS1922L, DS2422, DS1922T, DS1923): High-capacity Thermochron (temperature) and Hygrochron (humidity) loggers");
    case 66: return F("(DS28EA00): Programmable resolution digital thermometer with sequenced detection and PIO");
    case 67: return F("(DS28EC20): 20Kb EEPROM memory");
    case 68: return F("(DS28E10): SHA-1 Authenticator");
    case 81: return F("(DS2751): Battery monitor and level gauge");
    case 126: return F("(EDS00xx): Environmental Monitors");
    case 129: return F("(DS1420): Serial ID Button");
    case 130: return F("(DS1425): Authorization");
    case 132: return F("(DS2404S): Dual port plus time");
    case 137: return F("(DS2502-UNW, DS1982U, DS2502-E48): Uniqueware 48-bits node address chip");
    case 139: return F("(DS2505-UNW, DS1985U): Uniqueware 16Kb add-only memory");
    case 143: return F("(DS1986U, DS2506-UNW): Uniqueware 64k add-only memory");
    case 160: return F("(mRS001): Rotation Sensor");
    case 161: return F("(mVM001): Vibration");
    case 162: return F("(mCM001): AC Voltage");
    case 166: return F("(mTS017): IR Temperature");
    case 177: return F("(mTC001): Thermocouple Converter");
    case 178: return F("(mAM001): DC Current or Voltage");
    case 179: return F("(mTC002): Thermocouple Converter");
    case 238: return F("(UVI): Ultra Violet Index");
    case 239: return F("(Moisture Hub): Moisture meter, 4 channel hub");
    case 252: return F("(BAE0910, BAE0911): Programmable Microprocessor");
    case 255: return F("(LCD): Swart LCD (Swart)");
    default: return F("(unknown) : Unknown 1-Wire device");
  }
}

cher moi il trouve bien "l'adresse de la sonde"

Merci beaucoup.
En effet je n'ai rien qui s'affiche en utilisant votre programme. J'en déduis qu'il ne détecte pas ma sonde. Peut être auriez vous une solution pour cette situation?
voilà ce que j'ai:
21:55:17.753 -> ��������?'������\�

Bonjour @maelle_gchrd , avez vous mi la communication série a 115200 ? C'est juste pour savoir, voir si c'est ça :slightly_smiling_face: Dans votre code elle est a 9600.

oui, c'est bien un problème de réglage de la vitesse de com
ton moniteur doit être en 115200 Bauds

Bonjour @dfgh et @pandaroux007 et merci beaucoup pour vos réponses. En changeant la vitesse à 115200 je détecte désormais la sonde grâce à votre code. Néanmoins, j'ai toujours -127°C qui s'affiche en continu et je ne sais toujours pas d'où cela peut venir. Peut-être avez-vous une idée

hello
je viens de remettre ton code dans un uno équipé d' une sonde
j'ai ouvert le moniteur et peu de temps après, j'ai débranché le fil de data qui était sur D2

tu peux voir le résultat : -127°

tu n'as pas de mauvais contacts ?tes branchements sont fiables?
ta résistance est de 4.7K tu es sur? pas d'erreur ?

un lien ICI

il faudra changer le titre de ton post. car il n'est pas parlant pour quelqu'un qui cherche sur le forum
par exemple, tu peux mettre : "Sonde DS18B20 et -127"

Je suis sûre pour la résistance, c'est bien 4,7K. En revanche il est possible qu'il y ait des mauvais contacts au niveau de mon capteur comme les fils sont courts . Pour les branchements, j'ai bien suivi le protocole.

Bonsoir,
je tenais à vous remercier pour votre temps. J'ai enfin réussi à résoudre mon problème. Il s'agissait bien d'un mauvais contact. L'Arduino détectait bien la sonde mais ne recevait pas les données.

hello
merci du retour

Bonsoir,
je me redirige vers vous en espérant que vous pourrez m'aider.
J'ai modifié mon code pour deux sondes DS18b20 et voici ce que j'obtiens:

18:44:33.085 -> Température Sonde 1: 20.56 °C | Température Sonde 2: -127.00 °C

18:44:35.496 -> Température Sonde 1: 20.56 °C | Température Sonde 2: -127.00 °C

18:44:37.912 -> Température Sonde 1: 20.56 °C | Température Sonde 2: -127.00 °C

18:44:40.367 -> Température Sonde 1: 20.56 °C | Température Sonde 2: -127.00 °C

18:44:42.757 -> Température Sonde 1: 20.62 °C | Température Sonde 2: -127.00 °C

Mon code est le suivant:

#include <OneWire.h>
#include <DallasTemperature.h>

// Définir les broches de l'Arduino à utiliser pour chaque sonde :
#define SONDE_1_BUS 6
#define SONDE_2_BUS 4

// Créer des instances de la classe OneWire pour communiquer avec chaque sonde :
OneWire oneWireSonde1(SONDE_1_BUS);
OneWire oneWireSonde2(SONDE_2_BUS);

// Passer les références oneWire à la bibliothèque DallasTemperature pour chaque sonde :
DallasTemperature capteursSonde1(&oneWireSonde1);
DallasTemperature capteursSonde2(&oneWireSonde2);

void setup() {
  // Commencer la communication série à un débit en bauds de 9600 :
  Serial.begin(115200);

  // Démarrer la bibliothèque pour chaque sonde :
  capteursSonde1.begin();
  capteursSonde2.begin();
}

void loop() {
  // Envoyer la commande à toutes les sondes pour effectuer une conversion de température :
  capteursSonde1.requestTemperatures();
  capteursSonde2.requestTemperatures();

  // Récupérer la température en degrés Celsius pour chaque sonde :
  float tempC1 = capteursSonde1.getTempCByIndex(0); // l'index 0 fait référence à la première sonde
  float tempC2 = capteursSonde2.getTempCByIndex(0); // l'index 0 fait référence à la deuxième sonde

  // Imprimer la température en Celsius pour chaque sonde dans le moniteur série :
  Serial.print("Température Sonde 1: ");
  Serial.print(tempC1);
  Serial.print(" \xC2\xB0"); // affiche le symbole du degré
  Serial.print("C | ");

  Serial.print("Température Sonde 2: ");
  Serial.print(tempC2);
  Serial.print(" \xC2\xB0"); // affiche le symbole du degré
  Serial.println("C");

  // Attendre 1 seconde :
  delay(1000);
}

Je pense que le problème doit provenir de mon montage.
J'ai branché la deuxième sonde comme la première avec une résistance de 4,7ko.
J'ai essayé de changer les fils, de retirer une résistance puis la deuxième, de relier les capteurs entre eux (dans ce cas les deux températures étaient identiques).
Peut-être pourriez-vous me renseigner.

hello
dans "fichiers", "exemples"," DallasTemperautre", tu vas trouver un prog nommé "multiples"
tu le téléverses dans ton arduino, tu câbles les deux sondes sur le même bus .

J'ai testé et j'ai bien deux températures mais c'est deux fois la même. Quand je tiens un des capteurs, les deux températures augmentent.

Peut être parce que tu ne lis qu'un seul capteur ?
Est-tu sure de bien distinguer les capteurs ?

Je n'en suis pas sûre justement. comment je peux le vérifier?

Tu peux faire et comprendre l'exemple "multicapteurs" qui t'a été suggéré.
Il doit y avoir une explication ou un mode d'emploi pour récupérer l'adresse des capteurs.

En vérification :
Tu en met un au froid et l'autre au chaud.
Tu en retire un -> qu'est ce cela donne ?
Tu inverses le capteur que tu retire -> qu'est ce cela donne ?

Bonsoir
Dans les exemples de la bibliographie Dallas tu as tout.

Dans un exemple, ils te donnent la possibilité de récupérer les adresses des sondes.

si tu as un -127 c.est une erreur de branchement ou ta sonde est morte.

Pourquoi tu utilises deux bus ? Un seul suffit et en plus avec un bus tu n.as qu’une résistance de 4,7k à mettre.

Fait tes essais avec une seule sonde comme au début puis tu changes de sonde comme ça tu sauras si tes sondes sont ok.

Suis bien les exemples de la bibliothèque Dallas, ils sont bien faits et pas compliqués et applique toi sur les raccordements pour éviter les mauvais contacts

Merci pour vos réponses. Je vais regarder tout ça. J'ai en effet deux résistances branchées donc mon montage n'est déjà pas correct.

Bien sûr que si ton montage est bon puisque tu as deux bus

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.