ESP32, lire la température de plusieurs sondes DS18B20 en MicroPython et publier vers Domoticz • Domotique et objets connectés à faire soi-même

d5xqok44wdawy4ytyxsd-5153893

Code source

Après plusieurs articles pour présenter les principes du MicroPython sur les cartes ESP8266 et ESP32, il est temps de passer aux choses sérieuses. Je vous propose de porter le code Arduino de lecture de plusieurs sondes de mesure de température Dallas DS18B20 en MicroPython (article précédent). Ici, nous allons utiliser l’éditeur de code uPiCraft déjà présenté précédemment dans ce tutoriel et celui-ci (gestion de la connexion WiFi). uPiCraft contient quelques modules complémentaires dont un module permettant de scanner le bus One-Wire et de lire la température très simplement.

Nous allons également découvrir comment se connecter à un serveur Domoticz et publier les mesures. Si vous ne souhaitez pas utilisez uPiCraft, le code source du module DS18x20 est disponible plus bas dans l’article. Si vous n’avez pas encore le firmware MicroPython installé sur une carte ESP8266 ou ESP32, suivez ce tutoriel avec le script esptool.py ou celui-ci à l’aide d’uPiCraft.

Matériel nécessaire

Le code fonctionne a été sur ESP8266 ainsi que sur ESP32. Le bus One-Wire ne nécessite qu’un seul fil pour communiquer avec le micro-contrôleur. Le code permet de récupérer la température de 2 sondes Dallas DS18B20 mais vous pouvez en connecter jusqu’à 100. Ca devrait suffire pour couvrir toute une maison !

Le branchement est très simple. Le bus One-Wire est généralement situé sur un fil jaune. Le rouge est utilisé pour l’alimentation, le noir pour le GND comme d’habitude. Pour que le bus fonctionne, il faut le “déparasiter”. Pour cela, on place une résistance (4K7 en général) entre le +5V et le bus de données. J’ai également essayé d’autres résistances (5K7) ainsi qu’une alimentation +3V3 avec succès. Evidemment, tout dépendra de la longueur de câble. Plus le câblage sera long, plus il faudra être rigoureux avec l’alimentation et le dé-parasitage du signal.

Pour ce tutoriel, le DS18B20 est branché sur la broche D4 de l’ESP8266. Tous les codes proposés dans ce tutoriel peuvent être utilisés sur un Arduino Uno ou un ESP32.

7y0fsydsuxjohr6zsqzg-5294143

Installer la librairie DS18X20 MicroPython sur l’ESP32 (ou ESP8266)

L’IDE uPiCraft est livré avec quelques librairies complémentaires aux modules natifs du MicroPython. La libraire DS18X20 est rangée avec les autres librairies dans la barre de navigation latérale dans la section uPi_Lib.

Connectez-vous à votre carte de développement MicroPython. Si vous avez loupé les épisodes précédents, allez dans le menu Tools puis Serial pour choisir indiquer le port COM sur lequel est branché la carte. Ensuite, cliquez sur le bouton connect.

Pour copier la librairie sur la carte, il suffit de faire un glisser-déposer sur le device connecté. L’autre méthode consiste à ouvrir la librairie puis choisir l’option Download dans le menu Tools.

Si vous n’utilisez par l’IDE uPiCraft, créer un nouveau fichier nommé DS18X20.pu et collez le code source. Il est également disponible sur GitHub. Ce driver permet de créer un objet attaché à la broche des sondes One-Wire. Plusieurs méthodes sont disponibles :

  • scan
  • convert_temp
  • read_scratch
  • write_scratch
  • read_temp
# DS18x20 temperature sensor driver for MicroPython.
# MIT license; Copyright (c) 2016 Damien P. George

from micropython import const

_CONVERT = const(0x44)
_RD_SCRATCH = const(0xbe)
_WR_SCRATCH = const(0x4e)

class DS18X20:
    def __init__(self, onewire):
        self.ow = onewire
        self.buf = bytearray(9)

    def scan(self):
        return [rom for rom in self.ow.scan() if rom[0] == 0x10 or rom[0] == 0x28]

    def convert_temp(self):
        self.ow.reset(True)
        self.ow.writebyte(self.ow.SKIP_ROM)
        self.ow.writebyte(_CONVERT)

    def read_scratch(self, rom):
        self.ow.reset(True)
        self.ow.select_rom(rom)
        self.ow.writebyte(_RD_SCRATCH)
        self.ow.readinto(self.buf)
        if self.ow.crc8(self.buf):
            raise Exception('CRC error')
        return self.buf

    def write_scratch(self, rom, buf):
        self.ow.reset(True)
        self.ow.select_rom(rom)
        self.ow.writebyte(_WR_SCRATCH)
        self.ow.write(buf)

    def read_temp(self, rom):
        buf = self.read_scratch(rom)
        if rom[0] == 0x10:
            if buf[1]:
                t = buf[0] >> 1 | 0x80
                t = -((~t + 1) & 0xff)
            else:
                t = buf[0] >> 1
            return t - 0.25 + (buf[7] - buf[6]) / buf[7]
        else:
            t = buf[1]  hold_time_sec:
    last_trigger = time.time()
    ds.convert_temp()
    for rom in roms:
        IDX = 0
        if rom[7] == insideTemp:
          IDX = Idx_inside
        else:
          IDX = Idx_outside  
        
        try:
            print(ds.read_temp(rom), end=' ')
            value = "{:.2f}".format(ds.read_temp(rom))
            return_code = d.setTemperature(IDX,value)
            print("Request result: "+str(return_code))
        except Exception as e:
            print("Request failed")
            print(e)

Enregistrez le script du projet puis envoyez le sur l’ESP8266/ESP32 avec la touche F5. Si tout est correct, vous devez recevoir un code 200 à chaque requête HTTP.

Les appareils virtuels Domoticz s’actualisent en quelques secondes.

Voilà, cet article conclu cette petite série de tutoriels sur le MicroPython. J’espère que vous avez aimez. Nous reprendrons les tutoriels un peu plus tard pour piloter le bras robotique présenté il y a quelques semaines. Si vous avez des besoins ou des problèmes particuliers, les commentaires sont là pour ça.

Avez-vous aimé cet article ?