API IoT ESP32 – Tracé graphique et mesure RMS double canal
Construisez un nœud de mesure IoT auto-hébergé : l’ESP32 calcule en continu le true RMS et le tracé graphique sur deux canaux analogiques, et expose les dernières valeurs via une API HTTP JSON propre pour scripts, dashboards et automatisation.
Une fois connecté au Wi-Fi : l’ESP32 expose les dernières mesures RMS et le tracé graphique via un endpoint HTTP JSON local, accessible depuis n’importe quel appareil du même réseau.
curl http://<ESP32_IP>/api/rms
{
"channel_a_rms": 0.212,
"channel_b_rms": 0.106,
"unit": "volts",
"timestamp_ms": 41596000
}
Sommaire
Vue d’ensemble
L’objectif de ce projet est API-first : transformer un ESP32 en un petit nœud capteur IoT fiable qui publie des mesures RMS et un tracé graphique lisibles par machine sur votre réseau local. L’ADC et les calculs RMS sont le “backend capteur” — le endpoint HTTP JSON est le produit que vous intégrez dans vos outils et dashboards.
Cette API HTTP est conçue pour une consommation machine (scripts, automatisation, dashboards), pas seulement pour des tests manuels.
Ce que cette API permet
- Interroger les valeurs depuis des scripts et outils (
curl, Python, Go, Bash, CI checks, etc.). - Alimenter une chaîne time-series (Node-RED → InfluxDB/Prometheus → Grafana).
- Intégrer en automatisation domestique/industrielle (Home Assistant, passerelles PLC, services sur mesure).
- Utiliser l’ESP32 comme un endpoint de mesure headless déployable partout sur votre LAN.
Ce que fait ce projet
- Fournit un provisioning Wi-Fi pour la configuration au premier démarrage.
- Échantillonne deux entrées analogiques via ADC1.
- Calcule la tension true RMS et le tracé graphique sur une fenêtre de mesure.
- Met à jour les résultats périodiquement (par ex. toutes les 1–10 secondes).
- Expose en continu les dernières valeurs via une API HTTP JSON stable.
Ce que ce projet n’est pas
- Pas de streaming continu des échantillons bruts.
- Pas de visualisation “oscilloscope” dans Telemetry Viewer.
Si vous avez besoin d’un tracé temps réel de la forme d’onde via USB, utilisez le tutoriel dédié : Double ADC + Oscilloscope série (Telemetry Viewer).
Architecture en un coup d’œil
Le firmware est structuré pour que le serveur HTTP réponde toujours rapidement : les mesures sont effectuées en arrière-plan et l’API sert le dernier résultat terminé depuis un cache partagé.
ADC (CH_A, CH_B)
↓ fenêtre d’échantillonnage périodique
Tâche de calcul RMS
↓ mise à jour de l’état partagé (dernier résultat)
Serveur HTTP
↓
GET /api/rms → JSON pour les clients (curl / Node-RED / Grafana / apps)
Choix clé : l’appareil ne mesure pas “à la demande”. Les requêtes renvoient simplement le RMS de la dernière fenêtre terminée, ce qui garde le Wi-Fi réactif et des temps de réponse constants.
Pré-requis
- ESP32 DevKitC (ESP32-WROOM-32) ou carte ESP32 similaire.
- Deux signaux analogiques (0–3,3 V). Voir ce tutoriel vidéo pour un exemple de circuit..
- Câble USB pour flasher et lire les logs série.
- Un téléphone ou un ordinateur pour se connecter au portail de provisioning.
Les entrées ADC de l’ESP32 doivent rester dans 0–3,3 V. Ne dépassez jamais 3,3 V sur GPIO34/GPIO35.
Câblage (GPIO34 / GPIO35)
Ce tutoriel utilise volontairement ADC1 uniquement afin d’éviter les conflits ADC2/Wi-Fi.
| Canal | GPIO | Unité ADC | Notes |
|---|---|---|---|
| CH_A | GPIO34 | ADC1 | Broche entrée uniquement (idéale pour l’ADC) |
| CH_B | GPIO35 | ADC1 | Broche entrée uniquement (idéale pour l’ADC) |
Reliez la masse du signal au GND de l’ESP32, sinon les mesures seront instables et sans signification.
Configuration VS Code + ESP-IDF
Installez ESP-IDF et l’extension VS Code exactement comme dans le tutoriel oscilloscope série. Si ESP-IDF est déjà installé, vous pouvez passer directement au clonage du projet.
- Installer Visual Studio Code
- Installer l’extension Espressif IDF
- Lancer l’assistant de configuration ESP-IDF (toolchain + Python + IDF)
Utilisez une version stable d’ESP-IDF et gardez-la cohérente entre vos projets. Ce tutoriel a été développé avec Visual Studio Code v1.108.1 et ESP-IDF v1.11.1.
Récupérer le code (GitHub)
Le firmware complet de ce tutoriel est disponible sur GitHub : esp32-dual-adc-rms-wifi
Cloner en local :
git clone https://github.com/jak-services/esp32-adc-rms-wifi-api.git
cd esp32-adc-rms-wifi-api
Compiler le projet
C’est un projet ESP-IDF standard (CMake). Ouvrez le dossier dans VS Code et utilisez les commandes ESP-IDF.
- Ouvrir VS Code dans le dossier du projet.
- Définir la cible (si nécessaire, CTRL + SHIFT + P) : ESP-IDF: Set Espressif Device Target → esp32.
- Configurer le port série (CTRL + SHIFT + P) : ESP-IDF: Select Port to Use.
- Compiler/Flasher (CTRL + SHIFT + P) : ESP-IDF: Build, Flash and Start a Monitor on Your Device.
La plupart des cartes DevKitC entrent automatiquement en bootloader. Si le flash reste bloqué sur “Connecting…”, maintenez BOOT, cliquez sur flash, puis relâchez BOOT quand vous voyez “Writing at …”.
Tour du firmware : Démarrage → Mesure → Service
Ce projet est volontairement découpé en plusieurs fichiers pour garder chaque sous-système lisible : échantillonnage ADC, traitement RMS, provisioning, et serveur HTTP.
Flux global
- Démarrage : initialiser NVS + logs.
- Wi-Fi : se connecter (ou démarrer le provisioning si nécessaire).
- Mesure : capturer périodiquement des échantillons et calculer le RMS.
- Service : renvoyer instantanément le résultat en cache via HTTP.
Pseudo-point d’entrée (pour se repérer)
L’idée est toujours la même : démarrer le Wi-Fi, démarrer la mesure, démarrer le serveur.
// PSEUDO-CODE (illustration)
void app_main(void)
{
nvs_init();
wifi_init_and_connect_or_provision();
measurements_init(); // allocate buffers, init ADC config
measurements_start_task(); // periodic capture + RMS compute
http_server_start(); // exposes /api/rms
}
Provisioning Wi-Fi
Au premier démarrage (ou lorsque aucun identifiant Wi-Fi n’est stocké), l’appareil démarre un point d’accès Wi-Fi et expose un portail de provisioning.
Étapes typiques de provisioning
- Alimentez l’ESP32 via un câble USB.
-
Sur votre téléphone ou ordinateur, ouvrez les paramètres Wi-Fi et connectez-vous au point d’accès
nommé
JAK_DEVICE_*, avec le mot de passeconfigureme(modifiable dans le fichierapp_config.h). -
Si la page de provisioning ne s’ouvre pas automatiquement, lancez un navigateur
et allez à la page de configuration via l’adresse IP locale
http://192.168.4.1(modifiable dans le fichierapp_config.h). - Saisissez le SSID et le mot de passe de votre Wi-Fi.
- L’appareil enregistre les identifiants et se connecte à votre réseau Wi-Fi.
Une fois connecté à votre Wi-Fi, l’ESP32 reçoit une adresse IP attribuée par votre
routeur. Cette adresse IP est affichée dans l’API.
À partir de là, vous pouvez accéder à l’ESP32 depuis n’importe quel téléphone ou ordinateur
connecté au même réseau Wi-Fi domestique en utilisant cette adresse IP, sans
devoir vous connecter au point d’accès JAK_DEVICE_*.
Le point d’accès de provisioning reste disponible en permanence si vous devez
reconfigurer l’appareil ou changer de réseau Wi-Fi.
Considérations de sécurité
Le point d’accès de provisioning est protégé en WPA2 avec un mot de passe configurable,
ce qui empêche les connexions non autorisées pendant la configuration.
Tous les services fournis par l’appareil (interface de provisioning et API HTTP)
sont accessibles uniquement depuis le réseau local et ne sont pas exposés à
Internet. L’appareil n’initie aucune connexion externe et ne dépend pas de services cloud.
L’API HTTP n’implémente ni authentification ni chiffrement, et est destinée
à un usage sur un environnement local de confiance. Si une sécurité renforcée est requise
(par exemple HTTPS, authentification, ou accès restreint), des mesures supplémentaires,
non couvertes par ce tutoriel, doivent être implémentées.
API HTTP (JSON)
L’API renvoie les dernières mesures RMS terminées et le tracé graphique. L’échantillonnage n’est pas déclenché à la demande, ce qui garantit des requêtes rapides et un Wi-Fi réactif.
Endpoint
GET /api/rms
Exemple de réponse
{
"channel_a_rms": 1.237,
"channel_b_rms": 0.982,
"unit": "volts",
"timestamp_ms": 12345678
}
Tester avec curl
Une fois l’appareil connecté au Wi-Fi, trouvez son adresse IP dans l’API (ou dans les logs série), puis :
curl http://<ESP32_IP>/api/rms
Si vous prévoyez d’intégrer à des dashboards (Home Assistant, Node-RED, Grafana, etc.), gardez le JSON stable et versionnez l’API lorsque vous introduisez des changements incompatibles.
Compiler, flasher, monitorer, déboguer
Compiler + flasher
- Lancer (CTRL + SHIFT + P) : ESP-IDF: Full Clean Project.
- Lancer (CTRL + SHIFT + P) : ESP-IDF: Build, Flash and Start a Monitor on Your Device.
Moniteur série
Utilisez (CTRL + SHIFT + P) ESP-IDF: Monitor pour vérifier :
- Le mode provisioning démarre (premier boot) OU le Wi-Fi se connecte (déjà provisionné)
- L’adresse IP est affichée
- La boucle de mesure tourne (logs périodiques “RMS updated”, si activés)
- Le serveur HTTP est en écoute
Un seul programme peut ouvrir le port série à la fois. Fermez le moniteur (CTRL + T puis CTRL + X) si un autre outil doit utiliser le port.
Dépannage
Mesures instables / bruit
- Vérifiez que la masse du signal est bien reliée au GND de l’ESP32.
- Utilisez des fils courts et évitez un câblage “désordonné” sur breadboard pour les signaux faibles.
- Envisagez moyennage, filtrage et calibration (surtout si vous voulez des valeurs de tension précises).
Impossible d’accéder à l’API après provisioning
- Pendant la configuration initiale, connectez-vous au point d’accès JAK_DEVICE_* pour saisir le SSID et le mot de passe de votre Wi-Fi.
- Une fois les identifiants enregistrés, déconnectez-vous de JAK_DEVICE_* et reconnectez votre appareil client au Wi-Fi de votre routeur.
- L’API HTTP RMS est accessible uniquement lorsque l’ESP32 et votre client sont sur le même réseau domestique.
- Utilisez l’adresse IP attribuée par le routeur (visible dans les logs série) pour accéder à l’API.
Le Wi-Fi se connecte mais l’API ne répond pas
- Confirmez l’adresse IP dans les logs série.
- Essayez
http://<ip>/api/rmsdans un navigateur. - Vérifiez que votre pare-feu / isolation réseau ne bloque pas le trafic local.
- Si vous utilisez un téléphone, désactivez Wi-Fi roaming / Wi-Fi Assist / bascule données mobiles. Certains téléphones basculent automatiquement sur le cellulaire ou un autre point d’accès, ce qui empêche l’accès aux appareils du réseau local.
Pourquoi ADC1 uniquement ?
Sur ESP32, ADC2 est partagé avec le Wi-Fi. Utiliser ADC2 quand le Wi-Fi est actif peut produire des mesures invalides ou des erreurs. Ce projet utilise ADC1 uniquement pour une utilisation robuste.
Ressources
- Documentation Espressif : documentation.espressif.com
- Guide de programmation ESP-IDF : ESP-IDF (esp32)
- Visual Studio Code : Téléchargement Visual Studio Code