ESP32 - NTP - DHT22 - OLed 0.96

date-heure-dht322


Nous allons afficher sur un afficheur Oled 096" I2C connecté à un ESP32 les données ci-dessous:

  • la température détectée par un DHT22
  • l'humidité détectée par un DHT22
  • la date fournie par NTP
  • l'heure fournie par NTP


prérequis


Nous utiliserons les codes des pages ci-dessous:


Câblage

esp32-ntp-dht22


DHT22 / ESP32          (Ou DHT11)
  • Vcc sur +3.3v
  • GND sur GND
  • Data sur Pin D5

Oled 0.96" / ESP32
  • Vcc sur +3.3v
  • GND sur GND
  • SDA sur GPIO21 (SDA)
  • SCL sur GPIO22 (SCL)


Le code

esp32-oled-wifi-ntp


// 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

heure_ete_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

  • delta_t
  • affichage_delta_t
  • affichage_lcd_delta_t


É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

Montage


  • 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
montage-1
montage-2
Montage-3
Montage-4
Personnaliser

Google Analytics

Google Analytics est un service utilisé sur notre site Web qui permet de suivre, de signaler le trafic et de mesurer la manière dont les utilisateurs interagissent avec le contenu de notre site Web afin de l’améliorer et de fournir de meilleurs services.

Facebook

Notre site Web vous permet d’aimer ou de partager son contenu sur le réseau social Facebook. En l'utilisant, vous acceptez les règles de confidentialité de Facebook: https://www.facebook.com/policy/cookies/

Twitter

Les tweets intégrés et les services de partage de Twitter sont utilisés sur notre site Web. En activant et utilisant ceux-ci, vous acceptez la politique de confidentialité de Twitter: https://help.twitter.com/fr/rules-and-policies/twitter-cookies