Capteur d’humidité et de température

Aujourd’hui, nous allons voir un domaine qui me passionne du point de vue des possibilités que ça peut ouvrir : la domotique.

ESP8266

Comme je débute, j’ai décidé de commencer par avoir l’information de température (et d’humidité mais ce n’était pas mon but premier). Dans l’idée, c’est déjà d’avoir la température d’une pièce, de la récupérer dans un serveur domotique et permettre avec un scénario à démarrer ou stopper un radiateur.

Pour avoir l’information, nous avons besoin d’un circuit imprimé avec micro-contrôleurs et wifi. J’ai choisi l’esp8266 (à gauche sur la photo) ainsi qu’un module capteur d’humidité et température (à droite sur la photo): le DHT11. (Pour information, le DHT22 est plus récent et surtout plus précis).

Esp8266 – câbles dupont – DHT11

Pour connecter le module capteur, il suffit de connecter la broche (+) à la broche 3v3 (3,3 volts de l’esp8266), la broche (-) à une broche Ground et la broche du mileu qui permet de faire transiter les données, nous allons la raccorder à la broche D1 de l’esp. (Si vous avez quatre broches, attention, vous devrez aller chercher l’information sur internet mais il faut mettre une résistance entre la broche data et le Vcc)

Voir les photos ci-dessous en vous repérant avec les couleurs des câbles dupont :

DHT11 – marron (+), blanc (data), noir (ground/-)
Esp8266 – blanc sur D1, marron sur 3v et noir sur ground

Ensuite, il suffit de connecter le module en usb à votre ordinateur et a lancé l’arduino IDE. Il faut d’abord aller modifier les préférences afin de modifier:

Nous allons cliquer sur l’icône après la zone de texte de « URL de gestionnaire de cartes supplémentaires » afin de pouvoir avoir accès aux cartes ESP8266

Il faut rajouter la ligne http://arduino.esp8266.com/stable/package_esp8266com_index.json

Ensuite nous allons dans outils pour indiquer à notre logiciel que nous utilisons une carte ESP8266. Choisissez votre modèle, le mien est donc un NodeMcu 1.0

Choisir la carte qui vous correspond

Viens le moment de brancher votre carte à l’ordinateur afin de pouvoir configurer dans le menu outils le port « COM » correspondant.

Ensuite, nous allons pouvoir écrire notre programme qui va se connecter en wifi, récupérer les informations température et humidité de la sonde et les envoyer sur notre MQTT Broker. Le serveur domotique que j’utilise, Jeedom, va pouvoir récupérer les informations et les afficher.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-mqtt-publish-dht11-dht22-arduino/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
  type de carte : esp8266 generic
*/

#include "DHT.h"   // librairie pour gérer le DHT 11 (et autres)
#include <ESP8266WiFi.h> // librairie pour se connecter au wifi
#include <Ticker.h> // librairie pour appeler des fonctions avec des répétitions, délais, etc...
#include <AsyncMqttClient.h> // librairie pour publier en MQTT

#define WIFI_SSID "********"  // remplacer avec le nom de votre réseau wifi 2.4 Ghz
#define WIFI_PASSWORD "********" // remplacer avec le mot de passe du réseau wifi

// Raspberri Pi Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 10, 120) // adresse de votre MQTT Broker
// For a cloud MQTT broker, type the domain name
//#define MQTT_HOST "example.com"
#define MQTT_PORT 1883 // Port à changer si vous n'utilisez pas le port par défaut

// Temperature MQTT Topics
#define MQTT_PUB_TEMP "esp/dht/hangar1/temperature" // à adapter en fonction de votre organisation des pubs MQTT
#define MQTT_PUB_HUM "esp/dht/hangar1/humidity" // à adapter en fonction de votre organisation des pubs MQTT

// Digital pin connected to the DHT sensor / Pin digital connecté au senseur DHT
#define DHTPIN 5 // Attention, à ne pas confondre la nomination du PIN ex : D0 et le numéro GPIO. Il me semble qu'on peut utiliser la nomination complète ex : D0

// Uncomment whatever DHT sensor type you're using // Décommenter le senseur que vous utilisez et commenter les autres. Là, c'est le DHT11 qui sera utilisé
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)   

// Initialize DHT sensor / Permet d'initialiser le DHT
DHT dht(DHTPIN, DHTTYPE);

// Variables to hold sensor readings / Valeurs pour enregistrer les valeurs du senseur
float temp;
float hum;

AsyncMqttClient mqttClient; 
Ticker mqttReconnectTimer;

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;

unsigned long previousMillis = 0;   // Stores last time temperature was published / Permet de garder la dernière fois où la température a été publiée
const long interval = 10000;        // Interval at which to publish sensor readings / Intervalle de publication ex 10s en ms : 10 000

void connectToWifi() {
  Serial.println("Connecting to Wi-Fi..."); // Connection au wifi
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi."); // Connection réussie
  connectToMqtt();
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi."); // Disconnecté du wifi
  mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi / assure que nous n'essayons pas de nous reconnecter au MQTT pendant la reconnection au wifi
  wifiReconnectTimer.once(2, connectToWifi);
}

void connectToMqtt() {
  Serial.println("Connecting to MQTT..."); // Connection au MQTT Broker
  mqttClient.connect();
}

void onMqttConnect(bool sessionPresent) {
  Serial.println("Connected to MQTT."); // Connecté !
  Serial.print("Session present: ");
  Serial.println(sessionPresent);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Disconnected from MQTT."); // Disconnecté du MQTT

  if (WiFi.isConnected()) {
    mqttReconnectTimer.once(2, connectToMqtt);
  }
}

/*void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
  Serial.println("Subscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
  Serial.print("  qos: ");
  Serial.println(qos);
}

void onMqttUnsubscribe(uint16_t packetId) {
  Serial.println("Unsubscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}*/

void onMqttPublish(uint16_t packetId) {
  Serial.print("Publish acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void setup() {
  Serial.begin(115200);
  Serial.println();

  dht.begin();
  
  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
  wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);

  mqttClient.onConnect(onMqttConnect);
  mqttClient.onDisconnect(onMqttDisconnect);
  //mqttClient.onSubscribe(onMqttSubscribe);
  //mqttClient.onUnsubscribe(onMqttUnsubscribe);
  mqttClient.onPublish(onMqttPublish);
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  // If your broker requires authentication (username and password), set them below
  //mqttClient.setCredentials("IoT", "IoT2021"); //Si votre MQTT nécessite un utilisateur et mot de passe
  
  connectToWifi();
}

void loop() {
  unsigned long currentMillis = millis();
  // Every X number of seconds (interval = 10 seconds)
  // it publishes a new MQTT message
  if (currentMillis - previousMillis >= interval) {
    // Save the last time a new reading was published
    previousMillis = currentMillis;
    // New DHT sensor readings
    hum = dht.readHumidity();
    // Read temperature as Celsius (the default)
    temp = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //temp = dht.readTemperature(true);
    
    // Publish an MQTT message on topic esp/dht/temperature / Publie un message MQTT sur le sujet esp/dht/****/temperature
    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ", MQTT_PUB_TEMP, packetIdPub1);
    Serial.printf("Message: %.2f \n", temp);

    // Publish an MQTT message on topic esp/dht/humidity/ Publie un message MQTT sur le sujet esp/dht/****/humidity
    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
    Serial.printf("Message: %.2f \n", hum);
  }
}

Il est temps de vérifier que le code est correct en utilisant la première icône sous le menu Fichier

Si tout se passe bien, nous pouvons passer à l’icône pour téléverser juste à côté :

Le téléversement est en cours, il n’y a plus qu’à laisser faire. Dans une prochaine version de ce tutoriel, j’essayerais de plus m’attarder sur les prérequis ainsi que sur la suite : mqtt, mqtt broker et jeedom.

Laisser un commentaire

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