ESP32 - NTP - DHT22 - OLed 0.96
prérequis
Nous utiliserons les codes des pages ci-dessous:
Le code
// Librairies
#include <WiFi.h> // Connexion Wifi
#include <Wire.h> // Gestion I2C pour Oled SDA / SCL
#include <Adafruit_GFX.h> // Affichage graphique
#include <Adafruit_SSD1306.h> // Driver Oled 0.96" - SSD1306
#include <Adafruit_Sensor.h> // Sensor Adafruit
#include <DHT.h> // DHT22-DHT11
#include <NTPClient.h> // Client NTP - Obtenir Année, Jour, Heure, Minute, Seconde, etc ....
#include <WiFiUdp.h> // Utilisation du protocole UDP
// Configuration WiFi
const char* ssid = "Votre_SSID"; // Votre_SSID
const char* password = "Votre_Mot_de_Passe"; // Votre_Mot_de_Passe
// Configuration OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTPIN 5 // DHT22 en D5
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE); // Initialisation du DHT
// Configuration NTP - Serveur NTP pool.ntp.org
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 60000); // UTC+1 - Recupération des données Date & Heure - Paris
void setup() {
Serial.begin(115200);
// Demarrage du DHT
dht.begin();
// Connexion WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connecté.");
// Initialisation de l'écran OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Échec de l'initialisation de l'écran OLED !");
for (;;);
}
// Affichage Wifi connecté sur Oled
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(15, 0); // Colonne 15 Ligne 10
display.print("WiFi connect");
display.cp437(true); // Affichage du é - code cp437 = 130
display.write(130);
display.display();
delay(1000); // Mise à jour chaque seconde
// Démarrer le client NTP
timeClient.begin();
}
void loop() {
timeClient.update(); // Update de la date & heure
float t = dht.readTemperature(); // Lecture temperature
float h = dht.readHumidity(); // Lecture humidité
if (isnan(h) || isnan(t)) { // Si h ou t sont faux (isnan) = affichage message d'erreur
Serial.println("Failed to read from DHT sensor!"); // Detection erreur du DHT
}
// Récupérer et formater l'heure et la date
unsigned long epochTime = timeClient.getEpochTime();
struct tm *timeInfo;
time_t rawTime = epochTime;
timeInfo = localtime(&rawTime);
int day = timeInfo->tm_mday;
int month = timeInfo->tm_mon + 1; // Janvier = 0
int year = timeInfo->tm_year + 1900;
int hours = timeInfo->tm_hour;
int minutes = timeInfo->tm_min;
int seconds = timeInfo->tm_sec;
// Création des variables dateBuffer & timeBuffer
char dateBuffer[20];
sprintf(dateBuffer, "%02d/%02d/%04d", day, month, year); // Format jj/mm/aaaa
char timeBuffer[10];
sprintf(timeBuffer, "%02d:%02d:%02d", hours, minutes, seconds); //Format hh:mm:ss
// Effacer l'écran et définition de la taille des caractéres
display.clearDisplay(); // Effacement de l'afficheur
display.setTextSize(1); // Taille 1 pour tous les caractères - La taille ne change pas - Il n'est pas nécessaire de la redefinir dans le code
// Affichage 1 ligne
display.setCursor(0,0); // Position du curseur - colonne 0 et ligne 0
display.print("---------------------"); // 21 - seulement
// Date
display.setCursor(15, 7); // Colonne 15 Ligne 7
display.print("Date: ");
display.print(dateBuffer); // Affichage de la date au format jj/mm/aaaa
// Heure
display.setCursor(18, 17); // Colonne 18 Ligne 17
display.print("Heure: ");
display.print(timeBuffer); // Affichage de l'heure au format hh:mm:ss
// Affichage 1 ligne
display.setCursor(0,23); // Position du curseur - colonne 0 et ligne 23
display.print("---------------------"); // 21 - seulement
// Preparation de l'affichage température
display.setCursor(0,35); // Position du curseur - colonne 0 et ligne 35
display.print("Temp");
display.cp437(true);
display.write(130); // Caractère é
display.print("rature: ");
display.setCursor(75,35); // Position du curseur - colonne 75 et ligne 35
display.print(t); // Affichage du contenu de la variable t
display.print(" ");
display.cp437(true); // Driver cp437 pour ° Signe de temperature Celcius
display.write(167); // code cp437 167 = °
display.print("C");
// Preparation de l'affichage humidité
display.setCursor(0, 46); // Position du curseur - colonne 0 et ligne 46
display.print("Humidit");
display.cp437(true);
display.write(130); // Caractere é
display.print(": ");
display.setCursor(75, 46); // Position du curseur - colonne 75 et ligne 46
display.print(h); // Affichage du contenu de la variable h
display.print(" %");
// Affichage 1 ligne - Limite max du bas de l'Oled = 60
display.setCursor(0,60); // Position du curseur - colonne 0 et ligne 60
display.print("---------------------"); // 21 - seulement
display.display();
delay(1000); // Mise à jour chaque seconde
}
Télécharger le code ESP32_OLED_Wifi_NTP_DHT22_02.ino
(Fichier zipper)
Heure d'été et heure d'hiver
Réglage de l'heure d'été et de l'heure d'hiver dans le code
Modifier la ligne ci-dessous
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 60000); // Heure d'hiver
ou
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600 * 2, 60000); // Heure d'été
- Heure d'hiver UTC+1 = 3600
- Heure d'été UCT+2 = 3600 * 2
Etalonnage de la température
Étalonnage du DHT11/DHT22
Il est possible que votre station météo affiche une température supérieure de quelques degrés par rapport à la température réelle de la pièce.
(Faire le test avec un autre thermomètre)
Pourquoi cette différence de température ?
Le DHT est étalonné par le constructeur, donc la température devrait être correcte.
Lorsque le montage n'est pas dans la boite, l'affichage de la température est correcte.
Mais une fois mis dans la boite, le DHT étant juste au dessous de l'ESP, affiche la température de la pièce + les quelques degrés supplémentaires dégagés par l'EPS (D'ou cette différence)
Si c'est le cas avec votre montage et votre boite, voici comment corriger la température affichée par la station météo
Exemple:
Votre thermomètre affiche 22,00°
La station météo affiche 24,50°
Soit 2,5° en plus dégagés par l'EPS ....
Dans le code au niveau des #define .... , ajouter la ligne: (Voir le code plus haut)
#define delta_t 2.5 // delta_t est le nom de la variable, 2.5 est le delta en température, (mettre 2 point 5, mais pas 2 virgule 5)
Dans le void loop()
Pour vérifier les valeurs dans le moniteur série, vous pouvez ajouter (c'est optionnel)
Serial.println(t - delta_t); // température relevée - le delta
Puis pour l'affichage sur l'écran, modifier la ligne
display.print(t);
en
display.print(t - delta_t); // température relevée - le delta
Vérifier puis téléverser ....
Montage et Boite
- La boite a été imprimée en 3D avec du PLA blanc
- Le bouton vert permet l'affichage des données (Appui sur le bouton - Affichage durant 5 secondes)
- Utilisation de câbles "Dupont" souples
- Utilisation d'une feuille de plastique pour isoler les pins du DHT et du LCD pour éviter le contact électrique avec l'ESP
- L'alimentation est réalisée avec un chargeur de smartphone 5V / 2A