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
}

Carte : ESP32 DevKitC (ESP32-WROOM-32) • Langage : C (ESP-IDF) • IDE : Visual Studio Code • Sortie : API HTTP JSON

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

Ce que fait ce projet

Ce que ce projet n’est pas

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

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.

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.

  1. Ouvrir VS Code dans le dossier du projet.
  2. Définir la cible (si nécessaire, CTRL + SHIFT + P) : ESP-IDF: Set Espressif Device Targetesp32.
  3. Configurer le port série (CTRL + SHIFT + P) : ESP-IDF: Select Port to Use.
  4. 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

  1. Démarrage : initialiser NVS + logs.
  2. Wi-Fi : se connecter (ou démarrer le provisioning si nécessaire).
  3. Mesure : capturer périodiquement des échantillons et calculer le RMS.
  4. 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

  1. Alimentez l’ESP32 via un câble USB.
  2. 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 passe configureme (modifiable dans le fichier app_config.h).
  3. 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 fichier app_config.h).
  4. Saisissez le SSID et le mot de passe de votre Wi-Fi.
  5. 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

  1. Lancer (CTRL + SHIFT + P) : ESP-IDF: Full Clean Project.
  2. 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 :

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

Impossible d’accéder à l’API après provisioning

Le Wi-Fi se connecte mais l’API ne répond pas

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