Un capteur connecté au MQTT avec un affichage LCD pour surveiller les relevés de température et d’humidité dans ma maison. J’en ai construit trois et les ai placés dans des pièces différentes. Les relevés de température et d’humidité sont envoyés par MQTT à mon tableau de bord Node Red sur le Raspberry Pi.
Bien qu’il ne soit pas vraiment nécessaire d’avoir un affichage numérique pour un capteur connecté, il est pratique de pouvoir voir la température sans avoir à se connecter au tableau de bord du Node Red.
Pièces utilisées pour construire l’unité
- D1 mini
- DHT22 Shield
- Digital readout IC2 KY34-B
- Dupont connectors
- Boîtier imprimé en 3D
- Alimentation électrique 5v
Première étape
Conception et impression
Modélisation 3D de boiter
J’ai utilisé Tinkercad pour créer le modèle 3D de mon dessin. C’est la première fois que j’utilise Tinkercad et je le recommande vivement. Il est très facile à utiliser et produit un bon modèle.
Les fichiers stl peuvent être téléchargés sur Thingiverse
3d Impression de la boiter
Le dessin a été imprimé en PLA noir avec une résolution de 0,2 et un remplissage de 20 %. La base a été imprimée avec un support activé pour le trou oblong d’alimentation électrique.
Deuxième étape
Programmation et connexions
Téléchargez le code sur le mini D1
En utilisant le code Arduino ci-dessous, changez les détails de la connexion wifi pour votre propre réseau wifi. Définissez également l’adresse IP du Raspberry Pi qui fait tourner le serveur mqtt.
Vous aurez également besoin des bibliothèques en plus
- ESP8266 support libraries
- Mqtt support
- IC2 Display
- DHT22
ils peuvent être facilement installés via l’option “gérer les bibliothèques” dans Arduino IDE
Une fois terminé, vous pouvez compiler et télécharger vers le D1 mini.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
#define DHTPIN D4 // what pin the DHT is connected to
// Initialize the OLED display using Wire library
SSD1306 display(0x3C, D3, D5); // (I2C Address, SCL Pin, SDA Pin)
#define DHTTYPE DHT22 // DHT 22 (AM2302)
const int TEMPERATURE_INTERVAL = 30;
unsigned long last_temperature_sent = 0;
// WiFi Connection Details
const char* ssid = "Your SSID";
const char* password = "Your password";
// Raspberry Pi IP address, so it connects to your MQTT broker
const char* mqtt_server = "IP address of mqtt server";
// Change these to suit
WiFiClient wemos_lounge;
PubSubClient client(wemos_lounge);
const int HUMIDITY_INTERVAL = 30;
unsigned long last_humidity_sent = 0;
String display_temp;
String display_humid;
DHT dht(DHTPIN, DHTTYPE);
// This functions connects your ESP8266 to your router
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
// This functions reconnects your ESP8266 to your MQTT broker
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("wemos_lounge")) {
Serial.println("connected");
// Subscribe or resubscribe to a topic
client.subscribe("heating/temperature_lounge");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setupHandler() {
// Do what you want to prepare your sensor
display.clear();
}
void getSendTemperature() {
if (millis() - last_temperature_sent >= TEMPERATURE_INTERVAL * 1000UL || last_temperature_sent == 0) {
float temperature = dht.readTemperature(false);
if (isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// May need to offset temperature reading:
// I found the reading to be 3.1° too high
display_temp = (temperature-3.1);
int temp = round(temperature-3.1);
char cstr[16];
itoa(temp, cstr, 10);
client.publish("heating/temperature_lounge",cstr);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
}
}
void getSendHumid() {
if (millis() - last_humidity_sent >= HUMIDITY_INTERVAL * 1000UL || last_humidity_sent == 0) {
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
display_humid = humidity;
int humid = round(humidity);
char cstr[16];
itoa(humid, cstr, 10);
client.publish("heating/humidity_lounge", cstr);
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
}
}
void displayData() {
display.clear();
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.setFont(ArialMT_Plain_24);
display.drawString(66, 5, display_temp + "C");
display.drawString(66, 35, display_humid + "%");
display.display();
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
// Initialising the display.
WiFi.mode(WIFI_STA);
display.init();
display.clear();
display.flipScreenVertically();
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.display();
}
void loop() {
//connect wifi if not connected
if (WiFi.status() != WL_CONNECTED) {
delay(1);
setup_wifi();
return;
}
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("wemos_lounge");
getSendTemperature();
getSendHumid();
displayData();
delay(2000);
}
Assemblage des composants
J’ai acheté le D1 mini et le chapeau DHT22 chez AliExpress. C’est une source bon marché pour ce type de composants (si vous n’êtes pas très pressé, la livraison peut prendre jusqu’à 3 semaines).
Connexions de l’écran au D1 mini
- Fil rouge VCC à 3,3v
- Fil noir GND à G
- Fil blanc SCL à D5
- Fil violet SDA à D3
Troisième étape
Assemblage des composants dans le boîtier
J’ai utilisé mon pistolet à colle chaude pour assembler le capteur de température et d’humidité connecté.
Commencez par coller le présentoir. Il y a des épingles de positionnement dans l’impression (mais elles ne s’alignent pas toujours très bien)
Il est nécessaire de couper la languette du capteur DHT22 pour lui permettre de s’insérer dans le boîtier
Insérez ensuite l’ensemble D1 mini et DHT22, en veillant à utiliser un peu de colle chaude pour assurer un espace entre le bouclier du DHT22 et l’écran.
Utilisation du capteur de température et d'humidité connecté
Tableau de bord du Node Red
Actuellement, je ne les utilise que pour avoir une idée de la température et de l’humidité dans toute la maison, le but étant de les utiliser à terme pour ouvrir et fermer les circuits de chauffage au sol.