ESP32 WiFi : Envoyer vos Donnees IoT sur Internet (Guide Complet)
Guide expert ESP32 WiFi : envoyer des donnees IoT sur Internet via HTTP/HTTPS, MQTT, ThingSpeak, Firebase. WiFiManager, OTA, deep sleep, certificats Let's Encrypt et bonnes pratiques securite pour vos projets IoT en Tunisie.
Mars 2024. Un etudiant ENIT en PFE me montre fierement son projet : un ESP32 qui envoie la temperature de son aquarium sur Internet. Le code marche… 12 heures, puis crash. Le WiFi se deconnecte, il faut redemarrer manuellement. Le mot de passe WiFi est ecrit en clair dans le firmware (probleme si on flash 100 appareils chez des clients). Aucune reconnexion automatique. Aucune mise a jour OTA. Aucun chiffrement HTTPS. Sa note ? 12/20.
Le mois suivant, on a refait le projet ensemble. Resultat : autonomie 6 mois sur 2 piles AA grace au deep sleep, connexion WiFi via portail captif (l’utilisateur configure depuis son telephone), HTTPS avec certificat Let’s Encrypt, MQTT pour la latence faible, OTA pour mises a jour a distance. Note finale : 19/20.
Dans ce guide, on construit ensemble cette architecture professionnelle. Pas du tutoriel “Hello World ThingSpeak”, mais du vrai code production utilise dans 50+ projets deployes en Tunisie.
📋 Table des matieres
- 1. Architecture ESP32 : ce qu’il faut savoir
- 2. Installation core ESP32 dans Arduino IDE 2.x
- 3. Connexion WiFi avec WiFiManager (portail captif)
- 4. HTTP GET/POST avec HTTPClient
- 5. HTTPS securise + certificat Let’s Encrypt
- 6. Envoi vers ThingSpeak avec dashboard
- 7. MQTT temps reel avec PubSubClient
- 8. Firebase Realtime Database
- 9. OTA Updates : mises a jour a distance
- 10. Deep sleep et autonomie sur batterie
- 11. Securite : ne JAMAIS hardcoder de mots de passe
- 12. FAQ
1. Architecture ESP32 : ce qu’il faut savoir
L’ESP32 d’Espressif (Shanghai, 2016) est probablement le meilleur rapport prix/performances jamais conçu pour l’IoT. Pour 15 TND chez Didactico, vous obtenez :
- CPU dual-core Xtensa LX6 @ 240 MHz : deux fois plus rapide qu’un Arduino UNO multiplie par 100
- 520 KB SRAM + 4 MB Flash (versions standard)
- WiFi 802.11 b/g/n 2,4 GHz avec antenne PCB integree
- Bluetooth 4.2 classic + BLE
- 34 GPIO dont 18 ADC 12-bit, 16 PWM channels, 2 DAC 8-bit, I2C, SPI, UART, CAN, I2S
- Hall sensor, touch sensors, deep sleep < 10 µA
- Cryptographie hardware : AES, SHA, RSA, ECC, RNG
ESP32 vs ESP32-S2/S3/C3 : quel choisir ?
| Variante | Cores | WiFi | BT | USB | Cas d’usage |
|---|---|---|---|---|---|
| ESP32 (classique) | 2x LX6 240MHz | OUI | BT4.2 + BLE | Non native | IoT general |
| ESP32-S2 | 1x LX7 240MHz | OUI | NON | USB OTG | HID, USB host |
| ESP32-S3 | 2x LX7 240MHz | OUI | BLE 5 | USB OTG | AI/Vision |
| ESP32-C3 | 1x RISC-V 160MHz | OUI | BLE 5 | USB Serial | Economique |
2. Installation core ESP32 dans Arduino IDE 2.x
- Ouvrir Arduino IDE 2.x > Fichier > Preferences
- Dans “URL de gestionnaires de cartes supplementaires”, coller :
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Aller dans Outils > Type de carte > Gestionnaire de cartes
- Chercher “esp32” et installer “esp32 by Espressif Systems” (version 3.0.x ou +)
- Selectionner Outils > Carte > ESP32 Arduino > ESP32 Dev Module
L’ESP32 utilise un convertisseur USB-Serial. Sur Windows, il faut installer le driver CP2102 (Silicon Labs) ou CH340 selon la carte. Sans driver, le port COM n’apparait pas. Telechargez-les avant la premiere utilisation.
3. Connexion WiFi avec WiFiManager (portail captif)
Hardcoder le SSID/mot de passe dans le code est une faute de debutant. Si vous deployez 50 capteurs chez 50 clients differents, vous devez tous les reflasher. Solution professionnelle : WiFiManager.
WiFiManager (lib de tzapu) lance un point d’acces WiFi au demarrage si aucun reseau connu. L’utilisateur se connecte avec son telephone a “DIDACTICO-AP”, est redirige vers une page web ou il choisit son WiFi et entre le mot de passe. Les credentials sont stockes en NVS Flash, jamais perdus.
#include <WiFi.h>
#include <WiFiManager.h> // installer via Library Manager
void setup() {
Serial.begin(115200);
WiFiManager wm;
// Si pas de WiFi configure, lance portail captif
// SSID : "DIDACTICO-IoT-Setup"
// Pwd : "didactico2026"
bool res = wm.autoConnect("DIDACTICO-IoT-Setup", "didactico2026");
if (!res) {
Serial.println("Echec connexion. Redemarrage...");
delay(3000);
ESP.restart();
}
Serial.print("WiFi connecte ! IP : ");
Serial.println(WiFi.localIP());
}
void loop() {
// Verifier connexion regulierement
if (WiFi.status() != WL_CONNECTED) {
WiFi.reconnect();
delay(5000);
}
}
Pour effacer les credentials stockes (utile pendant le developpement) : wm.resetSettings(); avant autoConnect(). Ou ajoutez un bouton physique “Reset WiFi” qui appelle cette fonction.
4. HTTP GET/POST avec HTTPClient
Pour envoyer des donnees a un serveur, utilisez la bibliotheque HTTPClient incluse dans le core ESP32.
#include <WiFi.h>
#include <HTTPClient.h>
void envoyerDonnee(float temp, float hum) {
if (WiFi.status() != WL_CONNECTED) return;
HTTPClient http;
String url = "http://api.didactico.tn/iot/temp";
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.addHeader("X-API-Key", "VOTRE_CLE_API");
String payload = "{"temp":" + String(temp)
+ ","hum":" + String(hum)
+ ","device":"esp32-01"}";
int httpCode = http.POST(payload);
if (httpCode > 0) {
String response = http.getString();
Serial.printf("HTTP %d : %sn", httpCode, response.c_str());
} else {
Serial.printf("Echec HTTP : %sn",
http.errorToString(httpCode).c_str());
}
http.end();
}
5. HTTPS securise + certificat Let’s Encrypt
En 2026, envoyer des donnees IoT en HTTP clair, c’est inadmissible. Mais HTTPS sur ESP32 demande un detail crucial : integrer le certificat racine pour valider la chaine de confiance.
Let’s Encrypt utilise le root certificate ISRG Root X1. Voici comment l’inclure :
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
// ISRG Root X1 (Let's Encrypt)
const char* root_ca =
"-----BEGIN CERTIFICATE-----n"
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwn"
"...n"
"-----END CERTIFICATE-----n";
void envoyerHTTPS(float temp) {
WiFiClientSecure client;
client.setCACert(root_ca);
HTTPClient https;
if (https.begin(client, "https://api.didactico.tn/iot")) {
https.addHeader("Content-Type", "application/json");
String payload = "{"temp":" + String(temp) + "}";
int code = https.POST(payload);
Serial.printf("HTTPS code: %dn", code);
https.end();
}
}
Le ISRG Root X1 expire en 2035. Mais le certificat de votre serveur expire tous les 90 jours (Let’s Encrypt). Heureusement, valider la chaine racine suffit, vous n’avez pas a mettre a jour l’ESP32 a chaque renouvellement. Pensez juste a verifier l’heure du RTC interne car la validation depend de la date courante (utilisez NTP).
6. Envoi vers ThingSpeak avec dashboard
ThingSpeak (MathWorks) est le service IoT le plus simple pour debuter. Compte gratuit limite a 8200 messages/jour, dashboard inclus, MATLAB analytics.
Etapes :
- Creer compte sur thingspeak.com
- Creer un nouveau Channel avec 8 fields (temp, hum, etc.)
- Recuperer la Write API Key
- Envoyer en HTTP GET
#include <WiFi.h>
#include <HTTPClient.h>
String apiKey = "VOTRE_WRITE_API_KEY";
String server = "http://api.thingspeak.com/update";
void envoyerThingSpeak(float temp, float hum, float lux) {
HTTPClient http;
String url = server + "?api_key=" + apiKey
+ "&field1=" + String(temp)
+ "&field2=" + String(hum)
+ "&field3=" + String(lux);
http.begin(url);
int code = http.GET();
Serial.printf("ThingSpeak %dn", code);
http.end();
}
void loop() {
envoyerThingSpeak(23.5, 65.2, 480);
delay(20000); // Min 15 sec entre envois (free tier)
}
7. MQTT temps reel avec PubSubClient
HTTP, c’est bien pour des envois ponctuels. MQTT, c’est pour le temps reel. Latence < 100 ms, payload minimal (~10 octets de header), QoS 0/1/2, support de millions de connexions simultanees.
Architecture : un broker MQTT (Mosquitto, HiveMQ, EMQX) au centre, des publishers (vos ESP32) et des subscribers (vos dashboards, apps mobiles). Les messages sont organises en topics hierarchiques.
#include <WiFi.h>
#include <PubSubClient.h>
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883; // 8883 pour TLS
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* payload, unsigned int length) {
String msg = "";
for (int i = 0; i < length; i++) msg += (char)payload[i];
Serial.printf("Recu [%s] : %sn", topic, msg.c_str());
// Exemple : commande LED
if (String(topic) == "didactico/esp32-01/cmd/led") {
digitalWrite(LED_BUILTIN, msg == "ON" ? HIGH : LOW);
}
}
void reconnectMQTT() {
while (!client.connected()) {
String clientId = "DIDA-" + String(WiFi.macAddress());
if (client.connect(clientId.c_str())) {
Serial.println("MQTT connecte");
client.subscribe("didactico/esp32-01/cmd/#");
} else {
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// WiFi.begin(...) ou WiFiManager
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnectMQTT();
client.loop();
// Publier toutes les 10 sec
static unsigned long lastPub = 0;
if (millis() - lastPub > 10000) {
lastPub = millis();
String payload = "{"temp":23.5,"hum":65}";
client.publish("didactico/esp32-01/data", payload.c_str());
}
}
Adoptez une convention claire : {org}/{device_id}/{type}/{measure}. Exemple : didactico/esp32-01/data/temperature. Les wildcards MQTT (+ pour un niveau, # pour tout en aval) permettent d’ecouter intelligemment.
8. Firebase Realtime Database
Pour synchroniser un ESP32 avec une app mobile (Flutter, React Native), Firebase Realtime Database est imbattable. La lib Firebase ESP32 Client de Mobizt (mobizt/Firebase-ESP-Client) gere tout.
#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#define API_KEY "VOTRE_API_KEY"
#define DATABASE_URL "https://didactico-iot-default-rtdb.firebaseio.com"
#define USER_EMAIL "esp32@didactico.tn"
#define USER_PASSWORD "motdepasse"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
void setup() {
// ... WiFi setup
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
Firebase.begin(&config, &auth);
}
void loop() {
if (Firebase.ready()) {
Firebase.RTDB.setFloat(&fbdo, "/esp32-01/temp", 23.5);
Firebase.RTDB.setFloat(&fbdo, "/esp32-01/hum", 65.2);
Firebase.RTDB.setInt(&fbdo, "/esp32-01/ts", millis());
}
delay(5000);
}
9. OTA Updates : mises a jour a distance
Imaginez : 100 ESP32 deployes dans 100 maisons clients. Vous trouvez un bug. Il faut tous les recuperer pour reflasher ? Non. OTA (Over The Air) permet de pousser un nouveau firmware via WiFi en 30 secondes.
#include <WiFi.h>
#include <ArduinoOTA.h>
void setup() {
// ... WiFi setup
ArduinoOTA.setHostname("esp32-didactico-01");
ArduinoOTA.setPassword("didacticoOTA2026");
ArduinoOTA.onStart([]() {
Serial.println("OTA Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("OTA End");
});
ArduinoOTA.onProgress([](unsigned int p, unsigned int t) {
Serial.printf("OTA %u%%n", (p / (t / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Erreur OTA: %un", error);
});
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
// ... votre code
}
Dans Arduino IDE : Outils > Port > choisissez l’ESP32 par son hostname (apparait apres 30 sec). Code uploade via WiFi.
10. Deep sleep : autonomie de plusieurs mois sur batterie
Un ESP32 en marche normale consomme 80-160 mA. En deep sleep, 10 µA. La difference est de 1 a 16 000. Pour un capteur qui envoie 1 mesure toutes les 15 min, le deep sleep multiplie l’autonomie par 50-100.
#include <esp_sleep.h>
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 900 // 15 minutes en secondes
void setup() {
Serial.begin(115200);
// Reveil rapide, lecture capteur, envoi MQTT, dormir
connectWiFi(); // ~3 secondes
float temp = readSensor();
sendMQTT(temp);
Serial.println("Sleep 15 min...");
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {
// Jamais execute, le setup() est rejoue apres chaque reveil
}
Pour atteindre vraiment 10 µA : (1) desactiver le LDO de la carte dev (souvent 5-10 mA), preferer une alimentation directe 3,3V. (2) couper l’alimentation des capteurs externes via un MOSFET. (3) utiliser des ESP32 nu (ESP32-S2 ULP, ou ESP32-C3). (4) eviter le module USB-Serial sur la carte de production.
11. Securite : les 7 commandements de l’ESP32 en production
- JAMAIS hardcoder les credentials WiFi dans le firmware. Utiliser WiFiManager + NVS Preferences.
- JAMAIS HTTP en clair. HTTPS avec certificat valide ou MQTT avec TLS sur le port 8883.
- API keys uniques par device. Generez un token JWT signé par votre serveur.
- Flash encryption + Secure Boot en production. Active dans menuconfig (ESP-IDF).
- OTA signe. Verifier la signature du firmware avant flash.
- Limiter les ports ouverts. Si vous n’utilisez pas Telnet, ne lancez pas le service.
- WiFi Enterprise (WPA2-EAP) pour entreprises. Authentification par certificat client.
Carte ESP32 WROOM-32 CP2102 (30 pin)
La carte de developpement ESP32 la plus populaire. CP2102 pour upload USB stable, antenne PCB integree, 30 pins accessibles. Ideal pour vos projets PFE et prototypes IoT en Tunisie.
12. FAQ – ESP32 WiFi IoT
L’ESP32 supporte-t-il le WiFi 5 GHz ?
Non. L’ESP32 (et la majorite des ESP32-S/C) supportent uniquement le WiFi 2,4 GHz 802.11 b/g/n. Si votre routeur diffuse en 5 GHz exclusivement, il faut activer une bande 2,4 GHz.
Quelle est la portee WiFi typique d’un ESP32 ?
Avec antenne PCB integree : 30-50 m en interieur, 100-150 m en exterieur LoS. Avec antenne externe (variantes WROOM-32U + antenne externe IPX) : 200-300 m exterieur.
Combien d’objets peut gerer un broker MQTT ?
Mosquitto sur un Raspberry Pi 4 gere confortablement 10 000 connexions simultanees. HiveMQ Cloud free tier : 100 connexions. EMQX commercial : millions. Pour 90% des projets PFE et makers, le broker public HiveMQ public suffit en developpement.
Puis-je alimenter un ESP32 avec une pile 18650 Li-Ion ?
Oui, mais ATTENTION : l’ESP32 fonctionne en 3,3V. La 18650 fait 3,0-4,2V. Il faut un regulateur LDO 3,3V (AMS1117) ou utiliser une carte avec gestion batterie integree (TTGO T-Beam, Wemos LOLIN32).
HTTPS sur ESP32 ralentit-il beaucoup ?
Premiere requete : ~2 secondes (handshake TLS). Requetes suivantes (memes session) : ~200 ms. Le hardware crypto integre (AES, SHA) accelere significativement. Pour 1 envoi/min, l’impact est negligeable.
Comment debugger une connexion WiFi qui echoue ?
(1) Verifier que vous etes en 2,4 GHz. (2) SSID sans caracteres speciaux. (3) Pas de MAC filtering sur le routeur. (4) WPA2-Personal (pas WPA3, mauvais support core 1.x). (5) Verifier WiFi.status() et afficher les codes d’erreur.
OTA peut-il bricker mon ESP32 ?
Si le firmware uploade est corrompu et OTA n’a pas de bootloader de secours, oui. Solution : utiliser 2 partitions OTA (par defaut dans le partition scheme “Default with 2 OTA”). Si la nouvelle ne demarre pas, retour automatique a l’ancienne.
Conclusion : l’ESP32 est le futur de l’IoT en Tunisie
L’ESP32 n’est pas juste “l’Arduino avec WiFi”. C’est une plateforme IoT complete avec WiFi, BT, BLE, cryptographie hardware, 18 ADC, et un ecosysteme Arduino mature. Pour 15 TND chez Didactico, vous avez la puissance de calcul d’un PC de 2005 dans un module qui tient sur un dirham.
Pour aller plus loin, decouvrez nos guides ESP32 vs ESP8266 : Lequel Choisir ? et ESP32 LoRa pour l’Agriculture Tunisienne. Livraison 24-48h partout en Tunisie depuis notre stock Sfax. Etudiants ENIT, INSAT, ESPRIT, ISET : tarif preferentiel sur presentation de carte etudiante.
🛒 Matériel nécessaire pour ce guide
Tout le matériel de ce tutoriel est disponible chez Didactico — livraison 24-48h partout en Tunisie, paiement à la livraison.
Module Expressif ESP32-WROOM-32D 8M 64Mbit36,000 TND
Carte de développement ESP32-S3 WiFi Bluetooth BLE 5.0 Mesh N8R240,000 TND
Super Mini Carte ESP32-C3 WiFi+BT (Type-C)32,000 TND📘 Guides liés : ESP32 vs ESP8266 : Lequel Choisir pour votre Projet IoT en Tunisie (2026) · ESP32 LoRa : Reseau Multi-Capteurs Longue Portee pour l'Agriculture Tunisienne
