Contenu

Un capteur de température et d'humidite Wifi maison

Le matériel

  • Un module nodeMCU Lolin V3
  • Un capteur de température/humidité DHT22
  • Une résistance de 10K Ohm
  • Une pile 9V

Préambule à la gestion d’énergie : Le mode DeepSleep

Sur les ESP 8266 il existe trois modes de gestion d’énergie : » Le mode ModemSleep qui va éteindre le modem Wifi tout en gardant la connexion wifi sans transmission de données, le CPU du modem reste donc actif pendant ce temps et consomme de l’énergie » Le mode LightSleep va également conserver la connexion Wifi pour pouvoir la réactiver rapidement tout en éteignant l’horloge interne du système et le cpu ce qui provoque le fait que les interruptions système ne sont plus écoutées » Le mode DeepSleep est le plus économe en terme d’énergie, pour ce mode tout est éteint sauf l’horloge interne, ce qui permet de réveiller le système via la commande interne de RESET Le mode DeepSleep nécessite des branchements particuliers ainsi que des appels fonctions pour pouvoir être activé, ils seront détaillés plus loin dans l’article.

Schéma de branchement (sans deepSleep)

https://i.imgur.com/T5LMRnp.png

Explications du schéma : > On alimente le nodeMCU à l’aide de la pile 9V sur les broches VIN et GND > Pour le capteur DHT22 il faut adapter selon les spécifications du composant acheté. Dans mon cas : > On alimente le capteur DHT22 en 3V sur la première broche > On alimente la deuxième broche (DATA) avec une résistance de 10K Ohm et on relie également cette broche sur la broche D2 du nodeMCU (ce qui va permettre de lire les données de température et d’humidité) > Enfin on relie la dernière broche du DHT22 à une broch GND (la troisième broche est inutilisée)

Le code côté NodeMCU

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"          // Librairie des capteurs DHT

#define wifi_ssid "SSID"
#define wifi_password "WIFI-PASSWD"

#define mqtt_server "MQTT_SERVER_IP"
#define mqtt_port 1883
#define mqtt_user "MQTT_USER"  //s'il a été configuré sur Mosquitto
#define mqtt_password "MQTT_PWD" //idem

#define mqtt_temperature_topic "TEMPERATURE_TOPIC"
#define mqtt_humidity_topic "HUMIDITY_TOPIC"


// Dé-commentez la ligne qui correspond à votre capteur 
//#define DHTTYPE DHT11       // DHT 11 
#define DHTTYPE DHT22         // DHT 22  (AM2302)

#define DHTPIN D2    // Pin sur lequel est branché le DHT

bool debug = true;  //Affiche sur la console si True

const int sleepTimeS = 3600; //En secondes

//Création des objets
DHT dht(DHTPIN, DHTTYPE);     
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);     //Facultatif pour le debug
  pinMode(D0, WAKEUP_PULLUP); // Utilisé pour le mode deepSleep
  setup_wifi();           //On se connecte au réseau wifi
  client.setServer(mqtt_server, mqtt_port);    //Configuration de la connexion au serveur MQTT
  dht.begin();


  if (!client.connected()) {
    reconnect();
  }

  //Envoi d'un message par minute
  //Lecture de l'humidité ambiante
  float h = dht.readHumidity();
  // Lecture de la température en Celcius
  float t = dht.readTemperature();

  if ( debug ) {
    Serial.print("Temperature : ");
    Serial.print(t);
    Serial.print(" | Humidite : ");
    Serial.println(h);
  }  
  client.publish(temperature_topic, String(t).c_str(), true);   //Publie la température sur le topic temperature_topic
  delay(100);
  client.publish(humidity_topic, String(h).c_str(), true);      //Et l'humidité
  delay(100);
  // Pour économiser la pile on passe en mode deepSleep (veille profonde) ici avec 3600 soit pendant une heure
  ESP.deepSleep(sleepTimeS * 1000000);
}

//Connexion au réseau WiFi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connexion a ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connexion WiFi etablie ");
  Serial.print("=> Addresse IP : ");
  Serial.print(WiFi.localIP());
}

//Reconnexion
void reconnect() {
  //Boucle jusqu'à obtenur une reconnexion
  while (!client.connected()) {
    Serial.print("Connexion au serveur MQTT...");
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("KO, erreur : ");
      Serial.print(client.state());
      Serial.println(" On attend 5 secondes avant de recommencer");
      delay(5000);
    }
  }
}

void loop() {
  // pas de code ici car le deepSleep effectue un reboot en quelque sorte donc on fait tout dans la fonction setup()
}

Schéma de branchement (avec deepSleep)

https://i.imgur.com/dw65oOW.png

Ici on rajoute tout simplement un câble entre la broche D0 et la broche RST pour pouvoir activer la fonction de deepSleep. Attention, il faut prévoir de pouvoir retirer facilement ce câble car une fois cette liaison faite, on ne peut plus téléverser de code dans l’ESP

Les pièges à éviter

Pour réaliser ce composant il faut faire attention à plusieurs choses :

  1. Les broches du nodeMCU à utiliser sont très importantes. Pour ma part en suivant des tutos sur internet, j’ai commencé par utiliser la broche D8 or cette broche a également d’autres fonctions qui empêchent de téléverser le code sur le nodeMCU une fois cette dernière relié (il faut alors relier cette broche à une broche GND lors du téléversement pour que cela fonctionne)
  2. Pour ces mêmes raisons de problème de téléversement, il faut prévoir de pouvoir débrancher la liaison D0/RST sinon le téléversement ne s’effectuera pas
  3. Lorsque l’on est en mode deepSleep on effectue un reboot du nodeMCU, or si on utilise pour un capteur les broches D8 jusqu’à D5, on va se retrouver avec un problème de boot et le nodeMCU ne lancera plus le programme téléversé, c’est pourquoi j’utilise la broche D2 (à savoir la broche D1 aurait pu convenir également)

L’Enfer

Le soucis qui se pose la plupart du temps vient de l’énergie. En effet il faut bien faire attention aux tensions d’alimentation des différents éléments au risque de ne pas avoir de mesure du tout. Pour mon cas j’ai expérimenté la solution avec une pile 9V ce qui a à chaque fois provoqué un vidage de la pile assez rapidement. Je suis passé à une solution avec une LiPo 1S de 3,7V de 1000mAH pour bénéficier du côté “rechargeable” en cas de coup dur et ce coup-ci c’est la tension de sortie de 3V de l’ESP qui n’était pas atteinte, ne pouvant donc alimenter correctement le capteur DHT22. Ma solution actuelle est d’alimenter l’ESP sur le port micro-USB faute de mieux.

Le coût

Liste des éléments que j’ai achetés :

Prix unitaire en fonction des éléments achetés plus haut : 1 nodeMCU à 5€ 1 DHT22 à 5€ 1 pile 9V à 1,95 € 1 résistance (c’est cadeau)

11,95€ pour le composant au final