Serveur Web ESP8266 DHT11/DHT22 Arduino IDE

Serveur Web ESP8266 DHT11/DHT22 Arduino IDE

Dans ce projet, vous allez créer un serveur Web autonome avec un ESP8266 qui affiche la température et l’humidité avec un capteur DHT11 ou DHT22 à l’aide de l’IDE Arduino. Le serveur Web que vous allez créer est accessible avec n’importe quel appareil doté d’un navigateur sur votre réseau local.

ESP8266 DHT11 DHT22 Serveur Web de température et d'humidité avec Arduino IDE

Tout au long de ce didacticiel, nous montrerons comment créer deux serveurs Web différents :

  • Serveur Web #1 : Serveur Web asynchrone qui met à jour automatiquement la température et l’humidité sans qu’il soit nécessaire d’actualiser la page Web et avec un CSS personnalisé pour styliser la page Web.
  • Serveur Web #2 : Serveur Web HTTP simple qui affiche les dernières lectures de capteur lorsque la page est mise à jour dans une page HTML brute.

Ressources recommandées :

Apprenez-en plus sur l’ESP8266 avec notre cours : Domotique à l’aide de l’ESP8266.

Pièces requises

1680713536 121 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Pour construire ce projet, vous avez besoin des pièces suivantes :

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Schéma de principe ESP8266 et DHT11/DHT22

Avant de poursuivre le didacticiel, câblez le capteur de température et d’humidité DHT11 ou DHT22 à l’ESP8266 comme indiqué dans le schéma suivant.

Circuit de schéma de principe ESP8266 DHT11 DHT22

Dans cet exemple, nous connectons la broche de données DHT au GPIO5 (D1), mais vous pouvez utiliser n’importe quel autre GPIO approprié. Lisez notre guide de référence ESP8266 GPIO pour en savoir plus sur les GPIO ESP8266.

Si vous utilisez un ESP-01, GPIO 2 est la broche la plus appropriée pour se connecter à la broche de données DHT, comme indiqué dans le schéma suivant.

Circuit de schéma de principe ESP-01 DHT11 DHT22

Installation de la bibliothèque DHT pour ESP8266

Pour lire à partir du capteur DHT, nous utiliserons le Bibliothèque DHT d’Adafruit. Pour utiliser cette bibliothèque, vous devez également installer le Bibliothèque de capteurs unifiés Adafruit. Suivez les étapes suivantes pour installer ces bibliothèques.

1. Ouvrez votre IDE Arduino et accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.

2. Recherchez « DHT » dans la zone de recherche et installez la bibliothèque DHT d’Adafruit.

Installation de la bibliothèque Adafruit DHT

3. Après avoir installé la bibliothèque DHT d’Adafruit, saisissez « Adafruit Unified Sensor » dans la zone de recherche. Faites défiler vers le bas pour trouver la bibliothèque et installez-la.

Installation de la bibliothèque de pilotes Adafruit Unified Sensor

Après avoir installé les bibliothèques, redémarrez votre IDE Arduino.


1. Serveur Web asynchrone ESP8266

Pour construire le serveur Web, nous utiliserons le Bibliothèque ESPAsyncWebServer qui fournit un moyen simple de créer un serveur Web asynchrone. Construire un serveur Web asynchrone présente plusieurs avantages. Nous vous recommandons de jeter un coup d’œil rapide sur documentation de la bibliothèque sur sa page GitHub.

Installation de la librairie ESPAsyncWebServer

La bibliothèque ESPAsyncWebServer n’est pas disponible pour être installée dans le gestionnaire de bibliothèque IDE Arduino. Vous devez donc l’installer manuellement.

Suivez les étapes suivantes pour installer la bibliothèque ESPAsyncWebServer :

  1. Cliquez ici pour télécharger la librairie ESPAsyncWebServer. Vous devriez avoir un dossier .zip dans votre dossier Téléchargements
  2. Décompressez le dossier .zip et vous devriez obtenir le dossier ESPAsyncWebServer-master
  3. Renommez votre dossier de ESPAsyncWebServer-maître vers ESPAsyncWebServer
  4. Déplacez le dossier ESPAsyncWebServer vers le dossier des bibliothèques d’installation de votre IDE Arduino

Installation de la bibliothèque ESPAsync TCP

La librairie ESPAsyncWebServer nécessite le ESPAsyncTCP bibliothèque pour travailler. Suivez les étapes suivantes pour installer cette bibliothèque :

  1. Cliquez ici pour télécharger la librairie ESPAsyncTCP. Vous devriez avoir un dossier .zip dans votre dossier Téléchargements
  2. Décompressez le dossier .zip et vous devriez obtenir le dossier ESPAsyncTCP-master
  3. Renommez votre dossier de ESPAsyncTCP-maître vers ESPAsyncTCP
  4. Déplacez le dossier ESPAsyncTCP vers le dossier des bibliothèques d’installation de votre IDE Arduino
  5. Enfin, rouvrez votre IDE Arduino

Code

Nous allons programmer l’ESP8266 à l’aide de l’IDE Arduino, vous devez donc avoir le module complémentaire ESP8266 installé dans votre IDE Arduino. Si ce n’est pas le cas, suivez d’abord le didacticiel suivant :

Ouvrez votre IDE Arduino et copiez le code suivant.

/*********
  Rui Santos
  Complete project details at https://www.raspberryme.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/
*********/

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

#define DHTPIN 5     // Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
//#define DHTTYPE    DHT11     // DHT 11
#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

// current temperature & humidity, updated in loop()
float t = 0.0;
float h = 0.0;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000;  

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP8266 DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature</span> 
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">%</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String
  }
  else if(var == "HUMIDITY"){
    return String(h);
  }
  return String();
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println(".");
  }

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String(h).c_str());
  });

  // Start server
  server.begin();
}
 
void loop(){  
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    // Read temperature as Celsius (the default)
    float newT = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //float newT = dht.readTemperature(true);
    // if temperature read failed, don't change t value
    if (isnan(newT)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      t = newT;
      Serial.println
    }
    // Read Humidity
    float newH = dht.readHumidity();
    // if humidity read failed, don't change h value 
    if (isnan(newH)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      h = newH;
      Serial.println(h);
    }
  }
}

Afficher le code brut

Insérez vos informations d’identification réseau dans les variables suivantes et le code fonctionnera immédiatement.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Comment fonctionne le code

Dans les paragraphes suivants, nous expliquerons le fonctionnement du code. Continuez à lire si vous voulez en savoir plus ou passez à la section Démonstration pour voir le résultat final.

Importation de bibliothèques

Tout d’abord, importez les bibliothèques requises.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

Définition de vos identifiants réseau

Insérez vos informations d’identification réseau dans les variables suivantes, afin que l’ESP8266 puisse se connecter à votre réseau local.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Définition des variables

Définissez le GPIO auquel la broche de données DHT est connectée. Dans ce cas, il est connecté au GPIO5 (D1).

#define DHTPIN 5     // Digital pin connected to the DHT sensor

Ensuite, sélectionnez le type de capteur DHT que vous utilisez. Dans notre exemple, nous utilisons le DHT22. Si vous utilisez un autre type, il vous suffit de décommenter votre capteur et de commenter tous les autres.

#define DHTTYPE DHT22   // DHT 22 (AM2302)

Instanciez un objet DHT avec le type et la broche définis précédemment.

DHT dht(DHTPIN, DHTTYPE);

Créez un objet AsyncWebServer sur le port 80.

AsyncWebServer server(80);

Créez des variables flottantes pour conserver les valeurs de température et d’humidité actuelles. La température et l’humidité sont mises à jour dans la boucle().

float t = 0.0;
float h = 0.0;

Créez des variables de minuterie nécessaires pour mettre à jour les lectures de température toutes les 10 secondes.

unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000; 

Construire la page Web

Passant à la page du serveur Web.

1680713537 34 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Comme vous pouvez le voir dans la figure ci-dessus, la page Web affiche un titre et deux paragraphes. Il y a un paragraphe pour afficher la température et un autre pour afficher l’humidité. Il y a aussi deux icônes pour styliser la page.

Voyons comment cette page Web est créée.

Tout le texte HTML avec les styles inclus est stocké dans la variable index_html. Nous allons maintenant parcourir le texte HTML et voir ce que fait chaque partie.

La balise suivante rend votre page Web réactive dans n’importe quel navigateur.

<meta name="viewport" content="width=device-width, initial-scale=1">

La balise est nécessaire pour charger les icônes du site fontawesome.

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

modes

Entre les balises

, nous ajoutons du CSS pour styliser la page Web.

<style>
 html {
   font-family: Arial;
   display: inline-block;
   margin: 0px auto;
   text-align: center;
  }
  h2 { font-size: 3.0rem; }
  p { font-size: 3.0rem; }
  .units { font-size: 1.2rem; }
  .dht-labels{
    font-size: 1.5rem;
    vertical-align:middle;
    padding-bottom: 15px;
  }
</style>

Fondamentalement, nous configurons la page HTML pour afficher le texte avec la police Arial en bloc sans marge et aligné au centre.

html {
  font-family: Arial;
  display: inline-block;
  margin: 0px auto;
  text-align: center;
}

Nous définissons la taille de la police pour le titre (h2), le paragraphe (p) et les unités (.units) des lectures.

h2 { font-size: 3.0rem; }
p { font-size: 3.0rem; }
.units { font-size: 1.2rem; }

Les étiquettes pour les lectures sont stylées comme indiqué ci-dessous :

dht-labels{
  font-size: 1.5rem;
  vertical-align:middle;
  padding-bottom: 15px;
}

Toutes les balises précédentes doivent se trouver entre les balises et . Ces balises sont utilisées pour inclure du contenu qui n’est pas directement visible pour l’utilisateur, comme les balises , et les styles.

Corps HTML

À l’intérieur des balises se trouve l’endroit où nous ajoutons le contenu de la page Web.

Les balises

ajoutent un titre à la page Web. Dans ce cas, le texte « ESP8266 DHT server », mais vous pouvez ajouter n’importe quel autre texte.

<h2>ESP8266 DHT Server</h2>

Ensuite, il y a deux paragraphes. L’un pour afficher la température et l’autre pour afficher l’humidité. Les paragraphes sont délimités par les balises

et

. Le paragraphe pour la température est le suivant :

<p>
  <i class="fas fa-thermometer-half" style="color:#059e8a;"</i> 
  <span class="dht-labels">Temperature</span> 
  <span id="temperature">%TEMPERATURE%</span>
  <sup class="units">°C</sup>
</p>

Et le paragraphe pour l’humidité est sur l’extrait suivant :

<p>
  <i class="fas fa-tint" style="color:#00add6;"></i> 
  <span class="dht-labels">Humidity</span>
  <span id="humidity">%HUMIDITY%</span>
  <sup class="units">%</sup>
</p>

Les balises affichent les icônes fontawesome.

Comment afficher les icônes

Pour choisir les icônes, allez dans le Site web de Font Awesome Icons.

1680713537 673 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Recherchez l’icône que vous recherchez. Par exemple, « thermomètre ».

1680713537 89 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Cliquez sur l’icône souhaitée. Ensuite, il vous suffit de copier le texte HTML fourni.

<i class="fas fa-thermometer-half">
1680713538 763 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Pour choisir la couleur, il suffit de passer le paramètre style avec la couleur en hexadécimal, comme suit :

<i class="fas fa-tint" style="color:#00add6;"></i> 

Continuer avec le texte HTML…

La ligne suivante écrit le mot « Température » ​​dans la page Web.

<span class="dht-labels">Temperature</span>

Le texte TEMPÉRATURE entre les signes % est un espace réservé pour la valeur de température.

<span id="temperature">%TEMPERATURE%</span>

Cela signifie que ce texte %TEMPERATURE% est comme une variable qui sera remplacée par la valeur de température réelle du capteur DHT. Les espaces réservés sur le texte HTML doivent être entre les signes %.

Enfin, nous ajoutons le symbole du degré.

<sup class="units">°C</sup>

Les balises placent le texte en exposant.

Nous utilisons la même approche pour le paragraphe sur l’humidité, mais il utilise une icône différente et l’espace réservé %HUMIDITY%.

<p>
  <i class="fas fa-tint" style="color:#00add6;"></i> 
  <span class="dht-labels">Humidity</span>
  <span id="humidity">%HUMIDITY%</span>
  <sup class="units">%</sup>
</p>

Mises à jour automatiques

Enfin, il y a du code JavaScript dans notre page Web qui met à jour automatiquement la température et l’humidité, toutes les 10 secondes.

Les scripts dans le texte HTML doivent être placés entre les balises .

<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 10000 ) ;
</script>

Pour mettre à jour la température en arrière-plan, nous avons une fonction setInterval() qui s’exécute toutes les 10 secondes.

Fondamentalement, il fait une demande dans l’URL /temperature pour obtenir la dernière lecture de température.

  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

Lorsqu’il reçoit cette valeur, il met à jour l’élément HTML dont l’id est temperature.

if (this.readyState == 4 && this.status == 200) {
  document.getElementById("temperature").innerHTML = this.responseText;
}

En résumé, cette section précédente est responsable de la mise à jour de la température de manière asynchrone. Le même processus est répété pour les relevés d’humidité.

Important : étant donné que le capteur DHT est assez lent à obtenir les lectures, si vous prévoyez d’avoir plusieurs clients connectés à un ESP8266 en même temps, nous vous recommandons d’augmenter l’intervalle de demande ou de supprimer les mises à jour automatiques.

Processeur

Maintenant, nous devons créer la fonction processor(), qui remplacera les espaces réservés dans notre texte HTML par les valeurs réelles de température et d’humidité.

String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String
  }
  else if(var == "HUMIDITY"){
    return String(h);
  }
  return String();
}

Lorsque la page Web est demandée, nous vérifions si le code HTML contient des espaces réservés. S’il trouve l’espace réservé %TEMPERATURE%, nous renvoyons la température qui est stockée sur la variable t.

if(var == "TEMPERATURE"){
  return String
}

Si l’espace réservé est %HUMIDITY%, nous renvoyons la valeur d’humidité.

else if(var == "HUMIDITY"){
  return String(h);
}

installation()

Dans setup(), initialisez le moniteur série à des fins de débogage.

Serial.begin(115200);

Initialiser le capteur DHT.

dht.begin();

Connectez-vous à votre réseau local et imprimez l’adresse IP ESP8266.

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi..");
}

Enfin, ajoutez les lignes de code suivantes pour gérer le serveur Web.

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", String
});
server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", String(h).c_str());
});

Lorsque nous faisons une requête sur l’URL root, nous envoyons le texte HTML qui est stocké sur la variable index_html. Nous devons également passer la fonction processor, qui remplacera tous les espaces réservés par les bonnes valeurs.

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});

Nous devons ajouter deux gestionnaires supplémentaires pour mettre à jour les relevés de température et d’humidité. Lorsque nous recevons une requête sur l’URL /temperature, nous devons simplement envoyer la valeur de température mise à jour. C’est du texte brut, et il doit être envoyé sous forme de caractère, nous utilisons donc la méthode c_str().

server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", String
});

Le même processus est répété pour l’humidité.

server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", String(h).c_str());
});

Enfin, nous pouvons démarrer le serveur.

server.begin();

Dans la boucle () est l’endroit où nous obtenons de nouvelles lectures de température du capteur toutes les 10 secondes.

Fondamentalement, nous vérifions s’il est temps d’obtenir de nouvelles lectures de capteur :

if (currentMillis - previousMillis >= interval) {

Si c’est le cas, nous stockons une nouvelle lecture de température sur la variable newT

float newT = dht.readTemperature();

Si la variable newT est une lecture de température valide, nous mettons à jour la variable t.

else {
  t = newT;
  Serial.println
}

Le même processus est répété pour l’humidité.

// Read Humidity
float newH = dht.readHumidity();
// if humidity read failed, don't change h value 
if (isnan(newH)) {
   Serial.println("Failed to read from DHT sensor!");
}
else {
  h = newH;
  Serial.println(h);
}

C’est à peu près comme ça que le code fonctionne.

Téléchargement du code

Après avoir modifié l’esquisse avec les modifications nécessaires, si nécessaire, téléchargez le code sur votre ESP8266 (si vous ne pouvez pas télécharger le code sur votre ESP8266, lisez ce guide de dépannage).

Assurez-vous que vous avez sélectionné la bonne carte et le bon port COM. Accédez à Outils> Carte et sélectionnez le modèle ESP8266 que vous utilisez. Dans notre cas, nous utilisons le kit ESP8266 12-E NodeMCU.

1680713538 11 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Allez dans Outils > Port et sélectionnez le port COM auquel l’ESP8266 est connecté.

1680713538 585 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Appuyez sur le bouton de téléchargement de l’IDE Arduino.

Remarque : si vous utilisez un ESP-01, vous avez besoin d’un adaptateur série ou un Programmeur FTDI pour télécharger le code.

Adresse IP ESP8266

Après avoir téléchargé le code, ouvrez le moniteur série à un débit en bauds de 115200. Appuyez sur le bouton de réinitialisation ESP8266. L’adresse IP ESP8266 sera imprimée dans le moniteur série comme indiqué dans la figure suivante.

1680713538 523 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Manifestation

Dans votre réseau local, accédez à un navigateur et tapez l’adresse IP ESP8266. Il devrait afficher la page Web suivante avec les dernières lectures de capteur.

1680713539 240 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Les relevés de température et d’humidité sont mis à jour automatiquement toutes les 10 secondes sans qu’il soit nécessaire de rafraîchir la page Web.


2. Serveur Web HTTP simple ESP8266

Dans cette section, nous allons vous montrer comment créer un serveur Web HTTP simple qui affiche la température et l’humidité dans une page HTML brute. Ce serveur Web envoie une réponse HTTP lorsque votre navigateur fait une requête sur l’adresse IP ESP8266.

1680713539 283 Serveur Web ESP8266 DHT11DHT22 Arduino IDE

Démonstration vidéo

Tout d’abord, vous pouvez regarder la vidéo de démonstration du projet de serveur Web ESP8266 ci-dessous.

YouTube video

Code

Nous allons programmer l’ESP8266 à l’aide de l’IDE Arduino, vous devez donc avoir le module complémentaire ESP8266 installé dans votre IDE Arduino. Si vous n’avez pas suivi le tutoriel suivant en premier.

Ouvrez votre IDE Arduino et copiez le code suivant.

/*********
  Rui Santos
  Complete project details at https://www.raspberryme.com  
*********/

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include "DHT.h"

// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Replace with your network details
const char* ssid = "YOUR_NETWORK_NAME";
const char* password = "YOUR_NETWORK_PASSWORD";

// Web Server on port 80
WiFiServer server(80);

// DHT Sensor
const int DHTPin = 5;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// Temporary variables
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  dht.begin();
  
  // Connecting to 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.println("WiFi connected");
  
  // Starting the web server
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
  delay(10000);
  
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
}

// runs over and over again
void loop() {
  // Listenning for new clients
  WiFiClient client = server.available();
  
  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c == '\n' && blank_line) {
            // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
            float h = dht.readHumidity();
            // Read temperature as Celsius (the default)
            float t = dht.readTemperature();
            // Read temperature as Fahrenheit (isFahrenheit = true)
            float f = dht.readTemperature(true);
            // Check if any reads failed and exit early (to try again).
            if (isnan(h) || isnan
              Serial.println("Failed to read from DHT sensor!");
              strcpy(celsiusTemp,"Failed");
              strcpy(fahrenheitTemp, "Failed");
              strcpy(humidityTemp, "Failed");         
            }
            else{
              // Computes temperature values in Celsius + Fahrenheit and Humidity
              float hic = dht.computeHeatIndex(t, h, false);       
              dtostrf(hic, 6, 2, celsiusTemp);             
              float hif = dht.computeHeatIndex(f, h);
              dtostrf(hif, 6, 2, fahrenheitTemp);         
              dtostrf(h, 6, 2, humidityTemp);
              // You can delete the following Serial.print's, it's just for debugging purposes
              Serial.print("Humidity: ");
              Serial.print(h);
              Serial.print(" %\t Temperature: ");
              Serial.print
              Serial.print(" *C ");
              Serial.print(f);
              Serial.print(" *F\t Heat index: ");
              Serial.print(hic);
              Serial.print(" *C ");
              Serial.print(hif);
              Serial.print(" *F");
              Serial.print("Humidity: ");
              Serial.print(h);
              Serial.print(" %\t Temperature: ");
              Serial.print
              Serial.print(" *C ");
              Serial.print(f);
              Serial.print(" *F\t Heat index: ");
              Serial.print(hic);
              Serial.print(" *C ");
              Serial.print(hif);
              Serial.println(" *F");
            }
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature and humidity
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
            client.println(celsiusTemp);
            client.println("*C</h3><h3>Temperature in Fahrenheit: ");
            client.println(fahrenheitTemp);
            client.println("*F</h3><h3>Humidity: ");
            client.println(humidityTemp);
            client.println("%</h3><h3>");
            client.println("</body></html>");     
            break;
        }
        if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    }  
    // closing the client connection
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  }
}   

Afficher le code brut

Insérez vos informations d’identification réseau dans les variables suivantes et le code fonctionnera immédiatement.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Comment fonctionne le code

Nous avons expliqué en détail le fonctionnement d’un serveur Web très similaire dans un didacticiel précédent. Jetez un œil au didacticiel suivant pour une explication détaillée de chaque ligne de code : Créer un serveur Web ESP8266.

Dans cette section, nous allons simplement examiner les parties pertinentes pour cet exemple.

Importation de bibliothèques

Importez les bibliothèques DHT à lire depuis le capteur DHT et la bibliothèque ESP8266WiFi pour créer le serveur Web :

#include <Adafruit_Sensor.h>
#include <DHT.h>

Type de capteur DHT

Décommentez l’une des lignes suivantes pour le type de capteur que vous utilisez. Si vous utilisez un capteur DHT22, vous n’avez rien à modifier.

//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHTTYPE DHT22     // DHT 22  (AM2302), AM2321

Définition de vos identifiants réseau

Insérez vos informations d’identification réseau dans les variables suivantes, afin que l’ESP8266 puisse se connecter à votre réseau local.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Initialiser le capteur DHT

Définissez le GPIO auquel la broche de données DHT est connectée. Dans ce cas, il est connecté au GPIO5 (D1).

#define DHTPIN 5     // Digital pin connected to the DHT sensor

Instanciez un objet DHT avec le type et la broche définis précédemment.

DHT dht(DHTPIN, DHTTYPE);

installation()

Dans le setup(), initialisez le capteur DHT.

dht.begin();

boucle()

Dans la boucle(), nous vérifions si un nouveau client fait une requête :

if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

Lorsqu’un nouveau client fait une demande, nous lisons l’humidité, la température en degrés Celsius et Fahrenheit, et les enregistrons dans les variables h, t et f :

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);

Enfin, vous envoyez la réponse au client avec le texte HTML pour construire la page ainsi que la température et l’humidité :

client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
client.println(celsiusTemp);
client.println("*C</h3><h3>Temperature in Fahrenheit: ");
client.println(fahrenheitTemp);
client.println("*F</h3><h3>Humidity: ");
client.println(humidityTemp);
client.println("%</h3><h3>");
client.println("</body></html>");  

La température et l’humidité sont envoyées au client dans ces variables : celsiusTemp, fahrenheitTemp et humiditéTemp.

Manifestation

Après avoir apporté les modifications nécessaires, téléchargez le code sur l’ESP8266 comme décrit dans une section précédente.

Ouvrez le moniteur série Arduino IDE à un débit en bauds de 115200. Après quelques secondes, votre adresse IP devrait apparaître. Dans notre cas, c’est 192.168.1.95.

EDI Arduino

Ouvrez n’importe quel navigateur à partir d’un appareil connecté au même routeur que votre ESP. Tapez ensuite l’adresse IP et cliquez sur Entrée !

Serveur Web DHT simple ESP8266

Vous devriez maintenant voir les dernières lectures de température et d’humidité. Pour mettre à jour les lectures, il vous suffit de rafraîchir la page Web.

Dépannage

Si votre capteur DHT ne parvient pas à obtenir les lectures, lisez notre Guide de dépannage DHT pour vous aider à résoudre le problème.

Conclusion

Dans ce projet, nous vous avons montré comment afficher les lectures d’un capteur DHT sur une page Web. Nous avons fourni deux exemples : un serveur Web simple et un serveur Web asynchrone avec mises à jour automatiques.

Maintenant, vous pouvez facilement modifier les exemples fournis pour afficher les lectures d’autres capteurs. Si vous aimez les projets ESP8266 et IoT, jetez un œil à certaines de nos ressources :

Vous aimerez peut-être aussi certains de nos projets les plus populaires avec l’ESP8266 :

Avez-vous des questions? Laissez un commentaire ci-dessous!

Merci d’avoir lu.

Apprenez l’histoire de Raspberry Pi à travers cette vidéo :

YouTube video