Je continue mon défi 50 objets avec pour thème cette semaine un capteur d’humidité, de température et de pression pour l’extérieur. Comme d’habitude, j’ai tout réalisé de A à Z. Venez découvrir ce projet DIY (Do It Yourself !) dont je suis, pour le moment, le plus fier !

Tout de suite, la vidéo de l’objet !

MESURER L' HUMIDITE, LA TEMPERATURE ET LA PRESSION !
Lire cette vidéo sur YouTube.

Cahier des charges de l’objet

L’objectif était de créer un capteur de température, d’humidité et de pression atmosphérique sans fil, totalement connecté et autonome en énergie ! Tout est dit ici ! J’ai repris la même base de travail que sur l’anémomètre connecté, c’est à dire un objet à base de microcontrôleur ESP8266 qui permet de se connecter en Wifi à mon Raspberry Pi. Le microcontrôleur envoie les informations au Raspberry Pi grâce à un flux MQTT qui est retransmis à la base de données.

 

Une architecture dont le centre névralgique est Mosquitto. L'architecture peut aisément être mise en place grâce à Node-RED.

Petit rappel de l’architecture, comme d’habitude 🙂

Pour les caractéristiques de l’objet, ce dernier devra donc :
– Etre indépendant en énergie.
– Pouvoir prendre un point de mesure toutes les 30 minutes.
Capter réellement la température, l’humidité et la pression à l’air ambiante et non à l’intérieur d’un boîtier (pour minimiser un maximum l’inertie vis à vis de l’isolation du boîtier).

Nomenclature du capteur d’humidité, de température et de pression

Electronique

Au niveau de l’électronique, nous avons un capteur d’humidité et de température DHT11 couplé à un capteur Bosch BMP180 pour la pression et une nouvelle fois la température. Pour la partie alimentation, un panneau solaire 6 V raccordé à un contrôleur de charge TP4056 pour recharger la batterie 3,7 V Lithium-Ion. En parallèle, je raccorde un module régulateur de tensions 3,3 V muni d’un régulateur AMS1117 sur lequel est soudé mon circuit électronique avec l’ESP8266, et les deux capteurs. Voici la nomenclature complète ci-dessous avec les liens où j’ai acheté ces produits. Je m’efforce à réduire au maximum le coût des projets.

Description

Photo

Prix

Lien d’achat

Panneau solaire 5/6 V


Panneau Solaire 5V

 

0.65 €

AliExpress

Contrôleur de charge TP4056


TP4056 5V 1A      

1.45 €

GearBest

Batterie Li-Ion 3.7 V 4000 mAh


Batterie Li-Ion 3.7 V 4000 mAh     

2.55 €

GearBest

Module régulateur de tension 3.3 V AMS1117


Module 3.3 V    

0.61 €

GearBest

Microcontrôleur ESP8266-12F

ESP8266-12F

1.84 €

eBay

Capteur d’humidité / température DHT11

  DHT11

2.50 €

GearBest

Capteur de pression / température Bosch BMP180

  BMP180

3.48 €

Amazon.fr

 Le budget total pour l’électronique s’élève à 13,08 €.

 

Pièces imprimées en 3D

Les pièces imprimées en 3D sont au nombre de 3. Nous avons la base contant l’électronique de contrôle, le cône qui contient les deux capteurs et une anse de fixation. Pour le projet, je n’ai imprimé que la base et le cône. Les fichiers 3D sont disponibles sur ma page Thingiverse.

 

Defi4-Thingiverse

Cliquez sur l’image pour accéder aux téléchargements des fichiers.

 

L’ensemble des pièces a été imprimé sur ma Dagoma DiscoEasy 200, avec du filament Ariane Plast Rouge Métallisé à 215°C en épaisseur de couche 0.15 mm et à 30% de remplissage. Au niveau des temps d’impression et de la quantité de matière, je suis à :
17 heures et 21 minutes pour 127g de PLA pour la base.
17 heures et 05 minutes pour 115g de PLA pour le cône.
15 heures et 23 minutes pour 110g de PLA estimé pour l’anse (je ne l’ai pas encore imprimée).

Schéma électronique

Au niveau de l’électronique, je repars sur le même schéma que la dernière fois (voir article sur l’anémomètre, partie 2), et je l’adapte à mes besoins :

Electronique : Capteur d'humidité, température et pression. Cliquez sur l’image pour voir en plus grand.

Cette fois-ci un seul panneau solaire devrait amplement suffire. Les capteurs consomment très peu et l’ESP8266 se réveille toutes les demi-heure pour se connecter au WiFi, prendre les points de mesure et envoyer les données. Toutes ces opérations additionnées durent environ 2 secondes. La consommation est donc moindre.

Intégration du code

Les libraires nécessaires au code sont :
– ESP8266Wifi
– PubSubClient
– Wire (intégré à Arduino IDE)
– Sodaq_BMP085
– DHT sensor library (Adafruit)

Toutes ces librairies sont disponibles sur le gestionnaire de librairies Arduino :

Accès au Gestionnaire de Bibliothèques Arduino

Sans plus tarder, le code ! Je ferai bientôt un article sur la meilleure manière de programmer sur ESP8266. Je teste plusieurs méthodes différentes actuellement. 🙂

/*
 * Capteur de pression, température et humidité connecté à base d'ESP8266
 *  
 * Librairies nécessaires :
 *  - ESP8266Wifi
 *  - PubSubClient
 *  - Wire (intégré à Arduino IDE)
 *  - Sodaq_BMP085
 *  - DHT sensor library (Adafruit)
 * 
 * https://bentek.fr
 * Licence : MIT
 * 
 */

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Sodaq_BMP085.h>
#include <DHT.h>


#define wifi_ssid "BenTeK_secure"							// A remplacer par le SSID de ton serveur MQTT
#define wifi_password "TuNAurasToujoursPasMonMotDePasse"	// A remplacer par ton mot de passe :-)
#define mqtt_server "10.3.141.1"
#define mqtt_user "guest"     //s'il a été configuré sur Mosquitto
#define mqtt_password "guest" //idem

long lastMsg = 0;     //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;

#define temperature_topic "capteurext1/temperature"       // Topic Température (°C)
#define pression_topic "capteurext1/pressionatmo"         // Topic Pression atmosphérique (Pa)
#define humidite_topic "capteurext1/humidite"             // Topic Humidité (%)

#define DHTPIN 12
#define DHTTYPE DHT11

volatile float temperatureBMP = 0;
volatile float temperatureDHT = 0;
volatile float temperaturemoy = 0;
volatile float pression = 0;
volatile float humidite = 0;

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

bool debug = false;



void setup() {
  Serial.begin(115200);
  
  bmp.begin();
  dht.begin();
  
  setup_wifi();           //On se connecte au réseau wifi
  client.setServer(mqtt_server, 1883);    //Configuration de la connexion au serveur MQTT
  client.setCallback(callback);  //La fonction de callback qui est executée à chaque réception de message   
  
  Serial.println("GO");
}

//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.println(WiFi.localIP());
}

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

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  
  getBMP();
  getDHT();

  temperaturemoy = (temperatureBMP + temperatureDHT) / 2;
  
  client.publish(temperature_topic, String(temperaturemoy).c_str(), true);    // Publie la temperature moyenne des deux capteurs (°C)
  client.publish(pression_topic, String(pression).c_str(), true);             // Publie la pression atmosphérique (Pa)
  client.publish(humidite_topic, String(humidite).c_str(), true);             // Publie l'hmidité ambiante de l'air (%)


    Serial.println("Activation Deep Sleep");
    ESP.deepSleep(1800 * 1000000); //activation du deepsleep, réveil dans 30 minutes (1800 secondes)
    delay(500); //attente activation du deep sleep
    Serial.begin(115200);
  
  delay(2000);
}

void getBMP(){

    delay(500);
  
    temperatureBMP = bmp.readTemperature();   //Lis la temperature (°C) du capteur Bosch
    pression = bmp.readPressure();            //Lis la pression atmosphérique

    delay(500);
}

void getDHT(){
  
  delay(500);
  
  humidite = dht.readHumidity();            //Lis l'humidité ambiante (%) du capteur DHT11.
  temperatureDHT = dht.readTemperature();   //Lis la température (°C) du capteur DHT11.

  delay(500);
}



void callback(char* topic, byte* payload, unsigned int length) {

}

 

Conclusions

L’ensemble de la conception 3D m’a pris en tout et pour tout 2 jours à temps complet. C’est dingue comment d’une simple idée, on peut arriver à un résultat autant abouti. Je pense qu’au niveau de la conception 3D, j’ai passé un cap qui me permet d’aller encore plus loin (et j’en ai plus qu’envie aujourd’hui). Je pense que l’impression 3D couplé à l’électronique et la programmation ont un bel avenir… à venir ! 😀

Pour ce qui est de l’électronique et de la programmation, je me suis senti bien plus à l’aise que la dernière fois. J’ai repris la même base que l’anémomètre connecté [3/50] et je l’ai adaptée à ce nouvel objet. J’ai également été aidé cette fois-ci par un programmateur ESP8266 sous forme de socket où l’on clipse le microcontrôleur pour le programmer. Mine de rien, ça m’a fait gagner un temps fou. Je pense que cet objet issu du monde DIY (je crois que c’est un FabLab en Angleterre qui l’a désigné) aura bientôt le droit à sa review sur le blog !

Socket_ESP8266 Socket de programmation ESP8266.

Bref, j’arrête de me lancer des fleurs, le prochain projet est déjà lancé à l’heure où j’écris ces lignes (le n°5 !). J’atteints le 5ème objet sur 50 et ma marge de progression est encore énorme !

Comme d’habitude, n’hésitez pas à commenter l’article pour me donner votre retour !

 

Benoît Jellimann.

 

Pin It on Pinterest

Shares
Share This