Accueil | Domotique | ESP8266 + DHT22 + MQTT : réaliser votre 1er objet connecté

ESP8266 + DHT22 + MQTT : réaliser votre 1er objet connecté

ESP8266 + DHT22 + MQTT, voici comment nous allons apprendre à réaliser notre premier objet connecté (une sonde de température) et le connecter à un serveur domotique. Pour réaliser cet objet connecté nous aurons besoin d’un module WiFi ESP8266, d’un capteur de température et d’humidité DHT22 et d’une Led (pour simuler la commande d’une lampe). Pour la partie domotique, nous utiliserons le logiciel Home Assistant présenté précédemment.

Configuration nécessaire

Vous aurez besoin d’un ordinateur avec les logiciels suivants installés :

  • Un Broker (serveur) MQTT. Je vous conseille Mosquitto déjà présenté dans cet article
  • Un serveur domotique. Le plus facile si vous débutez en domotique et que l’anglais ne vous rebute pas trop, est d’installer Home-Assistant décrit dans cet article.

Pour réaliser cet article, j’ai utilisé un Raspberry Pi 3 avec une connexion SSH active (si vous avez besoin d’en savoir plus sur SSH, lisez cet article au préalable).

Matériel nécessaire

Pour réaliser ce projet, vous aurez besoin du matériel suivant

esp8266 Wemos D1 miniModule ESP8266 ESP-12. Par exemple Wemos D1 Mini
led 3mmLed (optionnel, pour suivre l’activité WiFi)
resistance 220ohmsRésistance 220Ω (optionnel)
Broches DHT22Capteur de température et d’humidité

DHT11 ou DHT22

jumper dupontJumper Dupont (optionnel)
breadboardBreadboard (optionnel)

Branchement

La Wemos D1 mini se câble comme un Arduino classique. Lorsque la Wemos D1 Mini est branchée au port USB de l’ordinateur, on récupère l’alimentation sur le Pin +5V. Pour faire fonctionner la Wemos sur batterie LiPo ou piles il suffira de brancher sur les Pin 5V et G.

Dans le programme, le DHT22 est branché sur le Pin D4, la Led sur le Pin D2.

IOT object connecté domotique home-assistant ESP8266+DHT22+MQTT_bb
Schéma de branchement du DHT22 et de la Led au module ESP8266 Wemos D1 Mini

Code

L’ESP8266 (ESP-12) peut se programmer en Lua ou à l’aide de l’IDE Arduino. Encore une fois c’est question de goût. J’ai une préférence pour l’IDE par habitude mais surtout les librairies ESP8266Wifi et PubSub simplifient vraiment la vie des développeurs.

Pour publier les mesures sur le Broket MQTT Mosquitto, nous allons avoir besoin d’intégrer les 3 librairies suivante à notre projet Arduino :

  • ESP8266WiFi.h : cette librairie et la boîte à outil idéal pour connecter (et reconnecter) un ESP8266 à internet, à un serveur…
  • PubSubClient.h : cette librairie permet d’envoyer et de recevoir des messages MQTT et de gérer le QoS
  • DHT.h : cette librairie permet de récupérer facilement les mesures du capteur DHT11 ou DHT22

Créez un nouveau projet et collez le code suivant en l’adaptant à votre configuration.

Le code du projet est également disponible sur GitHub ici

Si vous découvre les modules ESP8266, lisez d’abord cet article pour apprendre comment le programmer et téléverser un programme à l’aide de l’IDE Arduino.

Intégration à un serveur domotique Home Assistant

Si vous ne connaissez pas Home-Assistant, je vous invite à lire cet article qui explique comment l’installer et y configurer votre box pour y accéder depuis internet.

Ce qui est génial avec Home-Assistant c’est qu’il n’y a qu’un script à modifier pour pouvoir afficher la température et l’humidité publiée par l’ESP8266 sur Mosquitto. Allez dans le répertoire d’installation d’Home-Assistant.io

puis ouvrez le fichier de configuration

On ajoute une section mqtt

Maintenant on ajoute un nouveau capteur (sensor) et on récupère la température sur le topic sensor/temperature. La valeur se trouve dans le payload

On fait de même pour l’humidité en ajoutant un sensor 2

Enregistrez la configuration (Ctrl + X puis O) et lancez le serveur avec la commande hass. Actualisez la page dans votre navigateur pour voir apparaître la mesure de température et d’humidité.

home assistant mqtt sensor esp8266

Allumer, éteindre une Led depuis Home-Assistant

Ajoutons maintenant un interrupteur qui va nous permettre d’allumer ou d’éteindre un Led. C’est un exemple général. On active simplement une sortie de l’Arduino. On pourrait très simplement remplacer la Led par un relai.

Arrêtez Home-Assistant et ouvrez de nouveau le fichier de configuration.yaml dans lequel on va ajouter un bloc switch

esp8266 wemos d1 mini home assistant switch interrupteur mqtt  

Relancez Home-Assistant. Vous avez maintenant un nouveau widget nommé “Switch” dans lequel se trouve l’interrupteur de la cuisine. Appuyez sur l’éclair pour allumer la LED.

Si vous avez configuré votre box pour rendre accessible le serveur Home-Assistant depuis internet, vous pouvez même allumer et éteindre la led depuis votre smartphone.

IOT object connecté domotique home-assistant ESP8266+DHT22+MQTT wemos d1 mini

J’espère que vous avez apprécié ce petit projet de découverte des modules ESP8266 intégrés à un serveur domotique. Dans un prochain article nous l’intégrerons à Jeedom.

  • visvic

    Bonjour 🙂

    Super tuto !! comme dis par email les tutos sont géniaux !

    Bon, je me heurte à un petit problème :s. J’ai repris la même base de votre projet et adapté un capteur DS18B20. Je récupère la température, je la convertis pour en faire une chaine et ensuite je publie sur test.mosquitto.fr. SAUF que très souvent les messages ne sont pas publiés. On regarde d’un peu plus près la doc de l’API (http://pubsubclient.knolleary.net/api.html#publish1) et la le message est soit trop long soit la connection est perdu. Pourtant il y a bien une vérif qui est faite en amont pour la connection wifi ET mqtt.

    Voici mon code:

    #include
    #include
    #include

    #define wifi_ssid “NUMERICABLE-A9BE”
    #define wifi_password “**********”
    #define mqtt_server “test.mosquitto.org”

    long lastMsg = 0;
    float DS18B20_temperature;

    WiFiClient espClient;
    PubSubClient client(espClient);
    OneWire ds(2);

    void setup() {
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    }

    /* ————— loop ———————————– */
    void loop() {
    long now = millis();
    if (now – lastMsg > 1000 * 10) {
    lastMsg = now;

    if (WiFi.status() != WL_CONNECTED) {setup_wifi();}
    if (!client.connected()) {reconnect();}
    client.loop();

    char message_temperature[10] = “”;
    DS18B20_temperature = getTemperatureDS18b20();
    dtostrf(DS18B20_temperature, 3, 2, message_temperature);
    if (client.publish(“victor”, message_temperature, true)){
    Serial.println(“message publie”);
    } else {
    Serial.println(“Message non publie”);
    }
    Serial.println(message_temperature);
    }
    }

    /* ————— Connexion au réseau WIFI ———————————– */
    void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print(“Connection a “);
    Serial.print(wifi_ssid);

    WiFi.begin(wifi_ssid, wifi_password);

    while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(” .”);
    }

    Serial.println(“”);
    Serial.println(“WiFi connecte, “);
    Serial.print(“adresse IP : “);
    Serial.println(WiFi.localIP());
    }

    /* ————— Connexion au serveur MQTT ———————————– */
    void reconnect() {
    while (!client.connected()) {
    Serial.print(“Connexion au serveur MQTT…”);
    if (client.connect(“ESP8266Client”)) {
    Serial.println(“OK”);
    } else {
    Serial.println(“KO, erreur : “);
    Serial.print(client.state());
    if (client.state() == -2) {
    if (WiFi.status() != WL_CONNECTED) {setup_wifi();}
    }
    Serial.println(“On attend 5 secondes avant de recommencer”);
    delay(5000);
    }
    }
    }

    /* ————— Acquisition de la température ———————————– */
    float getTemperatureDS18b20() {
    byte i;
    byte data[12];
    byte addr[8];
    float temp = 0.0;

    ds.search(addr);

    // Cette fonction sert à surveiller si la transmission s’est bien passée
    if (OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println(“CRC is not valid!”);
    return false;
    }

    // Demander au capteur de mesure et mémoriser la température
    ds.reset();
    ds.select(addr);
    ds.write(0x44);

    delay(800);

    // Demander au capteur de nous envoyer la température mémorisé
    ds.reset();
    ds.select(addr);
    ds.write(0xBE);

    // Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
    for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
    }

    // Puis on converti la température (*0.0625 car la température est stockée sur 12 bits)
    temp = ( (data[1] << 8) + data[0] ) * 0.0625;

    // Réinitialisation de la recherche (évite erreur CRC !!)
    ds.reset_search();
    return temp;
    }

    et voici le moniteur série (extrait):

    Connexion au serveur MQTT…OK
    Message non publie
    27.19
    Connexion au serveur MQTT…OK
    Connexion au serveur MQTT…OK
    Message non publie
    27.19
    Connexion au serveur MQTT…OK
    Message publie <=== HAA il s'envoie enfin :p
    27.19
    Connexion au serveur MQTT…OK
    Message non publie
    27.13
    Connexion au serveur MQTT…OK
    Message non publie
    27.19
    Connexion au serveur MQTT…OK
    Message non publie
    27.19

    bref, j'espère ne pas avoir été trop bourrin en mettant tout cela ici, et si vous avez une petit idée je suis preneur 🙂

    Merci d'avance =))
    A très vite

    Edit 23/08/2016, 18h09:
    Il faut laisser client.loop() en dehors du if qui s'effectue toutes les dix secondes 😉

    • christophe

      Bonjour visvic. Tout d’abord merci beaucoup pour votre message. Avez-vous essayé d’installer un serveur (+ client) mosquitto sur un ordi local. J’imagine que le serveur qui fait tourner test.mosquitto.org doit être très sollicité et qu’il n’y a aucune garantie sur son bon fonctionnement (du moins en permanence). Ca vaudrait le coup d’essayer en local avant de remettre en cause le programme. Tenez moi au courant. A très bientôt.

  • Ferhat MAMECHE

    Bonjour, je n’ai pas encore acheté le Raspberry Pi 3 mais j’ai tout de même essayé d’installer homeassistant, ce que je remarque par rapport aux vidéos tuto c’est que je n’ai pas forcément les mêmes options et notamment “straming update” est-ce normal? sinon comment installer homeassistant concrètement, étape par étape

    • Bonjour Ferhat. Home Assistant est un projet qui bouge beaucoup et rapidement. Pas facile pour moi de connaitre tous les paramètres de tous les logiciels domotiques. Pour installer sur Raspberry, il y a ce tutoriel https://www.projetsdiy.fr/home-assistant-serveur-domotique-raspberry-pi/, sinon on peut aussi tester sur Windows, Linux, macOS, NAS avec Docker (https://www.projetsdiy.fr/tester-logiciels-domotique-docker-jeedom-openhab-domoticz-ha/). A très bientôt.

      • Ferhat MAMECHE

        Je veux savoir si le Raspberry Pi3 est primordial pour réaliser ce projet, configurer et gérer HomeAssistant

        Le 20 janv. 2017 4:52 AM, “Disqus” a écrit :

        • Vous pouvez m’en dire un peu plus sur votre projet ?

          • Ferhat MAMECHE

            Je cherche à refaire le projet ESP8266+DHT22+MQTT, mais lorsque je telecharge et essaie d’utiliser homeassistant, je remarque que je n’ai pas le même que dans les tutoriels, je n’ai pas notamment l’option “streaming update”, je ne peux pas rajouter aussi la partie Sensor au fichier configuration.ymal,  serait-ce parce que je n’ai pas utiliser de raspberry ?

            Sent from my Galaxy Tab® A——– Message d’origine ——–De : Disqus Date : 20/01/2017 23:24 (GMT-05:00) À : mameche.ferhat@gmail.com Objet : Re: Comment on ESP8266 + DHT22 + MQTT : réaliser votre 1er objet connecté
            “Vous pouvez m’en dire un peu plus sur votre projet ?”

            Settings

            A new comment was posted on projetsdiy

            Projets DIY

            Vous pouvez m’en dire un peu plus sur votre projet ?

            11:24 p.m., Friday Jan. 20

            |

            Other comments by Projets DIY

            Reply

            to Projets DIY

            Projets DIY’s comment is in reply to

            Ferhat MAMECHE:

            Je veux savoir si le Raspberry Pi3 est primordial pour réaliser ce projet, configurer et gérer HomeAssistantLe 20 janv. 2017 4:52 AM, “Disqus … Read more

            You’re receiving this message because you’re signed up to receive notifications about replies to ferhatmameche.

            You can unsubscribe
            from emails about replies to ferhatmameche
            by replying to this email with “unsubscribe”
            or reduce the rate with which these emails are sent by
            adjusting your notification settings.

          • Bonjour Ferhat, si vous débutez en domotique, je vous conseille plutot de démarrer avec Domoticz sur Raspberry Pi https://www.projetsdiy.fr/domoticz-installation-configuration-raspberry-pi-3/ ou jeedom https://www.projetsdiy.fr/jeedom-raspberry-pi-3-installation-wifi/ (en français)

          • Ferhat MAMECHE

            Mais est-ce que ce projet est réalisable avec ce que vous me suggérer, et dois je toujours utiliser MTQQ

            Le 23 janv. 2017 1:47 PM, “Disqus” a écrit :

          • Oui sans aucun problème, il y a tous les tutos necessaires sur mon blog 😉

          • Ferhat MAMECHE

            Vous pouvez m’envoyer le lien du blog et ainsi pouvoir entamer cela ? Merci d’avance

            Le 23 janv. 2017 3:34 PM, “Disqus” a écrit :

          • Ferhat MAMECHE

            je voulais savoir, dans le cas de l’utilisastion d’un Raspeberry, aurai-je besoin d’un module WiFi ESP8266 ou pas? parce que je suis novice dans le domaine et je ne sais pas à quoi sert exactement le Raspeberry

            2017-01-23 13:43 GMT-05:00 Disqus :

          • Bonjour Ferhat. Pas facile de tout expliquer dans un commentaire mais voici pour commencer quelques infos :
            – Raspberry = (mini) ordinateur qui fonctionne sous Linux (une version spéciale pour les microprocesseurs ARM, différent d’Intel). On installe un logiciel domotique dessus (Domoticz, Jeedom…)
            – ESP8266 : arduino avec du Wifi. Si vous voulez fabriquer vos propres modules domotiques
            Pour faire de la domotique, vous pouvez achetez des modules (détecteurs d’ouverture de porte, de fumée, météo, interrupteur…) qui vont communiquer avec le logiciel domotique. Il y a beaucoup de façon de communiquer. ZWave (ondes radio made in samsung), Ethernet (pas très utilisé), RFLink (ondes radio), WiFi…. la liste est longue comme le bras.
            Bref, vous êtes au bon endroit pour débuter (sur mon blog) il y a déjà pas mal de choses, prenez le temps de (tout) lire et faire des essais. Bon courage.

  • Frederic S

    Bonjour!
    J’ai quelques petites questions concernant le code de l’ESP8266
    1- A quoi sert le petit bout de code:
    if (now – lastRecu > 100 ) {
    lastRecu = now;
    client.subscribe(“homeassistant/switch1”);

    Si j’ai bien compris, on re-souscrit au topic homeassistant/switch1 toutes les 100ms ?
    Pourquoi pas le faire à l’initi et dans reconnect (juste une fois) ? (je decouvre, peut etre que j’ai mal compris comment ca fonctionne)

    2- Le code:
    //Envoi d’un message par minute
    if (now – lastMsg > 1000 * 10) {

    Pour moi ca fait toutes les 10secondes et non une fois par minutes, me trompe-je ?

    3- si j’ai bien compris la fonction millis() repart à zero au bout d’un moment ( https://www.arduino.cc/en/reference/millis ), au bout de 50jours environs…
    Pour faire un exercice par de soucis, mais si on veut faire un capteur type station météo, il faudrait gerer le moment du retour à 0 non ?
    Pourquoi utiliser millis() plutot qu’un simple delay(x)

    Super tutoriel par contre! je découvre l’ESP8266 et mqtt, c’est génial d’avoir fait un petit exemple avec la chaîne complète.

    • Bonjour Frédéric,
      1. Oui, c’est ça effectivement. On vérifie toutes les 100ms si un nouveau message a été envoyé par home assistant. Je vais faire un article sur le sujet, ce sera plus claire
      2. Oui, c’est exact, j’ai mis un temps plus court pour mes tests et ensuite j’ai oublié de modifier mon code . Merci !
      3. millis() donne le temps écoulé depuis le démarrage de l’Arduino / ESP8266. C’est n’est pas bloquant. On va simplement stocker le dernier passage dans la boucle lastRecu = now pour le tester au tour suivant. Par contre lorsqu’on appel un delay, le reste du programme est bloqué
      Merci beaucoup et à très bientôt. J’ai mis en place une newsletter par email. L’envoi se fera tous les vendredis.

  • Ferhat MAMECHE

    Bonjour, ai-je nécessairement besoin d’un Raspeberry pour réaliser ce projet ou pas ?

    • Bonjour Ferhat. Non ce n’est pas nécessaire. Vous pouvez installer un broker MQTT sur windows (si vous êtes sur Windows). MQTT est un protocole très répandu , c’est même un standard depuis l’année dernière, vous pourrez récupérer les données sur beaucoup de logiciels. A très bientôt