Étude de cas · Académique

Simulation de suivi de patients sur ESP32

Des cartes ESP32 publient SpO2, fréquence cardiaque, température et réponse électrodermale en MQTT vers un tableau de bord Node-RED, avec une expérimentation de classification TinyML embarquée.

En bref

  • Projet de cours qui simule un suivi au lit du patient  trois cartes ESP32 à capteurs biomédicaux, une organisation des topics MQTT et un état système marche/arrêt partagé.
  • J’ai écrit les trois firmwares finaux, les tâches FreeRTOS d’état, la tâche d’inférence TinyML et le flux Node-RED qui enregistre les mesures dans InfluxDB.
  • Une simulation pédagogique, pas un dispositif médical  la mise à l’échelle des entrées du classifieur n’a pas été calibrée, c’est la première chose que je corrigerais.

En résumé

Rôle
Développeur
Équipe
Équipe de 3 (TP en binôme)
Période
–
Statut
Projet de cours rendu en décembre 2025
Assistance IA
aucune Aucune trace d’assistant de code IA dans les dépôts.
Technologies
  • ESP32
  • C++
  • PlatformIO
  • FreeRTOS
  • MQTT
  • I2C
  • Node-RED
  • InfluxDB
  • Edge Impulse

Contexte

Cours d’IoT à l’ISIS (2025–2026)  des TP sur cartes ESP32, MQTT, Node-RED et FreeRTOS, puis un projet final de groupe. Le projet final simule le suivi de patients à l’hôpital avec des capteurs biomédicaux.

Problème

Simuler un petit réseau de surveillance  plusieurs cartes lisent des signaux physiologiques, les publient vers un tableau de bord central, réagissent à des commandes à distance et signalent leur propre état, et l’une d’elles tente de classer un signal directement sur la carte.

Mon rôle, l’équipe et la part de l’IA

TP en binôme, puis un groupe de 3 pour le projet final. J’ai écrit les trois firmwares finaux (carte capteurs principale, nœud TinyML, nœud haut-parleur), les tâches FreeRTOS d’état et le nettoyage final qui a intégré le modèle TinyML, et j’ai ajouté le flux Node-RED du rendu final. Mes coéquipiers ont travaillé sur l’échange I2C, les tests de capteurs et les données d’entraînement. Les dépôts ne montrent aucune trace d’assistant de code IA.

Contraintes

  • Matériel  cartes ESP32 DFRobot FireBeetle et capteurs à bas coût (capteur DFRobot SpO2/fréquence cardiaque/température, capteur de pouls KY-039, capteur de réponse galvanique de la peau).
  • Temps réel  lecture des capteurs, réseau et affichage de l’état doivent cohabiter sur un microcontrôleur.
  • Mémoire  le classifieur doit tenir et tourner sur l’ESP32 à côté de la pile réseau.
  • Calendrier du cours  environ un semestre, des premiers TP au rendu final.

Solution et architecture

  • Carte capteurs principale  lit en I2C le capteur de SpO2, de fréquence cardiaque et de température, et publie toutes les 2 secondes une trame JSON biométrique en MQTT, ainsi que l’état de ses boutons.
  • Nœud TinyML  une tâche FreeRTOS dédiée échantillonne le signal électrodermal à 62,5 Hz (fenêtre de 125 échantillons) et exécute un classifieur Edge Impulse à 3 classes (peur, neutre, surprise)  la classe prédite est publiée en MQTT.
  • Nœud haut-parleur  s’abonne aux topics de lecture, de musique et de boucle et joue l’une de 3 mélodies dans une tâche créée à la demande.
  • État partagé  un topic commun system/state allume ou éteint tout le système  des tâches FreeRTOS épinglées sur un cœur pilotent des LED d’état qui clignotent différemment en cas de perte réseau, de système éteint et de mesure invalide.
  • Tableau de bord  un flux Node-RED avec graphiques et jauges s’abonne aux topics des capteurs et de la classification, envoie les commandes aux cartes et écrit les mesures dans InfluxDB.

Stack

C++ sur le framework Arduino avec PlatformIO, ESP32, FreeRTOS, MQTT (PubSubClient), I2C, Edge Impulse (TensorFlow Lite Micro), Node-RED et Node-RED Dashboard, InfluxDB.

Qualité et vérification

Les tests ont été manuels, sur banc  journaux série, messages MQTT observés sur le broker et tableau de bord. Le dépôt ne contient pas de tests automatisés. Les TP précédents ont été construits pas à pas  lecture de l’adresse MAC et de l’IP, MQTT avec un capteur de température, un bouton et une LED, un tableau de bord Node-RED, une démo FreeRTOS à deux tâches, puis l’échange I2C maître/esclave.

Résultats et statut

Le projet final a été rendu en décembre 2025. C’est une simulation pédagogique, pas un dispositif médical  les mesures n’ont pas été comparées à un appareil de référence et le classifieur n’a pas été validé.

Ce que je ferais autrement

  • Calibrer l’entrée du classifieur pour que les valeurs des capteurs correspondent à l’échelle des données d’entraînement (la conversion était restée provisoire), puis mesurer la précision sur des données de test séparées.
  • Sortir les paramètres réseau du code, dans un fichier de configuration non versionné.
  • Écrire un README avec un schéma de câblage, la liste des topics et des photos du montage.
  • Ajouter une vérification automatique simple du format des trames MQTT.

Liens

  • Code source  dépôts des TP et du projet final, à nettoyer avant d’être liés ici.