[4/50] Défi 50 objets : Humidité, Température et Pression
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 […]
Humidite-Temperature-Pression

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 !

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_ESP8266Socket 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.

 

2 Commentaires

  1. destroyedlolo

    Salut et super article ?
    Nous bossons plus ou moins sur les mêmes sujets.

    Heu, pourquoi etre parti sur le DHT11 plutot que le 22 a peine plus cher ? Tu n’as jamais de températures négatives ? Le 11 ne les prend pas en charge.

    Il existe plein de modele d’ESP : perso, mon favori est l’ESP-201 qui reprend plus ou moins les caracteristiques du 12F mais qui à le gros avantage de permettre une antenne externe. En plus, ayant des pins compatible breadboard, c’est plus pratique pour le prototypage et la programmation qui se fait avec un FDTI standard.

    Un exemple du 201 et d’un DHT22 sur mon site : http://destroyedlolo.info/ESP/Humidite/
    ?

    Es-tu content de l’alimentation de l’ESP par des cellules ? Est-ce que tu te passes d’une recharge manuelle ?
    J’envisage d’ici l’été de mettre une sonde déportée pour la température de la piscine, mais j’aimerai qu’elle soit totalement autonome.

    A+

    Réponse
  2. jdu

    Bonjour, le code après l’appel à la fonction deepSleep du 8266 est superflu vu que l’ESP va se réinitialiser complêtement à son « réveil ».
    Ca peut prêter à confusion.
    A+

    Réponse

Soumettre un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Pin It on Pinterest

Shares
Share This