Bonjour à tous,
je n’arrive pas à faire fonctionner mes sondes de température DS18b20 sur un Wemos D1 alors que sur arduino uno c’est OK.
Quel pourrait en être la raison ?
J’ai essayé avec une résistance de tirage de 4,7K et aussi 3K
c’est la même chose le Wemos ne voit rien !
Ni l’adresse ni la température.
J’ai essayé plusieurs sketchs.
Merci d'avance pour votre aide
Quel montage ?
Bonjour , merci J-M-L de t'intéresser au problème
Ce sont des sondes Ds18b20 étanches:
fil rouge au +5V
fil noir au Gnd
fil jaune à D2 du Wemos par exemple
et résistance de 4,7K entre fil jaune et +5V
j'ai essayé aussi avec une seule à la fois
Bonjour
D2 (GPIO4) doit pouvoir convenir
Pourquoi alimenter le DS18B20 en 5V ?
L'ESP8266 n'est pas conçu pour résister à coup sûr à cette tension sur un GPIO (avis de son fabricant)
Alimenter donc le DS18B20 en 3,3V , idem pour la résistance qui peut alors être abaissée à 3,3K
Quelle librairie est utilisée ?
Pour info j'ai plusieurs cartes Lolin D1 Mini ou D1 MIni LIte qui fonctionnent en permanence sans aucun problème depuis 2 ans avec un DS18B20 alimenté en 3,3V et relié à D6 (GPIO12)
Librairies utilsées : One Wire et Dallas Température
Oui, j'avais en premier essayé d'alimenter en 3V3 , c'est pareil
j'utilise Onewire.h
un des sketchs utilisé par exemple :DS18B20_détection_des_capteurs _présents
de X. HINAULT - www.mon-club-elec.fr
3,3V est une condition nécessaire mais pas suffisante !
Le site mon-club-elec donne , en français, de bonnes infos génériques pour Arduino mais pas forcément à jour pour les ESP divers, inexsistants quand les pages ont été rédigées.
Avec des librairies récentes (compatibles ESPxxxx) il n'y a pas de problème pour exploiter ds DS18B20 avec un ESP8266
Essayer OneWire 2.3.5 + DallasTemperature 3.9.0 et son exemple Simple.ino ou Single.ino
Attention dans le déclaration de la broche où est reliée le capteur , ne pas confondre le n° du GPIO et le numéro de la sortie D , bien décalrer 4 pour D2
hello
chez moi:
wemos d1
#include <DallasTemperature.h>
et pour les sondes:
/*
les sondes sont reliées :
fil rouge au +5V
fil noir a GND
fil jaune a D3 de la platine arduino
une résistance de 4.7K sera montée entre le + 5V et D3 de la platine arduino
à la premiere execution, les flags d'autorisation d'affichage sur moniteur étant validés
boolean affichage = true;//autorisation generale d affichage au moniteur
boolean affichage_loop = true;//tout affichage avec la loop
boolean affichage_temperatures = true;//tout affichage avec l onglet temperatures
le prg recherche les sondes sur le bus et affiche leurs adresses
il faut ensuite renseigner les Device adresses dans le tabeau qui est prevu a cet effet
DeviceAddress sonde_haute = { 0x28, 0xFF, 0x4F, 0x98, 0x74, 0x16, 0x03, 0xE6 };
une fois ces adresses renseignees, il est possible de supprimer l'affichage de ces adresses au moniteur en mettant
*/
void setup_sondes()
{
OneWire begin(); // Initialisation de l'interface I2C pour l'horloge DS 3231 et LCD i2C. if((affichage)&(affichage_set_up))
//{
//Serial.print(F("affichage = "));Serial.println (affichage);
//Serial.print(F("affichage_set_up = "));Serial.println (affichage_set_up);
//Serial.print(F("affichage_temperatures = "));Serial.println (affichage_temperatures);
//}
sensors.begin();
nb_sondes = sensors.getDeviceCount();
if ((affichage) & (affichage_set_up))
{
Serial.println();
Serial.print(F("Nombre de capteurs trouves sur le BUS = "));
Serial.println(nb_sondes); Serial.println(F(" aux adresses: "));
for (int f = 1; f <= nb_sondes; f++)
{
if ( !oneWire.search(addr))
{
Serial.println(F("/////////// pas d'autres sondes trouvees. ///////////"));
oneWire.reset_search();
delay(250);
return;
}
Serial.print(F("sonde Numero ")); Serial.print(compteur_s);
Serial.print(F(" ")); Serial.print(tab_nom_sondes[compteur_s] );
Serial.print(F(" est a l'adresse {"));
for ( int i = 0; i < 8; i++)
{
Serial.print(F("0x"));
Serial.print(addr[i], HEX);
if (i < 7) Serial.print(F(", "));
}
Serial.println(F("}"));
compteur_s++;
}
}
// fixe la resolution des capteurs à 10 bits (choix entre 9 et 12))
sensors.setResolution(sonde_haute, 10);
sensors.setResolution(sonde_basse, 10);
if ((affichage) & (affichage_set_up)) {
Serial.println(F(" fin du set up"));
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
void lecture_sondes_temperature()
{
compteur_sondes = 0;
sensors.requestTemperatures();
temperature_haute = printTemperature(sonde_haute);
temperature_basse = printTemperature(sonde_basse);
//lcd.setCursor(0,0);
// lcd.print(F("temp : "));
// lcd.print(tab_T[0]);
// lcd.write('\xDF');
if ((affichage) & (affichage_temperatures))
{
// Serial.println(F(" "));Serial.println(F("lecture et stockage des temperatures"));
// for( int i=0;i<nb_sondes;i++){Serial.print(tab_nom_sondes[i]);Serial.print(F("\t "));}
// Serial.println(F(""));
// for( int i=0;i<nb_sondes;i++){Serial.print(temperature_haute);Serial.print(F("\t"));Serial.print(temperature_basse);}
// Serial.println(F(""));
}
}
//////////////////////////////////////////////////////////////////////////////
float printTemperature(DeviceAddress deviceAddress)
{
compteur_sondes++;
float tempC = sensors.getTempC(deviceAddress);//lecture des sondes
if (tempC == -127.00) //Vérifications si erreurs
{
if (compteur_sondes < nb_sondes)
{
if ((affichage) & (affichage_sondes))
{
Serial.print(F("probleme de sonde ")); Serial.print(tab_nom_sondes[compteur_sondes - 1] ); Serial.print(F(" numero ")); Serial.println(compteur_sondes - 1);
}
}
tempC = 0;
return tempC;
}
else //affichage temperature
{
if ((affichage) & (affichage_sondes))
{
//Serial.print(F("sonde "));Serial.print(tab_nom_sondes[compteur_sondes-1] );Serial.print(F(" numero ")); Serial.print(compteur_sondes-1);Serial.print(F(" est ok "));Serial.println(tempC);
}
}
return tempC;
}
//****************************************************************************************************
//fin de l'onglet
//****************************************************************************************************
Bonjour dfgh,
j'essaie de mettre votre sketch après avoir ajouté au début la ligne
pour inclure DallasTemperature
mais à la compilation j'ai
"sensors' was not declared in this scope
le bout de prg précédent fait partie d'un prg plus conséquent
voici le même bout de prg, mais autonome, c'est celui qui m'avait servit à vérifier cette partie du code
reviens nous voir si tu ne t'en sors pas
/*
les sondes sont reliées :
fil rouge au +5V
fil noir a GND
fil jaune a D3 de la platine arduino
une résistance de 4.7K sera montée entre le + 5V et D3 de la platine arduino
à la premiere execution, les flag d'autorisation d'affichage sur moniteur étant validés
boolean affichage = true;//autorisation generale d affichage au moniteur
boolean affichage_loop = true;//tout affichage avec la loop
boolean affichage_temperatures = true;//tout affichage avec l onglet temperatures
le prg rechreche les sondes sur le bus et affiche leurs adresses
il faut ensuite renseigner les Device adresses dans le tabeau qui est prevu a cet effet
DeviceAddress Sonde_1 = { 0x28, 0xFF, 0x4F, 0x98, 0x74, 0x16, 0x03, 0xE6 };
une fois ces adresses renseignees, il est possible de supprimer l'affichage de ces adresses au moniteur en mettant
*/
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_PIN 3 // sondes DS18B20 sur pin 5 mega 2560
OneWire oneWire(ONE_WIRE_BUS_PIN);//bus pour com avec les sondes
DallasTemperature sensors(&oneWire);
byte addr[7]; //pour reconnaissance adresses des sondes
//********************************************************************************
//declaratrion des variables ayant rapport avec les sondes de temperature
//********************************************************************************
float tab_T [10];
int nb_sondes = 0;//ne pas modifier, c'est bien = 0 qu'il faut
int compteur_sondes = 0;//dans le setup, le prg reconnait les sondes
int compteur_s = 0;//et en fait le compte
float sonde_turbine = 0;//temperature, donc en flottant
float sonde_froid = 0;
DeviceAddress sonde_turbine = { 0x28, 0xFF, 0x00, 0x94, 0x74, 0x16, 0x03, 0x72 }; //adresse propre à chaque sonde
//DeviceAddress Sonde_1 = { 0x28, 0xDC, 0xDA, 0x8E, 0x04, 0x00, 0x00, 0x16 }; //adresse propre à chaque sonde
DeviceAddress sonde_froid = { 0x28, 0xFF, 0x20, 0xD1, 0x81, 0x15, 0x02, 0x58 }; //lors du set up, le prg scrute
//prg prevu pour 16 sondes, mais le tout est modulable
char* tab_nom_sondes[] {"Temp_turbine ", "Temp_froid ",};
//********************************************************************************
//declaratrion des flags d autorisation d affichage de differentes rubriques du prg
//********************************************************************************
//affichage = false interdira tous les affichages vers le moniteur conditionnes a sa valeur
boolean affichage = true;//autorisation generale d affichage au moniteur
boolean affichage_set_up = true;//tout affichage avec le set up
boolean affichage_temperatures = true;//tout affichage avec lecture temperatures
boolean affichage_sondes = true;//affiche si sonde en cours est ok ou hs
//********************************************************************************
//fin de l onglet declarations
//********************************************************************************
void setup()
{
Serial.begin(115200);
Wire.begin(); // Initialisation de l'interface I2C pour l'horloge DS 3231 et LCD i2C. if((affichage)&(affichage_set_up))
{
Serial.print(F("affichage = ")); Serial.println (affichage);
Serial.print(F("affichage_set_up = ")); Serial.println (affichage_set_up);
Serial.print(F("affichage_temperatures = ")); Serial.println (affichage_temperatures);
}
sensors.begin();
nb_sondes = sensors.getDeviceCount();
if ((affichage) & (affichage_set_up))
{
Serial.println();
Serial.print(F("Nombre de capteurs trouves sur le BUS = "));
Serial.println(nb_sondes); Serial.println(F(" aux adresses: "));
for (int f = 1; f <= nb_sondes; f++)
{
if ( !oneWire.search(addr))
{
Serial.println(F("/////////// pas d'autres sondes trouvees. ///////////"));
oneWire.reset_search();
delay(250);
return;
}
Serial.print(F("sonde Numero ")); Serial.print(compteur_s);
Serial.print(F(" ")); Serial.print(tab_nom_sondes[compteur_s] );
Serial.print(F(" est a l'adresse {"));
for ( int i = 0; i < 8; i++)
{
Serial.print(F("0x"));
Serial.print(addr[i], HEX);
if (i < 7) Serial.print(F(", "));
}
Serial.println(F("}"));
compteur_s++;
}
}
// fixe la resolution des capteurs à 10 bits (choix entre 9 et 12))
sensors.setResolution(sonde_turbine, 10);
sensors.setResolution(sonde_froid, 10);
if ((affichage) & (affichage_set_up)) {
Serial.println(F(" fin du set up"));
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
lecture_sondes_temperature();
delay(5000);
}
void lecture_sondes_temperature()
{
compteur_sondes = 0;
sensors.requestTemperatures();
sonde_turbine = printTemperature(Sonde_1); tab_T[0] = sonde_turbine;
sonde_froid = printTemperature(Sonde_2); tab_T[1] = sonde_froid;
lcd.setCursor(0, 0);
lcd.print(F("temp : "));
lcd.print(tab_T[0]);
lcd.write('\xDF');
if ((affichage) & (affichage_temperatures))
{
Serial.println(F(" ")); Serial.println(F("lecture et stockage des temperatures"));
for ( int i = 0; i < nb_sondes; i++) {
Serial.print(tab_nom_sondes[i]);
Serial.print(F("\t "));
}
Serial.println(F(""));
for ( int i = 0; i < nb_sondes; i++) {
Serial.print(tab_T[i]);
Serial.print(F("\t"));
}
Serial.println(F(""));
}
}
//////////////////////////////////////////////////////////////////////////////
float printTemperature(DeviceAddress deviceAddress)
{
compteur_sondes++;
float tempC = sensors.getTempC(deviceAddress);//lecture des sondes
if (tempC == -127.00) //Vérifications si erreurs
{
if (compteur_sondes < nb_sondes)
{
if ((affichage) & (affichage_sondes))
{
Serial.print(F("probleme de sonde ")); Serial.print(tab_nom_sondes[compteur_sondes - 1] ); Serial.print(F(" numero ")); Serial.println(compteur_sondes - 1);
}
}
tempC = 0;
return tempC;
}
else //affichage temperature
{
if ((affichage) & (affichage_sondes))
{
Serial.print(F("sonde ")); Serial.print(tab_nom_sondes[compteur_sondes - 1] ); Serial.print(F(" numero ")); Serial.print(compteur_sondes - 1); Serial.print(F(" est ok ")); Serial.println(tempC);
}
}
return tempC;
}
//****************************************************************************************************
//fin de l'onglet declarations setup loop
//****************************************************************************************************
Coucou,
Un peu HS, mais si tu veux utiliser d'autres puces que les DS18B20, tu peux peut-être regarder aussi du coté de ma librairie OWBus.
Je l'ai fait non seulement pour supporter d'autres models (pour avoir des PIOs par exemples), mais aussi parce que je trouvais la DallasTemperature un peu cracra, pas objet et pas évolutive ![]()
Il y a des exemples pour différent type de sondes, et j'ai même réussi a les faire fonctionner avec le Popup Interne de ESP8266.
La lecture de plusieurs sondes donne ce code et la librairie peut évidemment découvrir elle meme les sondes.
A+
bonjour, désolé mais à la compilation de ton sketch dfgh,
j'ai ce message d'erreur
"conflicting declaration 'uint8_t sonde_turbine [8]'"
hello
voici le code complet, il faudra renseigner tes identifiants dans le debut du 1er onglet
marmite_sans_identifiants.zip (21,0 Ko)
désolé ça ne marche pas , en tout cas ,avec mon Wemos D1
........ou peut être pas avec l'exemplaire de capteur DS18B20........
Quen donnent les exemples les plus simples de la librairie DallasTemperature ?
avec des exemples de la librairie DallasTemperature je n'ai pas de résultat ;
Sur un arduino uno tout va bien avec DS18b20 mais pas sur Wemos pourtant en 3v3 avec R de 3k ,
J'en déduis qu'il doit y avoir une incompatibilité quelque part !
c'est un clone chinois les sondes aussi.
Pour le moment je cherchais simplement à faire fonctionner le Wemos avec un capteur pour tester en wifi , je vais faire mon essai
avec une simple thermistance.
merci de m'avoir aidé , bonne journée à vous
il faut au moins 3V en entrée, vous avez mesuré ce qui est réellement fourni? (est-ce bien 3.3V ?)
si vous n'avez qu'un seul capteur de T°, prenez la bibliothèque de Rob Tillaart et notez sur son GitHub les recommandations pour la résistance de pull-up
Pull up resistor
An indicative table for pull up resistors, (E12 series), to get started.
Note: thicker wires require smaller resistors (typically 1 step in E12 series)
Length - 5.0 Volt - 3.3 Volt 10cm (4") 10K0 6K8 20cm (8") 8K2 4K7 50cm (20") 4K7 3K3 100cm (3'4") 3K3 2K2 200cm (6'8") 2K2 1K0 500cm (16'8") 1K0 * longer * *
En abaissant la résistance il sera peut être possible de faire fonctionner cet exemplaire DS18B20 sisponible vec la carte D1 Mini disponible.
Les DS18B20 doivent selon leur Data Sheet, pouvoir travailler jusqu'à 3V mais là il se peut que le composant soit hors spécification ou que le régulateur inéaire 3V3 de la carte donne une tension d'alimentation un peu faible.
Un DS18B20 normal et une carte D1 Mini normale n'ont pas d'incompatibilité de fonctionnement avec le bon code et le bon câblage.
le prg que je t'ai envoyé est fonctionnel.
fin de chantier pour moi.

Question à la noix : es-tu sûr d'avoir déclaré la bonne pin dans le programme? Les esp sont piegeux : D2 n'est pas 2
D2 = 4 (GPIO4)
le piège vient des fabricants de cartes avec leurs dénominations Dx
ici la page WEMOS/Lolin avec la correspondance GPIO<-> Dx
https://www.wemos.cc/en/latest/d1/d1_mini.html