Domotique : Mesurer la température avec un ESP32 et un capteur DS18B20

14 mai 2018 rdorigny 0 commentaires

On m'a beaucoup évoqué l'ESP8266, qui est un microcontrôleur doté d'une interface WIFI. Et donc, c'est en recherchant des informations sur cette puce que j'ai découvert l'ESP32 qui est une mise à jour du premier.

Sur le papier, il semble assez intéressant avec des interfaces WIFI B/G et Bluetooth Low Energy (BLE V4.2), mais aussi le support de nombreux protocoles I2C, I2S, 1-wire, SPI, PWM... Bref, une petite merveille de technologie pour un coût modéré (moins de dix euros). C'est le composant parfait pour réaliser une application domotique simple plutôt qu'un Raspberry pi.


ESP32 est une puce fabriquée par la société chinoise ESPRESSIF qui est la version supérieure de la fameuse ESP8266. C'est un microcontrôleur que l'on trouve sous plusieurs formes de modules proposés par des constructeurs différents. Les fonctionnalités offertes par l'ESP32 sont pléthoriques, il suffit de regarder le schéma d'architecture pour entrevoir ce qui est proposé!
Je ne vais pas présenter toutes les fonctionnalités mais sachez que l'ESP32 dispose d'un nombre impressionnant de GPIO.
Pour m'initier à ce nouveau composant, j'ai commandé un kit de développement pour ESP32 wroom. A vrai dire, le premier que j'ai reçu était défectueux. Impossible de flasher la ROM. Il m'a fallut en commander un second, du coup j'ai changé de modèle. (modèle conseillée.)

La première étape consiste à installer la partie software. Personnellement, j'ai opté pour la solution Arduino (en C/C++) mais il existe également un framework en micropython ou en Lua. Pour installer sous windows :
https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md
Il suffit de suivre le processus d'installation, rien de difficile.

Installation des librairies du DS18B20:
La première étape consiste à récupérer l'adresse 1-wire du capteur, pour cela il est nécessaire de :
  • récupérer la librairie OneWire ici;
  • Dézipper le ficher et le renommer le répertoire OneWire-master en OneWire;
  • Déplacer ce répertoire dans le dossier des librairies de l'IDE Arduino.

  • La seconde étape consiste à installer la librairie du composant Dallas:
  • récupérer la librairie Dallas ici;
  • Dézipper le ficher et le renommer le répertoire Arduino-Temperature-Control-Library-master en DallasTemperature;
  • Déplacer ce répertoire dans le dossier des librairies de l'IDE Arduino.

  • Le schéma de câblage est assez simple. Nous utiliserons le GPIO 14 de l'ESP32 avec la sortie out du ds18b20 pour l'échange de données. Les autres autres sorties du ds18b20 sont reliées au +5V et au ground. Attention n'oubliez pas de protéger l'entrée de l'ESP32 avec une résistance de 4.7K‎Ω pour faire tomber la tension, car l'entrée de l'ESP32 ne supportera pas des tensions supérieures à 3.3V. Autre solution, il existe des plaquettes qui intègrent le ds18b20 et la résistance (voir photo ci-dessous).


    Voilà, on est prêt pour attaquer le code. La première opération consiste à récupérer l'adresse du capteur de température.
    
     /* One Wire scanner
     * Code inspiré de l'exemple livré avec la librairie Arduino DallasTemperature 
     * Code inspired by DallasTemperature Aduino library from
     * http://milesburton.com/Dallas_Temperature_Control_Library
     */
    #include (OneWire.h) //remplacer () par <>
    // Bus OneWie connecté sur la broche 14 | OneWire bus connected on Pin 4
    // Installer une résistance de 4.7K entre le +5V et le cable de données
    // A 4.7K resistor is necessary between +5V and Data wire  
    OneWire  ds(14);  
     
    byte i;
    byte type_s;
    byte data[12];
    byte addr[8];
      
    void OneWireScanner(){
      if ( !ds.search(addr)) {
        Serial.println("No more addresses.");
        Serial.println();
        ds.reset_search();
        return;
      }
      
      Serial.print("ROM = ");
      for( i = 0; i < 8; i++) {
        Serial.write(' ');
        Serial.print("0x");
        Serial.print(addr[i], HEX);
        if ( i != 7 ) {
          Serial.print(", ");
        }
      }
      
      if (OneWire::crc8(addr, 7) != addr[7]) {
          Serial.println("CRC is not valid!");
          return;
      }
      Serial.println();
     
      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          Serial.println("  Chip = DS18S20");  // or old DS1820
          type_s = 1;
          break;
        case 0x28:
          Serial.println("  Chip = DS18B20");
          type_s = 0;
          break;
        case 0x22:
          Serial.println("  Chip = DS1822");
          type_s = 0;
          break;
        default:
          Serial.println("Device is not a DS18x20 family device.");
          return;
      } 
    }
     
    void setup() {
       Serial.begin(115200);
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
      OneWireScanner();
      delay(5000);
    }
    

    Ce qui affiche dans le moniteur série:

    Maintenant que nous avons l'adresse, voyons pour lire les données sur le capteur ds18b20:
    
    /*********
      Rui Santos
      Complete project details at http://randomnerdtutorials.com  
      Based on the Dallas Temperature Library example
    *********/
    
    #include (OneWire.h)
    #include (DallasTemperature.h) //remplacer les () par <>
    
    // Data wire is plugged into port 14 on the Arduino or ESP32
    #define ONE_WIRE_BUS 14
    #define TEMPERATURE_PRECISION 10
     
    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);
     
    // Pass our oneWire reference to Dallas Temperature. 
    DallasTemperature sensors(&oneWire);
     
    // Tableaux contenant l'adresse de chaque sonde OneWire | arrays to hold device addresses
    DeviceAddress insideThermometer = { 0x28,  0xFF,  0x9B,  0xB5,  0xA0,  0x16,  0x3,  0xCD };
    
     
    void setup() {
      Serial.begin(115200);
      
      // Start up the library
      sensors.begin();
     
      // locate devices on the bus
      Serial.print("Locating devices...");
      Serial.print("Found ");
      Serial.print(sensors.getDeviceCount(), DEC);
      Serial.println(" devices.");
     
      // report parasite power requirements
      Serial.print("Parasite power is: "); 
      if (sensors.isParasitePowerMode()) Serial.println("ON");
      else Serial.println("OFF");
     
      // Vérifie sir les capteurs sont connectés | check and report if sensors are conneted 
      if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
     
      // set the resolution to 9 bit per device
      sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
     
      // On vérifie que le capteur st correctement configuré | Check that ensor is correctly configured
      Serial.print("Device 0 Resolution: ");
      Serial.print(sensors.getResolution(insideThermometer), DEC); 
      Serial.println();
    }
     
    void printTemperature(String label, DeviceAddress deviceAddress){
      float tempC = sensors.getTempC(deviceAddress);
      Serial.print(label);
      if (tempC == -127.00) {
        Serial.print("Error getting temperature");
      } else {
        Serial.print(" Temp C: ");
        Serial.print(tempC);
        Serial.print(" Temp F: ");
        Serial.println(DallasTemperature::toFahrenheit(tempC));
      }  
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
      Serial.print("Requesting temperatures...");
      sensors.requestTemperatures();
      Serial.println("DONE");
     
      // print the device information
      printTemperature("Inside : ", insideThermometer);
      
      delay(5000);
    }
    

    Ce qui donne dans le moniteur série:

    Conclusion

    Un premier montage qui met en oeuvre l'ESP32, pas trop difficile à réaliser. Je suis assez impressionné par les capacités de ce microcontrôleur. Reste à vérifier une connexion wifi pour être totalement convaincu.







    Pseudonyme (obligatoire) :
    Adresse mail (obligatoire) :
    Site web :




    © 2018 www.doritique.fr par Robert DORIGNY