ESP32 HTTP GET avec Arduino IDE (OpenWeatherMap.org et ThingSpeak)

ESP32 HTTP GET avec Arduino IDE (OpenWeatherMap.org et ThingSpeak)

Dans ce guide, vous apprendrez à effectuer des requêtes HTTP GET à l’aide de la carte ESP32 avec Arduino IDE. Nous montrerons comment décoder les données JSON d’OpenWeatherMap.org et tracer les valeurs dans des graphiques à l’aide de ThingSpeak.

ESP32 HTTP GET avec Arduino IDE OpenWeatherMap ThingSpeak

Conseillé: ESP32 HTTP POST avec Arduino IDE (ThingSpeak et IFTTT.com)

Méthode de requête HTTP GET

Le protocole de transfert hypertexte (HTTP) fonctionne comme un protocole de requête-réponse entre un client et un serveur. Voici un exemple :

  • L’ESP32 (client) soumet une requête HTTP à un Serveur (par exemple : OpenWeatherMap.org ou ThingSpeak) ;
  • Le serveur renvoie une réponse à l’ESP32 (client) ;
  • Enfin, la réponse contient des informations sur l’état de la demande et peut également contenir le contenu demandé.

HTTP OBTENIR

AVOIR est utilisé pour demander des données à une ressource spécifiée. Il est souvent utilisé pour obtenir des valeurs à partir d’API.

Par exemple, vous pouvez utiliser une requête simple pour renvoyer une valeur ou un objet JSON :

GET /weather?countryCode=PT

De plus, vous pouvez également faire une requête GET pour mettre à jour une valeur (comme avec ThingSpeak). Par exemple, vous pouvez utiliser :

GET /update?field1=value1

Notez que la chaîne de requête (nom = champ1 et valeur = valeur1) est envoyé dans l’URL de la requête HTTP GET.

(Avec HTTP GET, les données sont visibles par tout le monde dans la demande d’URL.)

Conditions préalables

Avant de poursuivre ce didacticiel, assurez-vous de remplir les conditions préalables suivantes.

EDI Arduino

Nous programmerons le ESP32 en utilisant Arduino IDE, alors assurez-vous que le module complémentaire ESP32 est installé.

Bibliothèque Arduino_JSON

Vous devez également installer le Bibliothèque Arduino_JSON. Vous pouvez installer cette bibliothèque dans le gestionnaire de bibliothèque Arduino IDE. Allez juste à Esquisser > Inclure la bibliothèque > Gérer les bibliothèques et recherchez le nom de la bibliothèque comme suit :

Installer la bibliothèque Arduino JSON Arduino IDE

Autres services Web ou API

Dans ce guide, vous apprendrez à configurer votre Carte ESP32 pour effectuer des requêtes HTTP vers OpenWeatherMap.org et ThingSpeak. Si vous préférez apprendre avec une solution locale, vous pouvez utiliser HTTP avec Node-RED. Tous les exemples présentés dans ce guide fonctionnent également avec d’autres API.

En résumé, pour rendre ce guide compatible avec n’importe quel service, vous devez rechercher la documentation de l’API de service. Ensuite, vous avez besoin du nom du serveur (URL ou adresse IP) et des paramètres à envoyer dans la requête (chemin de l’URL ou corps de la requête). Enfin, modifiez nos exemples pour les intégrer à n’importe quelle API que vous souhaitez utiliser.

1. ESP32 HTTP GET : données JSON (OpenWeatherMap.org)

Dans cet exemple, vous apprendrez à effectuer des requêtes API pour accéder aux données. À titre d’exemple, nous utiliserons l’API OpenWeatherMap. Cette API a un plan gratuit et fournit de nombreuses informations utiles sur la météo dans presque tous les endroits du monde.

HTTP GET Carte météo ouverte ESP32

Utilisation de l’API OpenWeatherMap

Une interface de programmation d’application (API) est un ensemble de fonctions écrites par des développeurs de logiciels pour permettre à quiconque d’utiliser leurs données ou leurs services. le OpenWeatherMap Le projet dispose d’une API qui permet aux utilisateurs de demander des données météorologiques.

Logo de l'API OpenWeatherMap

Dans ce projet, vous utiliserez cette API pour demander les prévisions météorologiques du jour pour l’emplacement que vous avez choisi. Apprendre à utiliser les API est une grande compétence car cela vous permet d’accéder à une grande variété d’informations en constante évolution, telles que les cours boursiers actuels, les taux de change, les dernières nouvelles, les mises à jour du trafic, les tweets, et bien plus encore.

Noter: Les clés API sont propres à l’utilisateur et ne doivent être partagées avec personne.

Le plan gratuit d’OpenWeatherMap fournit tout ce dont vous avez besoin pour mener à bien ce projet. Pour utiliser l’API, vous avez besoin d’une clé API, appelée APIID. Pour obtenir l’APIID :

  1. Ouvrez un navigateur et accédez à https://openweathermap.org/appid/
  2. appuyez sur la S’inscrire bouton et créer un compte gratuit.
  3. Allez sur ce lien : https://home.openweathermap.org/api_keys et obtenez votre clé API.
Copie de clé API OpenWeatherMap
  1. Sur le Clés API tab, vous verrez une clé par défaut (surlignée dans un rectangle rouge dans la figure ci-dessus); il s’agit d’une clé unique dont vous aurez besoin pour extraire des informations du site. Copiez et collez cette clé quelque part ; vous en aurez besoin dans un instant.
  2. Pour obtenir des informations sur la météo à l’endroit que vous avez choisi, saisissez l’URL suivante :
http://api.openweathermap.org/data/2.5/weather?q=yourCityName,yourCountryCode&APPID=yourUniqueAPIkey

Remplacer le nom de ta ville avec la ville pour laquelle vous voulez des données, votreCodePays avec le code pays de cette ville, et votreUniqueAPIkey avec la clé API unique de l’étape 4. Par exemple, l’URL de l’API mise à jour pour la ville de Porto, au Portugal, serait :

http://api.openweathermap.org/data/2.5/weather?q=Porto,
PT&APPID=801d2603e9f2e1c70e042e4f5f6e0---
  1. Copiez votre URL dans votre navigateur et l’API renverra un tas d’informations correspondant à votre météo locale. Nous avons obtenu les informations suivantes sur la météo à Porto, au Portugal, le jour où nous avons écrit ce tutoriel.
{"coord":{"lon":-8.61,"lat":41.15},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":294.44,"feels_like":292.82,"temp_min":292.15,"temp_max":297.04,"pressure":1008,"humidity":63},"visibility":10000,"wind":{"speed":4.1,"deg":240},"clouds":{"all":20},"dt":1589288330,"sys":{"type":1,"id":6900,"country":"PT","sunrise":1589260737,"sunset":1589312564},"timezone":3600,"id":2735943,"name":"Porto","cod":200}

Ensuite, vous verrez comment utiliser ces informations pour obtenir des données spécifiques telles que la température, l’humidité, la pression, la vitesse du vent, etc.

Code ESP32 HTTP GET OpenWeatherMap.org

Après avoir installé les modules complémentaires et les bibliothèques de cartes nécessaires, copiez le code suivant dans votre IDE Arduino, mais ne le téléchargez pas encore. Vous devez apporter quelques modifications pour que cela fonctionne pour vous.

/*
  Rui Santos
  Complete project details at Complete project details at https://Raspberryme.com/esp32-http-get-open-weather-map-thingspeak-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>

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

// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "REPLACE_WITH_YOUR_OPEN_WEATHER_MAP_API_KEY";
// Example:
//String openWeatherMapApiKey = "bd939aa3d23ff33d3c8f5dd1dd435";

// Replace with your country code and city
String city = "Porto";
String countryCode = "PT";

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;

String jsonBuffer;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
 
  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
}

void loop() {
  // Send an HTTP GET request
  if ((millis() - lastTime) > timerDelay) {
    // Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;
      
      jsonBuffer = httpGETRequest(serverPath.c_str());
      Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);
  
      // JSON.typeof(jsonVar) can be used to get the type of the var
      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }
    
      Serial.print("JSON object = ");
      Serial.println(myObject);
      Serial.print("Temperature: ");
      Serial.println(myObject["main"]["temp"]);
      Serial.print("Pressure: ");
      Serial.println(myObject["main"]["pressure"]);
      Serial.print("Humidity: ");
      Serial.println(myObject["main"]["humidity"]);
      Serial.print("Wind Speed: ");
      Serial.println(myObject["wind"]["speed"]);
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;
    
  // Your Domain name with URL path or IP address with path
  http.begin(client, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
}

Afficher le code brut

Définition de vos identifiants réseau

Modifiez les lignes suivantes avec vos identifiants réseau : SSID et mot de passe. Le code est bien commenté sur l’endroit où vous devez apporter les modifications.

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

Définition de votre clé API OpenWeatherMap.org

Insérez votre clé API dans ce qui suit comme :

String openWeatherMapApiKey = "REPLACE_WITH_YOUR_OPEN_WEATHER_MAP_API_KEY";

Définir votre ville et votre pays

Entrez la ville pour laquelle vous souhaitez obtenir des données, ainsi que le code du pays dans les variables suivantes :

// Replace with your country code and city
String city = "Porto";
String countryCode = "PT";

Après avoir effectué ces modifications, vous pouvez télécharger le code sur votre tableau. Continuez à lire pour savoir comment fonctionne le code.

Requête HTTP GET (objet JSON)

Dans le boucler()appeler le httpGETRequest() fonction pour faire la requête HTTP GET :

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;

jsonBuffer = httpGETRequest(serverPath.c_str());

le httpGETRequest() La fonction fait une requête à OpenWeatherMap et elle récupère une chaîne avec un objet JSON qui contient toutes les informations sur la météo de votre ville.

String httpGETRequest(const char* serverName) {
  HTTPClient http;

  // Your IP address with path or Domain name with URL path 
  http.begin(serverName);

  // Send HTTP POST request
  int httpResponseCode = http.GET();

  String payload = "{}"; 

  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
}

Décodage d’un objet JSON

Pour accéder aux valeurs, décodez l’objet JSON et stockez toutes les valeurs dans le jsonBuffer déployer.

JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) can be used to get the type of the var

if (JSON.typeof(myObject) == "undefined") {
  Serial.println("Parsing input failed!");
  return;
}

Serial.print("JSON object = ");
Serial.println(myObject);
Serial.print("Temperature: ");
Serial.println(myObject["main"]["temp"]);
Serial.print("Pressure: ");
Serial.println(myObject["main"]["pressure"]);
Serial.print("Humidity: ");
Serial.println(myObject["main"]["humidity"]);
Serial.print("Wind Speed: ");
Serial.println(myObject["wind"]["speed"]);

Démonstration HTTP GET

Après avoir téléchargé le code, ouvrez le Serial Monitor et vous verrez qu’il reçoit les données JSON suivantes :

{"coord":{"lon":-8.61,"lat":41.15},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":294.44,"feels_like":292.82,"temp_min":292.15,"temp_max":297.04,"pressure":1008,"humidity":63},"visibility":10000,"wind":{"speed":4.1,"deg":240},"clouds":{"all":20},"dt":1589288330,"sys":{"type":1,"id":6900,"country":"PT","sunrise":1589260737,"sunset":1589312564},"timezone":3600,"id":2735943,"name":"Porto","cod":200}

Ensuite, il imprime l’objet JSON décodé dans le moniteur série Arduino IDE pour obtenir les valeurs de température (en Kelvin), de pression, d’humidité et de vitesse du vent.

ESP32 ESP8266 NodeMCU HTTP GET avec la réponse OpenWeatherMap de l'IDE Arduino

À des fins de démonstration, nous demandons de nouvelles données toutes les 10 secondes. Cependant, pour un projet à long terme, vous devez augmenter la minuterie ou vérifier les limites d’appels API par heure/minute pour éviter d’être bloqué/banni.

2. ESP32 HTTP GET : mettre à jour la valeur (ThingSpeak)

Dans cet exemple, l’ESP32 effectue une requête HTTP GET pour mettre à jour une lecture dans ThingSpeak.

HTTP OBTENIR ThingSpeak ESP32

Utilisation de l’API ThingSpeak

ThingSpeak dispose d’une API gratuite qui vous permet de stocker et de récupérer des données via HTTP. Dans ce didacticiel, vous utiliserez l’API ThingSpeak pour publier et visualiser des données dans des graphiques où que vous soyez. À titre d’exemple, nous publierons des valeurs aléatoires, mais dans une application réelle, vous utiliseriez de vraies lectures de capteurs.

Pour utiliser ThingSpeak avec votre ESP, vous avez besoin d’une clé API. Suivez les étapes suivantes :

  1. Aller à ThingSpeak.com et créez un compte gratuit.
  2. Ensuite, ouvrez le Canaux languette.
  3. Créer un Nouvelle chaîne.
ESP32 ESP8266 NodeMCU ThingSpeak Créer un nouveau canal
  1. Ouvrez votre chaîne nouvellement créée et sélectionnez le Clés API onglet pour copier votre clé API.
ESP32 ESP8266 NodeMCU ThingSpeak View Copie d'écriture de clé API

Code ESP32 HTTP GET ThingSpeak

Copiez le croquis suivant dans votre IDE Arduino (tapez votre SSID, votre mot de passe et votre clé API) :

/*
  Rui Santos
  Complete project details at Complete project details at https://Raspberryme.com/esp32-http-get-open-weather-map-thingspeak-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <WiFi.h>
#include <HTTPClient.h>

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

// REPLACE WITH THINGSPEAK.COM API KEY
String serverName = "http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY";
// EXAMPLE:
//String serverName = "http://api.thingspeak.com/update?api_key=7HQJM49R8JAPR";

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;

void setup() {
  Serial.begin(115200); 

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
 
  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
  
  // Random seed is a number used to initialize a pseudorandom number generator
  randomSeed(analogRead(33));
}

void loop() {
  // Send an HTTP GET request
  if ((millis() - lastTime) > timerDelay) {
    // Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;

      String serverPath = serverName + "&field1=" + String(random(40));
      
      // Your Domain name with URL path or IP address with path
      http.begin(client, serverPath.c_str());
      
      // Send HTTP GET request
      int httpResponseCode = http.GET();
      
      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println(payload);
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

Afficher le code brut

Définition de vos identifiants réseau

Modifiez les lignes suivantes avec vos identifiants réseau : SSID et mot de passe. Le code est bien commenté sur l’endroit où vous devez apporter les modifications.

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

Définition de votre nom de serveur (clé API)

Modifier le nom du serveur variable pour inclure votre clé API.

String serverName = "http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY";

Maintenant, téléchargez le code sur votre tableau et cela devrait fonctionner immédiatement. Lisez la section suivante, si vous voulez savoir comment faire la requête HTTP GET.

Requête HTTP GET

Dans le boucler() est l’endroit où vous effectuez la requête HTTP GET toutes les 10 secondes avec des valeurs aléatoires :

String serverPath = serverName + "&field1=" + String(random(40));

// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str());

// Send HTTP GET request
int httpResponseCode = http.GET();

L’ESP32 fait une nouvelle requête dans l’URL suivante pour mettre à jour le capteur champ1 avec une nouvelle valeur (30).

http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY&field1=30

Ensuite, les lignes de code suivantes enregistrent la réponse HTTP du serveur.

if (httpResponseCode>0) {
  Serial.print("HTTP Response code: ");
  Serial.println(httpResponseCode);
  String payload = http.getString();
  Serial.println(payload);
}
else {
  Serial.print("Error code: ");
  Serial.println(httpResponseCode);
}

Dans le moniteur série Arduino IDE, vous devriez voir un code de réponse HTTP de 200 (cela signifie que la requête a réussi).

Réponse du moniteur série ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE

Votre tableau de bord ThingSpeak devrait recevoir de nouvelles lectures toutes les 10 secondes.

ESP32 ESP8266 NodeMCU HTTP GET et HTTP POST avec Arduino IDE ThingSpeak Chart

Pour une application finale, vous devrez peut-être augmenter le minuteur ou vérifier les limites d’appels d’API par heure/minute pour éviter d’être bloqué/banni.

Conclusion

Dans ce didacticiel, vous avez appris à intégrer votre ESP32 à des services Web à l’aide de requêtes HTTP GET. Vous pouvez également faire des requêtes HTTP POST avec l’ESP32.

Si vous utilisez une carte ESP8266, lisez :

Vous aimerez peut-être aussi lire :

J’espère que ce projet vous a plu. Si vous avez des questions, postez un commentaire ci-dessous et nous essaierons de vous répondre.

Si vous aimez ESP32, vous pourriez envisager de vous inscrire à notre cours « Apprendre ESP32 avec Arduino IDE ». Vous pouvez également accéder à nos ressources ESP32 gratuites ici.

Merci pour la lecture.