Mesure de Températures avec ESP32 – bus OneWire – sondes DS18B20 : Préparation

Pour une fois, je publie un article sans avoir fini mon projet (car tout le matériel nécessaire n’est pas encore arrivé …), mais comme il y a beaucoup de nouveautés et que mon prototype marche plutôt bien; je profite du délai de livraison pour décrire et expliquer cette nouvelle approche (nouvelle pour moi mais très utilisée dans le monde de la domotique).

Mon projet : Suivre la température des congélateurs/réfrigérateur/cave à vins du garage.

Malgré plusieurs tentatives (avec des sondes Zigbee ou 433Mhz), je ne suis jamais arrivé à un résultat correct (même si je sais que cela fonctionne bien chez certains !). J’ai perdu des sondes (hs à cause du froid ?), usé des batteries trop rapidement ou bien les températures étaient bloquées (plus de mises à jour).

Je vais donc utiliser un ESP32 sur un kit de développement (c’est la carte avec les connecteurs et les PINs sur laquelle est implanté le processeur ESP32) et raccorder dessus un bus OneWire avec plusieurs sondes DS18B20.

Carte de développement ESP32
Dimensions de la carte avec l’ESP32 et l’antenne wifi intégrée

L’ESP32 de la société chinoise Espressif est le processeur qui se trouve sur la carte de développement ci-dessus, c’est une version plus avancée de l’ESP8266. Il peut se programmer avec l’IDE (Environnement de Développement) Arduino en langage C/C++ ou en LUA. Il y a d’autres possibilités (PlatformIO par exemple), mais je vais prendre l’option IDE Arduino + C/C++. Les avantages principaux de l’ESP32 par rapport à un Arduino :

  • Wifi et Bluetooth intégré,
  • + de PIN (et certaines qui n’existent pas sur un Arduino),
  • énormément plus de mémoire (4 Mo versus 32Ko pour le Uno),
  • beaucoup plus rapide (240Mhz versus 16Mhz),
  • consommation électrique moindre,
  • plus petit,
  • alimentation via un connecteur micro-USB avec un chargeur de téléphone,
  • moins de 4€ port compris pour les dernières cartes de développement commandées chez Greatzt Store chez Ali.

L’ESP32 fonctionne en 3.3v et la carte est alimenté en 5v, elle transforme le 5v en 3.3v pour l’ESP32.

Possibilités de connexion avec l’ESP32

La communication avec Domoticz se fera en Wifi, l’ESP32 enverra des requêtes JSON à Domoticz pour mettre à jour les dispositifs de suivi des températures. C’est très simple et je n’utilise qu’un seul ESP32.

Principe du bus OneWire

Le bus OneWire (un fil donc ! + alim et terre) est filaire ce qui évitera les problèmes de batteries, et il supporte plusieurs topologies (série, étoile, //, mixte). Sur la carte ESP32, il n’y aura donc que 3 connexions. Comme le bus fonctionne en 3.3v ou en 5v, on réutilisera le 3.3v en sortie de l’ESP32. Ce bus peut supporter jusqu’à 100 dispositifs.

Interface Multiple DS18B20s with ESP32 & Display Values on Web Server
Exemple de câblage
Sonde de température étanche DS18B20 avec son câble
Les sondes DS18B20 que j’ai choisi sont étanches avec des câbles de 2m pour avoir de la souplesse entre 2 appareils (1€33 la sonde et le câble chez Ali lors de mon achat). Chaque sonde dispose d’un numéro d’identification unique, ce qui permet de reconnaître l’origine des données de température remontées. Elle peut aller de -55°C à 125°C avec une précision de 0.5°C de -10°C à +85°C. Il reste à intégrer au mieux la sonde dans les appareils.

Vu le tarif, la topologie du bus et l’organisation de mon garage, je vais installer 6 sondes :

  1. une dans le congélateur blanc
  2. une dans la cave à vins
  3. une dans le compartiment congélateur du réfrigérateur gris
  4. une dans le réfrigérateur gris
  5. une pour la température du garage
  6. une pour la température extérieure

On peut même mettre une sonde en haut d’un appareil et une autre en bas pour vérifier l’écart de température 🙂 !

Comme dans cette zone du garage, j’ai deux prises Zwave qui alimentent mes pompes en cas de pluies importantes, je vais remplacer ces 2 prises par une carte 2 relais comme dans l’article de Philippe sur l’arrosage. Il reste à voir l’alimentation en 5v (ou bien trouver des relais en 3.3v), Domoticz pilotera les relais via l’ESP32 en http.

J’ai aussi 2 prises Zwave pour l’alimentation du congélateur et du réfrigérateur mais elles servent aussi pour remonter la consommation électrique de ces appareils donc je les garde.

Passons maintenant à la mise en oeuvre. J’ai beaucoup utilisé ce site qui est une mine d’informations sur le sujet, mais je vais reprendre les points principaux dans cet article car il y a quelques trucs qui ne fonctionnaient pas du premier coup.

Sur la base d’un IDE Arduino version 1.8.13 installé en version française (dans mon cas sur un raspberry), il faut rajouter des « gestionnaires de cartes supplémentaires » choix « Fichier + Préférences » puis dans l’onglet « Paramètres » ajouter les URLs nécessaires, on va aussi ajouter l’ESP8266 :

  • https://dl.espressif.com/dl/package_esp32_index.json + Entrée
  • https://arduino.esp8266.com/stable/package_esp8266com_index.json + Entrée
Gestionnaire de cartes supplémentaires

Puis OK dans chaque fenêtre et on va dans « Outils + Type de carte + Gestionnaire de carte« , dans le champ de recherche on rentre « esp » (comme dans l’écran ci-dessous) et on installe les gestionnaires de carte pour esp8266 et esp32.

Choix des gestionnaires de carte à installer

Ensuite dans le menu « Outils« , on va avoir le choix de la carte à configurer. Il faudra aussi choisir le port de communication avec la machine sur laquelle l’IDE Arduino est installé et la vitesse d’Upload.

Choix et caractéristiques de la carte à programmer

Pour la gestion de la température, nous allons installer une bibliothèque supplémentaire choix « Outils + Gérer les bibliothèques » et indiquer « dallas » dans le champ de recherche puis « Installer ».

Ajout de bibliothèques

Le C et le C++ sont des langages compilés, seul le code exécutable est envoyé sur l’ESP32. Vous allez donc avoir des erreurs de compilation qui seront parfois liées à l’absence d’une bibliothèque, il faudra donc la rajouter comme pour DallasTemperature ci-dessus. 

Voici le premier programme à utiliser pour ce projet : la récupération des adresses de chaque sonde.

Dans ce programme (et dans les programmes C/C++ en général), on trouve 4 parties :

  • Les appels aux bibliothèques utilisées dans le programme et la définition des variables globales du programme (lignes 1 à 9), notre bus OneWire est connecté sur la sortie D22 de l’ESP32. A garder à l’esprit : ne pas utiliser la sortie D2 qui est liée à la LED bleue de la carte et qui peut poser des problèmes de chargement de programmes !
  • Les fonctions qui peuvent être multiples et qui s’exécutent à chaque fois qu’elles sont appelées dans le programme (la fonction OneWireScanner est en ligne 11 à 53 et elle est appelée en ligne 60 dans la boucle du programme).
  • L’initialisation qui est unique et ne s’exécute qu’une seule fois (lignes 55 à 57), elle a le format suivant :

void setup(){
}

  • La boucle principale qui est aussi unique mais qui s’exécute indéfiniment (lignes 59 à 62), elle a le format suivant :

void loop(){
}

Résultat de la compilation et Envoi vers l’ESP32

Affichage de l’exécution du programme dans la console

On voit l’adresse de la sonde installée et son type, il faut récupérer les adresses de chaque sonde, une par une, pour les réutiliser dans le programme global.

Des informations complémentaires à lire pour mieux comprendre et maîtriser cet environnement :

Article à venir pour le programme complet lorsque tout le matériel sera disponible …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *