Sélectionner une page

Station météorologique ESP8266 utilisant l’IDE d’Arduino

Dans cet article, nous verrons comment réaliser une station météo vraiment cool en utilisant ESP8266 (NodeMCU) et DHT11, le capteur de pluie. Dans ce projet, nous apprendrons à fabriquer une station météorologique complète de type « DIY » en utilisant un ESP8266 et plusieurs capteurs. Il existe deux types de stations météo, l’une qui possède ses propres capteurs et l’autre où nous obtenons les données des serveurs de la station météo. Dans ce tutoriel, nous verrons les deux types de stations météorologiques.

Introduction

Qu’est-ce qu’une station météorologique ?

Une station météorologique est un appareil qui recueille des données météorologiques et environnementales à l’aide de nombreux capteurs différents. Les stations météorologiques sont également appelées centres météorologiques, stations météorologiques personnelles, stations météorologiques professionnelles, stations météorologiques domestiques, météorologues et prévisionnistes.

Les capteurs des stations météorologiques peuvent comprendre un thermomètre, LM35 ou DHT11, pour prendre les relevés de température, un baromètre (BMP180) pour mesurer la pression atmosphérique, ainsi que d’autres capteurs pour mesurer la pluie, le vent, l’humidité et autres. Les stations météorologiques vont de la simple technologie analogique à la technologie numérique. Certains se connectent même à un ordinateur ou à Internet, de sorte que les données recueillies peuvent être analysées avec le logiciel de la station météorologique.

Types de capteurs utilisés pour la station météorologique

Voici une liste des appareils de mesure utilisés dans les stations météorologiques :

  • Thermomètre (LM35). Un thermomètre mesure la température. Il peut mesurer la température à l’intérieur comme à l’extérieur, enregistrer des hauts et des bas, afficher des flèches de tendance pour indiquer une augmentation ou une diminution de la température, et même prévoir les futures plages de température à court terme.
  • Hygromètre (DHT11). Un hygromètre mesure l’humidité relative. L’humidité relative est la quantité ou le pourcentage de vapeur d’eau (eau sous forme gazeuse) dans l’air. L’humidité influence les facteurs environnementaux et les calculs tels que les précipitations, le brouillard, le point de rosée et l’indice de chaleur. En outre, le maintien d’une humidité adéquate à l’intérieur des bâtiments a des implications pour la santé et le foyer.
  • Baromètre (BMP180). Un baromètre mesure la pression atmosphérique. Un baromètre peut aider à prévoir le temps à venir en fonction des changements qu’il mesure dans la pression atmosphérique. Vous pouvez créer un graphique historique ou une flèche de tendance de pression afin de pouvoir suivre facilement les changements, comme une baisse de pression.
  • Anémomètre. Un anémomètre mesure la force ou la vitesse du vent. Les stations météorologiques ESP8266 peuvent afficher la vitesse du vent en MPH, KPH ou en nœuds, et enregistrer les relevés de la vitesse du vent actuelle, maximale et moyenne.
  • Girouette . Une girouette est un instrument qui détermine la direction dans laquelle souffle le vent. Pour indiquer la direction du vent, vous pouvez utiliser un encodeur rotatif ou un capteur de boussole magnétique avec le ESP8266.
  • Pluviomètre. Un pluviomètre mesure la pluie ou les précipitations liquides. Ces stations météorologiques comprennent des alertes de pluie pour vous avertir du début d’un épisode de pluie ou pour vous avertir d’éventuelles inondations.

Une station météorologique basée sur la norme ESP8266

Dans la première partie, nous allons réaliser la station météo en utilisant le DHT-11 et le capteur de pluie. Ces données sont donc envoyées au client (navigateur web). Nous y montons le serveur web en ESP8266.

Schéma de la station météorologique

Connectez le capteur de pluie à la broche A0 du NodeMCU via un diviseur de tension, le ESP8266 a une entrée de 1V sur l’ADC. Connectez le DHT11 au D5 du NodeMCU.

Code NodeMCU pour la station météorologique

Le programme est divisé en deux parties. La première partie contient le WiFi ESP8266 et les fonctions liées au matériel, c’est-à-dire notre fichier main.ino. La deuxième partie est constituée de HTML et de l’interface utilisateur GUI. Il s’agit du fichier index.h.

avant de charger le programme dans ESP. Mettez à jour votre SSID et votre mot de passe en code.

main.ino

/* 
 * ESP8266 NodeMCU DHT11 and Rain Sensor - Weather Station Example
 * https://arduinotutoriels.com
 * 
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
 
#include "index.h" //Our HTML webpage contents with javascripts
#include "DHTesp.h"  //DHT11 Library for ESP
  
#define LED 2        //On board LED
#define DHTpin 14    //D5 of NodeMCU is GPIO14

DHTesp dht;

//SSID and Password of your WiFi router
const char* ssid = "Your-SSID";
const char* password = "Your-Password";
 
ESP8266WebServer server(80); //Server on port 80
 
//===============================================================
// This routine is executed when you open its IP in browser
//===============================================================
void handleRoot() {
 String s = MAIN_page; //Read HTML contents
 server.send(200, "text/html", s); //Send web page
}

float humidity, temperature;

void handleADC() {
 int rain = analogRead(A0);

 
 //Create JSON data
 String data = "{"Rain":""+String(rain)+"", "Temperature":""+ String(temperature) +"", "Humidity":""+ String(humidity) +""}";
 
 digitalWrite(LED,!digitalRead(LED)); //Toggle LED on data request ajax
 server.send(200, "text/plane", data); //Send ADC value, temperature and humidity JSON to client ajax request

 //Get Humidity temperatue data after request is complete
 //Give enough time to handle client to avoid problems
  delay(dht.getMinimumSamplingPeriod());

  humidity = dht.getHumidity();
  temperature = dht.getTemperature();

  Serial.print("H:");
  Serial.println(humidity);
  Serial.print("T:");
  Serial.println(temperature); //dht.toFahrenheit(temperature));
  Serial.print("R:");
  Serial.println(rain);
}

//==============================================================
//                  SETUP
//==============================================================
void setup()
{
  Serial.begin(115200);
  Serial.println();


  // Autodetect is not working reliable, don't use the following line
  // dht.setup(17);

  // use this instead: 
  dht.setup(DHTpin, DHTesp::DHT11); //for DHT11 Connect DHT sensor to GPIO 17
  //dht.setup(DHTpin, DHTesp::DHT22); //for DHT22 Connect DHT sensor to GPIO 17

  WiFi.begin(ssid, password);     //Connect to your WiFi router
  Serial.println("");
 
  //Onboard LED port Direction output
  pinMode(LED,OUTPUT); 
  
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP
 
  server.on("/", handleRoot);      //Which routine to handle at root location. This is display page
  server.on("/readADC", handleADC); //This page is called by java Script AJAX
 
  server.begin();                  //Start server
  Serial.println("HTTP server started");
}

//==============================================================
//                     LOOP
//==============================================================
void loop()
{
  server.handleClient();          //Handle client requests
}

index.h

const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<title>Estación Meteorológica</title>
</head>
<style>
@import url(https://fonts.googleapis.com/css?family=Montserrat);
@import url(https://fonts.googleapis.com/css?family=Advent+Pro:400,200);
*{margin: 0;padding: 0;}

body{
  background:#544947;
  font-family:Montserrat,Arial,sans-serif;
}
h2{
  font-size:14px;
}
.widget{
  box-shadow:0 40px 10px 5px rgba(0,0,0,0.4);
  margin:100px auto;
  height: 330px;
  position: relative;
  width: 500px;
}

.upper{
  border-radius:5px 5px 0 0;
  background:#f5f5f5;
  height:200px;
  padding:20px;
}

.date{
  font-size:40px;
}
.year{
  font-size:30px;
  color:#c1c1c1;
}
.place{
  color:#222;
  font-size:40px;
}
.lower{
  background:#00A8A9;
  border-radius:0 0 5px 5px;
  font-family:'Advent Pro';
  font-weight:200;
  height:130px;
  width:100%;
}
.clock{
  background:#00A8A9;
  border-radius:100%;
  box-shadow:0 0 0 15px #f5f5f5,0 10px 10px 5px rgba(0,0,0,0.3);
  height:150px;
  position:absolute;
  right:25px;
  top:-35px;
  width:150px;
}

.hour{
  background:#f5f5f5;
  height:50px;
  left:50%;  
  position: absolute;
  top:25px;
  width:4px;
}

.min{
  background:#f5f5f5;
  height:65px;
  left:50%;  
  position: absolute;
  top:10px;
  transform:rotate(100deg);
  width:4px;
}

.min,.hour{
  border-radius:5px;
  transform-origin:bottom center;
  transition:all .5s linear;
}

.infos{
  list-style:none;
}
.info{
  color:#fff;
  float:left;
  height:100%;
  padding-top:10px;
  text-align:center;
  width:25%;
}
.info span{
  display: inline-block;
  font-size:40px;
  margin-top:20px;
}
.weather p {
  font-size:20px;padding:10px 0;
}
.anim{animation:fade .8s linear;}

@keyframes fade{
  0%{opacity:0;}
  100%{opacity:1;}
}

a{
 text-align: center;
 text-decoration: none;
 color: white;
 font-size: 15px;
 font-weight: 500;
}
</style>
<body>


<div class="widget"> 
  <div class="clock">
    <div class="min" id="min"></div>
    <div class="hour" id="hour"></div>
  </div>
  <div class="upper">
    <div class="date" id="date">21 March</div>
    <div class="year">Temperature</div>
    <div class="place update" id="temperature">23 &deg;C</div>
  </div>
  <div style="text-align: center;"><a href="https://arduinotutoriels.com" style="align:center">arduinotutoriels.com</a></div>
  <div class="lower">    
    <ul class="infos">
      <li class="info temp">
        <h2 class="title">TEMPERATURE</h2>
        <span class="update" id="temp">21 &deg;C</span>
      </li>
      <li class="info weather">
        <h2 class="title">WEATHER</h2>
        <p class="main update">Sunny</p>
      </li>
      <li class="info wind">
        <h2 class="title">RAIN</h2>
        <span class="update" id="rain">0%</span>
      </li>
      <li class="info humidity">
        <h2 class="title">HUMIDITY</h2>
        <span class="update" id="humidity">23%</span>
      </li>
    </ul>
  </div>
</div>

<script>
setInterval(drawClock, 2000);
    
function drawClock(){
    var now = new Date();
    var hour = now.getHours();
    var minute = now.getMinutes();
    var second = now.getSeconds();
    
    //Date
    var options = {year: 'numeric', month: 'long', day: 'numeric' };
     var today  = new Date();
    document.getElementById("date").innerHTML = today.toLocaleDateString("en-US", options);
    
    //hour
    var hourAngle = (360*(hour/12))+((360/12)*(minute/60));
    var minAngle = 360*(minute/60);
    document.getElementById("hour").style.transform = "rotate("+(hourAngle)+"deg)";
    //minute
    document.getElementById("min").style.transform = "rotate("+(minAngle)+"deg)";

    //Get Humidity Temperature and Rain Data
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
      var txt = this.responseText;
      var obj = JSON.parse(txt); //Ref: https://www.w3schools.com/js/js_json_parse.asp
        document.getElementById("rain").innerHTML = obj.Rain + "%";
        document.getElementById("temperature").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("temp").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("humidity").innerHTML = Math.round(obj.Humidity) + "%";
      }  
    };
   xhttp.open("GET", "readADC", true); //Handle readADC server on ESP8266
   xhttp.send();
}
</script>
</body>
</html>
)=====";

Résultats et tests

Après avoir téléchargé le code, ouvrez le moniteur de série et vous obtiendrez l’adresse IP.

Ouvrez l’adresse IP dans le navigateur web. Après l’avoir ouvert dans le navigateur web, vous verrez la LED bleue à bord clignoter. Cette LED change lorsqu’elle reçoit une requête http du navigateur web.

Dans le programme, nous envoyons une demande ajax pour mettre à jour la page sans la mettre à jour.

Comment fonctionne le programme de la station météorologique ?

Voyons maintenant le fonctionnement complet du programme et le circuit de la station météorologique.

Le projet complet se compose de la partie matérielle et logicielle. Nous allons d’abord nous pencher sur la partie matérielle.

Matériel de la station météorologique

La partie matérielle est simple, nous n’utilisons que deux capteurs DHT11 et le capteur de pluie. Vous pouvez ajouter d’autres capteurs comme le capteur de pression barométrique BMP180.

La sortie analogique du capteur de pluie est connectée à l’entrée analogique de l’ESP8266 par un diviseur de tension qui fait chuter la sortie du capteur de pluie pour qu’elle corresponde à la plage maximale de l’entrée analogique de l’ESP8266.

Le DHT11 donne des lectures de l’humidité et de la température. Il s’agit de la sortie numérique du capteur dans un flux de données en série. Pour cette interface de capteur, nous utilisons la bibliothèque DHTesp qui prend en charge toute la communication avec le capteur DHT11. Le DHT11 est connecté à la broche D5 du NodeMCU qui est le GPIO14.

#include "index.h" //Our HTML webpage contents with javascripts
#include "DHTesp.h"  //DHT11 Library for ESP
  
#define LED 2        //On board LED
#define DHTpin 14    //D5 of NodeMCU is GPIO14

DHTesp dht;

Le logiciel de la station météorologique

Le logiciel se compose des parties suivantes.

  • Connexion WiFi
  • Création de serveurs
  • Obtenir des données des capteurs
  • Envoi de l’interface graphique à l’utilisateur
  • Mise à jour des valeurs des capteurs sur le site web
  • Connexion au WiFi

La connexion à votre wifi se fait par l’intermédiaire de ESP8266 en utilisant le code suivant. Nous commençons par définir le côté wifi et le mot de passe.

//SSID and Password of your WiFi router
const char* ssid = "Your-SSID";
const char* password = "Your-Password";

Ensuite, nous essayons de nous connecter au wifi en utilisant WiFi.begin(ssid, mot de passe) et nous attendons que la connexion soit réussie en utilisant while (WiFi.status() != WL_CONNECTED).

WiFi.begin(ssid, password);     //Connect to your WiFi router
  Serial.println("");
 
  //Onboard LED port Direction output
  pinMode(LED,OUTPUT); 
  
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP

Une fois que nous nous sommes connectés au wifi avec succès, nous imprimons l’adresse IP attribuée par votre routeur WiFi sur le moniteur série à l’aide de la fonction WiFi.localIP().

La partie suivante consiste à créer un serveur web en ESP8266. Pour ce faire, nous incluons la bibliothèque du serveur web #include <ESP8266WebServer.h>

Ensuite, nous créons l’instance du serveur en utilisant la fonction ci-dessous. Le web utilise le port 80 par défaut, nous le définissons donc comme le port 80.

ESP8266WebServer server(80); //Server on port 80

Ensuite, dans setup(), nous avons créé des fonctions de gestion des demandes des clients, une pour afficher l’interface graphique et une autre qui envoie les données du capteur à l’utilisateur en utilisant AJAX et JSON. AJAX fait partie du site web.

 server.on("/", handleRoot);      //Which routine to handle at root location. This is display page
  server.on("/readADC", handleADC); //This page is called by java Script AJAX
 
  server.begin();                  //Start server
  Serial.println("HTTP server started");
}

Lorsque l’utilisateur entre dans ESP8266 IP, il demande une page racine. Cette demande est traitée par la fonction handleRoot(). Il envoie la page web (HTML) à l’utilisateur (navigateur web).

//===============================================================
// This routine is executed when you open its IP in browser
//===============================================================
void handleRoot() {
 String s = MAIN_page; //Read HTML contents
 server.send(200, "text/html", s); //Send web page
}

Une fois la page web chargée, elle contient un javascript avec un code AJAX qui envoie la demande de données au serveur web ESP8266 dans /readADC. Si vous entrez IP avec readADC, il demande comme indiqué ci-dessous. L’ESP envoie les données du capteur au format JSON.

Cette demande de lecture de l’ADC est traitée par la fonction handleADC(). comme indiqué ci-dessous. Le HandADC traite d’abord les données vers le client web, puis lit le capteur DHT11 pour éviter les retards de données. On peut y voir clairement que la variable de données maintient le JSON des valeurs du capteur. Plusieurs caractères d’échappement sont utilisés puisque nous utilisons des guillemets dans le JSON.

float humidity, temperature;

void handleADC() {
 int rain = analogRead(A0);

 
 //Create JSON data
 String data = "{"Rain":""+String(rain)+"", "Temperature":""+ String(temperature) +"", "Humidity":""+ String(humidity) +""}";
 
 digitalWrite(LED,!digitalRead(LED)); //Toggle LED on data request ajax
 server.send(200, "text/plane", data); //Send ADC value, temperature and humidity JSON to client ajax request

 //Get Humidity temperatue data after request is complete
 //Give enough time to handle client to avoid problems
  delay(dht.getMinimumSamplingPeriod());

  humidity = dht.getHumidity();
  temperature = dht.getTemperature();

  Serial.print("H:");
  Serial.println(humidity);
  Serial.print("T:");
  Serial.println(temperature); //dht.toFahrenheit(temperature));
  Serial.print("R:");
  Serial.println(rain);
}

Passons maintenant à la page web, c’est-à-dire à la partie du code HTML et JavaScript. Qui est présent dans le fichier index.h. Dans le Java Script, nous accédons aux éléments HTML en utilisant des ID.

Une partie du site web en Ajax java script. Nous appelons la fonction drawClock() toutes les deux secondes. en utilisant la fonction setInterval(drawClock, 2000) ;.

//Get Humidity Temperature and Rain Data
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
      var txt = this.responseText;
      var obj = JSON.parse(txt); //Ref: https://www.w3schools.com/js/js_json_parse.asp
        document.getElementById("rain").innerHTML = obj.Rain + "%";
        document.getElementById("temperature").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("temp").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("humidity").innerHTML = Math.round(obj.Humidity) + "%";
      }  
    };
   xhttp.open("GET", "readADC", true); //Handle readADC server on ESP8266
   xhttp.send();
}

Dans la fonction DrawClock() nous avons la partie AJAX qui envoie la requête GET à l’ESP en readADC. lorsque le navigateur web (programme java) reçoit le texte de réponse, c’est-à-dire JSON. il appelle la fonction readystatechange. dans laquelle nous confirmons que la requête est OK (200). si elle est OK, alors nous obtenons le texte de réponse, c’est-à-dire JSON et ensuite en utilisant le javascript json parsing JSON.parse(txt) ; nous obtenons toutes nos données de capteur dans des objets json. Les données de cet objet json sont mises à jour sur la page web de façon dynamique (sans mise à jour de la page) en utilisant document.getElementById(« id de l’élément html »).innerHTML = données du capteur.

C’est ainsi que tout fonctionne. L’interface utilisateur graphique est créée à l’aide de CSS et de HTML. qui n’est pas couvert ici car il est plus lié au développement web.

Station météorologique basée sur la norme ESP8266 utilisant les données d’un serveur

Dans celui-ci, nous n’utilisons aucun capteur, mais nous obtenons des données météorologiques du serveur de la station météorologique locale. Pour les visualiser, nous avons besoin d’un écran. Ce type d’application est comme avoir un petit appareil sur votre bureau qui demande des données météorologiques aux stations météo et les met à jour continuellement sur un petit écran. L’avantage de ce type de station météorologique est que vous obtenez les prévisions météorologiques.

Connexions aux stations météorologiques

Nous n’avons ici qu’un écran OLED 0.96″ et un NodeMCU.

Code pour Arduino IDE pour station météo utilisant NodeMCU

Avant de commencer à coder, nous devons installer quelques bibliothèques dans notre IDE Arduino.

Avant de télécharger le code, obtenez votre position en lat lon. Vous pouvez effectuer une recherche dans google et la remplacer

String Link = “/api/current?lat=18.53&lon=73.86”;

Ensuite, entrez le SSID et le mot de passe de votre wifi et téléchargez le code.

/*
 *  ESP8266 Weather Station Data Rading
 *  
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <WiFiClientSecure.h> 
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//#include <Wire.h>  // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy include: `#include "SSD1306.h"`

const char* wifiName = "Your-SSID";
const char* wifiPass = "Your-Password";

//Web Server address to read from 
const char *host = "fcc-weather-api.glitch.me";

//Enter you lat long here
String Link = "/api/current?lat=18.53&lon=73.86";
const int httpsPort = 443;  //HTTPS= 443 and HTTP = 80
 
//SHA1 finger print of certificate use web browser to view and copy
const char fingerprint[] PROGMEM = "8E 68 78 DD 47 8F 03 BF 8B 51 DB 62 FE 5A CB 6E E9 20 82 A1";

// Initialize the OLED display using Wire library
SSD1306Wire  display(0x3c, D2, D1);  //D2=SDK  D1=SCK  As per labeling on NodeMCU

//=======================================================================
//                               SETUP
//=======================================================================
void setup() {
  
  Serial.begin(115200);
  delay(1000);
  Serial.println();  

  Serial.println("Initializing OLED Display");
  display.init();

  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
  
  Serial.print("Connecting to ");
  Serial.println(wifiName);

  WiFi.begin(wifiName, wifiPass);
  
  display.clear();
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 10, "Connecting WiFi");
  display.display();
    
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  display.clear();
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 10, "Connected");
  display.display();

  
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());   //You can get IP address assigned to ESP
}
//=======================================================================
//                               LOOP
//=======================================================================
void loop() {

  WiFiClientSecure httpsClient;    //Declare object of class WiFiClient
 
  Serial.println(host);
 
  Serial.printf("Using fingerprint '%s'n", fingerprint);
  httpsClient.setFingerprint(fingerprint);
  httpsClient.setTimeout(15000); // 15 Seconds
  delay(1000);
  
  Serial.print("HTTPS Connecting");
  int r=0; //retry counter
  while((!httpsClient.connect(host, httpsPort)) && (r < 30)){
      delay(100);
      Serial.print(".");
      r++;
  }
  if(r==30) {
    Serial.println("Connection failed");
  }
  else {
    Serial.println("Connected to web");
  }

  //Get weather data
  Serial.print("requesting URL: ");
  Serial.println("GET " + Link + " HTTP/1.1rn" +
               "Host: " + host + "rn" +               
               "Connection: closernrn");
 
  httpsClient.print(String("GET ") + Link + " HTTP/1.1rn" +
               "Host: " + host + "rn" +               
               "Connection: closernrn");
 
  Serial.println("request sent");
                  
  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('n');
    if (line == "r") {
      Serial.println("headers received");
      break;
    }
  }
 
  Serial.println("reply was:");
  Serial.println("==========");
  String payload;
  while(httpsClient.available()){
    payload = httpsClient.readStringUntil('n');  //Read Line by Line
    Serial.println(payload); //Print response
  }
    int str_len = payload.length() + 1; 
    Serial.println(str_len);  
    // Prepare the character array (the buffer) 
    char json[str_len];
     
    // Copy it over 
    payload.toCharArray(json, str_len);
  
  StaticJsonDocument<1000> doc;  //Refere to calculate size https://arduinojson.org/v6/assistant/

  deserializeJson(doc, json);

  float coord_lon = doc["coord"]["lon"]; // 73.86
  float coord_lat = doc["coord"]["lat"]; // 18.53
  
  JsonObject weather_0 = doc["weather"][0];
  int weather_0_id = weather_0["id"]; // 800
  const char* weather_0_main = weather_0["main"]; // "Clear"
  const char* weather_0_description = weather_0["description"]; // "clear sky"
  const char* weather_0_icon = weather_0["icon"]; // "https://cdn.glitch.com/6e8889e5-7a72-48f0-a061-863548450de5%2F01d.png?1499366022009"
  
  const char* base = doc["base"]; // "stations"
  
  JsonObject main = doc["main"];
  float main_temp = main["temp"]; // 34.44
  float main_pressure = main["pressure"]; // 1010.6
  float main_humidity = main["humidity"]; // 22
  float main_temp_min = main["temp_min"]; // 34.44
  float main_temp_max = main["temp_max"]; // 34.44
  float main_sea_level = main["sea_level"]; // 1010.6
  float main_grnd_level = main["grnd_level"]; // 937.58
  
  float wind_speed = doc["wind"]["speed"]; // 2.43
  float wind_deg = doc["wind"]["deg"]; // 287.5
  
  int clouds_all = doc["clouds"]["all"]; // 0
  
  long dt = doc["dt"]; // 1553248419
  
  JsonObject sys = doc["sys"];
  float sys_message = sys["message"]; // 0.0031
  const char* sys_country = sys["country"]; // "IN"
  long sys_sunrise = sys["sunrise"]; // 1553216850
  long sys_sunset = sys["sunset"]; // 1553260540
  
  long id = doc["id"]; // 6943660
  const char* location = doc["name"]; // "Shivaji Nagar"
  int cod = doc["cod"]; // 200

  Serial.println(main_temp);
  Serial.println(main_pressure);
  Serial.println(main_humidity);
  Serial.println(location);

  display.clear();
  display.setFont(ArialMT_Plain_16);  
  display.drawString(0, 0, "T:");
  display.drawString(15, 0, String(main_temp));
  display.drawString(0, 15, "P:");
  display.drawString(15, 15, String(main_pressure));
  display.drawString(0, 30, "H:");
  display.drawString(15, 30, String(main_humidity));
  display.drawString(0, 45, "L:");
  display.drawString(15, 45, location);
  display.display();


  delay(5000);  //GET Data at every 5 seconds
}

Résultats et tests

Vous pouvez obtenir beaucoup d’informations sur le climat. Nous avons pris toutes les informations en variable mais seuls l’emplacement, la température, l’humidité et la pression sont affichés à l’écran.

C’est l’exemple le plus simple sur Internet. Ici, nous utilisons les API météorologiques de la FCC. Tous les autres exemples sur l’internet utilisent openWeather et certains autres services de paiement qui nécessitent des enregistrements. Vous ne devez pas vous inscrire sur un site web. Il suffit de mettre lat long et ça marche.