É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
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/stateallume 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.