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

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

Dans ce guide, vous apprendrez à effectuer des requêtes HTTP POST à ​​l’aide de la carte ESP32 avec Arduino IDE. Nous montrerons comment publier des données JSON ou des valeurs encodées d’URL sur deux API Web (ThingSpeak et IFTTT.com).

ESP32 HTTP POST avec Arduino IDE IFTTT ThingSpeak

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

Méthode de requête HTTP POST

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 : ThingSpeak ou IFTTT.com) ;
  • 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é.

POSTE HTTP

PUBLIER est utilisé pour envoyer des données à un serveur pour créer/mettre à jour une ressource. Par exemple, publiez des lectures de capteurs sur un serveur.

Les données envoyées au serveur avec POST sont stockées dans le corps de la requête HTTP :

POST /update HTTP/1.1
Host: example.com
api_key=api&field1=value1
Content-Type: application/x-www-form-urlencoded

Dans le corps de la requête, vous pouvez également envoyer un objet JSON :

POST /update HTTP/1.1
Host: example.com
{api_key: "api", field1: value1}
Content-Type: application/json

(Avec HTTP POST, les données ne sont pas visibles dans la demande d’URL. Cependant, si elles ne sont pas chiffrées, elles sont toujours visibles dans le corps de la demande.)

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é.

Autres services Web ou API

Dans ce guide, vous apprendrez à configurer votre Carte ESP32 pour effectuer des requêtes HTTP vers ThingSpeak et IFTTT.com. 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. Données HTTP POST ESP32 (ThingSpeak)

Dans cet exemple, l’ESP32 effectue une requête HTTP POST pour envoyer une nouvelle valeur à ThingSpeak.

HTTP POST 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 l’API ThingSpeak, 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 Chaînes 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 POST ThingSpeak

Copiez le croquis suivant dans votre IDE Arduino :

/*
  Rui Santos
  Complete project details at Complete project details at https://Raspberryme.com/esp32-http-post-ifttt-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";

// Domain Name with full URL Path for HTTP POST Request
const char* serverName = "http://api.thingspeak.com/update";
// Service API Key
String apiKey = "REPLACE_WITH_YOUR_API_KEY";

// 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;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set 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 POST request every 10 seconds
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;
    
      // Your Domain name with URL path or IP address with path
      http.begin(client, serverName);
      
      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      // Data to send with HTTP POST
      String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));           
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);
      
      /*
      // If you need an HTTP request with a content type: application/json, use the following:
      http.addHeader("Content-Type", "application/json");
      // JSON data to send with HTTP POST
      String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";           
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);*/
     
      Serial.print("HTTP Response 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éfinir votre clé API

Modifier le clé API variable pour inclure votre clé API ThingSpeak.

String apiKey = "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 POST.

Requête HTTP POST

Dans le boucler() est l’endroit où vous effectuez la requête HTTP POST avec des données encodées en URL toutes les 10 secondes avec des données aléatoires :

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Data to send with HTTP POST
String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));

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

Par exemple, l’ESP32 fait une requête encodée en URL pour publier une nouvelle valeur (30) sur champ1.

POST /update HTTP/1.1
Host: api.thingspeak.com
api_key=api&field1=30
Content-Type: application/x-www-form-urlencoded

Ou vous pouvez décommenter ces lignes suivantes pour faire une requête avec des données JSON (au lieu d’une requête encodée en URL) :

// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");

// JSON data to send with HTTP POST
String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";

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

Voici un exemple de requête HTTP POST avec des données JSON :

POST /update HTTP/1.1
Host: api.thingspeak.com
{api_key: "api", field1: 30}
Content-Type: application/json

Ensuite, les lignes suivantes impriment le code de réponse du serveur.

Serial.print("HTTP Response 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 aléatoires 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.

2. ESP32 HTTP POST (IFTTT.com)

Dans cet exemple, vous apprendrez à déclencher une API Web pour envoyer des notifications par e-mail. À titre d’exemple, nous utiliserons l’API IFTTT.com. IFTTT a un plan gratuit avec de nombreuses automatisations utiles.

HTTP POST IFTTT ESP32

Utilisation de l’API Webhooks IFTTT.com

IFTTT signifie « If This Than That », et il s’agit d’un service Web gratuit permettant de créer des chaînes d’instructions conditionnelles simples appelées applets.

IFTTT.com logo png

Cela signifie que vous pouvez déclencher un événement lorsque quelque chose se produit. Dans cet exemple, l’applet envoie trois valeurs aléatoires à votre e-mail lorsque l’ESP32 fait une demande. Vous pouvez remplacer ces valeurs aléatoires par des lectures de capteur utiles.

Créer un compte IFTTT

Si vous n’avez pas de compte IFTTT, rendez-vous sur le site IFTTT : ifttt.com et entrez votre e-mail pour créer un compte et commencer. Créer un compte sur IFTTT est gratuit !

Ensuite, vous devez créer une nouvelle applet. Suivez les étapes suivantes pour créer un nouveau
applet :

1. Ouvrez le menu de gauche et cliquez sur le « Créer » bouton.

ifttt découvrir créer une nouvelle applet

2. Cliquez sur le «cette » mot. Recherchez le « Webhooks» et sélectionnez l’icône Webhooks.

Sélectionnez les services de webhooks IFTTT.com

3. Choisissez le « Recevoir une demande Web” déclencher et donner un nom à l’événement. Dans ce cas, j’ai tapé « test_event”. Ensuite, cliquez sur le « Créer un déclencheur » bouton.

4. Cliquez sur le « cette” mot pour continuer. Maintenant, définissez ce qui se passe lorsque l’événement que vous avez défini est déclenché. Recherchez le « E-mail» et sélectionnez-le. Vous pouvez laisser les options par défaut.

sélectionner le service de messagerie ifttt

5. Appuyez sur la touche « Finir” pour créer votre Applet.

Tester votre applet

Avant de poursuivre le projet, il est important de tester d’abord votre Applet. Suivez les étapes suivantes pour le tester :

1. Rechercher Webhooks service ou ouvrez ce lien : https://ifttt.com/maker_webhooks

2. Cliquez sur le « Documentation » bouton.

documentation sur les webhooks ifttt

Une page telle qu’illustrée dans la figure suivante s’affiche. La page affiche votre clé API unique. Vous ne devez partager votre clé API unique avec personne.

3. Remplissez la section « Pour déclencher un événement ». Ensuite, cliquez sur le « Essaye-le » bouton.

Service IFTTT Webhooks testant la requête HTTP POST GET avec des valeurs

4. L’événement devrait être déclenché avec succès et vous recevrez un message vert indiquant « L’événement a été déclenché”.

5. Accédez à votre compte de messagerie. Vous devriez avoir un nouvel e-mail dans votre boîte de réception du service IFTTT avec les valeurs que vous avez définies à l’étape précédente.

Si vous avez reçu un e-mail avec les données saisies dans la demande de test, cela signifie que votre applet fonctionne comme prévu. Maintenant, nous devons programmer l’ESP32 pour envoyer une requête HTTP POST au service IFTTT avec les lectures du capteur.

Code ESP32 HTTP POST Webhooks IFTTT.com

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-post-ifttt-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";

// Domain Name with full URL Path for HTTP POST Request
// REPLACE WITH YOUR EVENT NAME AND API KEY - open the documentation: https://ifttt.com/maker_webhooks
const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";
// Example:
//const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC";

// 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;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set 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 POST request every 10 seconds
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;
    
      // Your Domain name with URL path or IP address with path
      http.begin(client, serverName);
      
      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      // Data to send with HTTP POST
      String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));           
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);
      
      /*
      // If you need an HTTP request with a content type: application/json, use the following:
      http.addHeader("Content-Type", "application/json");
      // JSON data to send with HTTP POST
      String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);
      */
     
      Serial.print("HTTP Response 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";

Configuration de votre clé API IFTTT.com

Insérez le nom de votre événement et la clé API dans la ligne suivante :

const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";

Exemple d’URL :

const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3t";

Requête HTTP POST

Dans le boucler() est l’endroit où vous effectuez la requête HTTP POST toutes les 10 secondes avec des exemples de données :

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Data to send with HTTP POST
String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));

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

L’ESP32 fait une nouvelle requête encodée en URL pour publier des valeurs aléatoires dans le valeur1, valeur2 et valeur3 des champs. Par example:

POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
value1=15&value2=11&value3=30
Content-Type: application/x-www-form-urlencoded

Alternativement, vous pouvez décommenter ces lignes suivantes pour faire une requête avec des données JSON :

// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");

// JSON data to send with HTTP POST
String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";

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

Voici un exemple de requête HTTP POST avec un objet de données JSON.

POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
{value1: 15, value2: 11, value3: 30}
Content-Type: application/json

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

Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);

Démonstration HTTP POST

Après avoir téléchargé le code, ouvrez le moniteur série et vous verrez un message imprimer le code de réponse HTTP 200 indiquant que la requête a réussi.

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

Accédez à votre compte de messagerie et vous devriez recevoir un nouvel e-mail d’IFTTT avec trois valeurs aléatoires. Dans ce cas : 38, 20 et 13.

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE Réponse IFTTT

À des fins de démonstration, nous publions 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.

Conclusion

Dans ce didacticiel, vous avez appris à intégrer votre ESP32 à des services Web à l’aide de requêtes HTTP POST. Vous pouvez également faire des requêtes HTTP GET 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.