Kit ECG AD8232 : Moniteur Cardiaque DIY avec Arduino en Tunisie
Guide pilier ECG AD8232 + Arduino : physiologie cardiaque, architecture interne de la puce, code optimisé 250 Hz, filtre notch 50 Hz, détection R-peak Pan-Tompkins, projet PFE holter 24h. Référence biomédicale Didactico Tunisie.
En 1903, Willem Einthoven gagne le prix Nobel pour avoir inventé le galvanomètre à corde — la première machine capable de capter l’activité électrique du cœur. Sa machine pesait 270 kg, occupait deux pièces, et nécessitait 5 opérateurs. Cent vingt-trois ans plus tard, vous tenez dans votre paume un module de 2 grammes capable de faire la même chose, avec une précision clinique de base : le Analog Devices AD8232. Et avec un Arduino UNO à 35 TND chez Didactico Sfax, vous allez construire votre premier moniteur ECG (électrocardiogramme) DIY.
Cet article n’est pas un énième tutoriel “branche-3-fils-et-tu-as-un-ECG”. C’est un guide pilier de 4000 mots, écrit par et pour la communauté tunisienne de l’électronique biomédicale : étudiants ISBS, futurs ingénieurs INSAT/ENIT, médecins curieux des sciences embarquées, makers du FabLab Sfax. Nous allons couvrir la physiologie cardiaque, l’architecture de la puce AD8232, le câblage de précision, le code Arduino optimisé, le traitement du signal (filtre notch 50 Hz, détection de pic R par algorithme Pan-Tompkins simplifié), et enfin un projet de PFE complet avec interface web temps réel.
⚠️ Avertissement médical sérieuxLe AD8232 et tout montage DIY décrit dans cet article ne sont PAS des dispositifs médicaux certifiés CE/FDA. Aucun diagnostic clinique ne doit être posé sur la base de ces mesures. Si vous ressentez des symptômes cardiaques (douleur thoracique, palpitations, essoufflement anormal), consultez un médecin et utilisez un ECG hospitalier homologué. Ce guide est exclusivement à but pédagogique, scientifique et de prototypage.
📋 Table des matières
- Anatomie d’un battement : ce que le cœur raconte en électricité
- Comprendre les ondes P, QRS, T en 5 minutes
- Le AD8232 disséqué : architecture interne
- Matériel complet pour le moniteur DIY
- Choix et placement des électrodes
- Câblage Arduino + AD8232 (avec pièges à éviter)
- Code Arduino — version baseline propre
- Visualisation 1 : Arduino Serial Plotter
- Visualisation 2 : Processing avec courbe défilante
- Traitement du signal : filtre notch 50 Hz + passe-bande
- Détection du pic R et calcul du BPM
- Détection basique d’arythmie
- Upgrade ESP32 + interface web Bluetooth/WiFi
- Projet de PFE complet : holter portable 24h
- Questions fréquentes
Anatomie d’un battement : ce que le cœur raconte en électricité
Votre cœur n’est pas qu’une pompe mécanique. C’est avant tout un orchestre électrique dirigé par un chef d’orchestre invisible appelé nœud sinusal, niché en haut de l’oreillette droite. Toutes les 800 millisecondes environ (à 75 BPM au repos), ce nœud émet une impulsion électrique de 100 millivolts qui se propage en cascade :
- Nœud sinusal (SA node) → impulsion initiale
- Propagation dans les oreillettes → elles se contractent (onde P)
- Nœud auriculo-ventriculaire (AV node) → délai de 100 ms pour laisser le sang descendre
- Faisceau de His → conduit l’impulsion vers les ventricules
- Les fibres de Purkinje propagent simultanément dans les deux ventricules → contraction massive (complexe QRS)
- Repolarisation des ventricules → onde T
Quand vous posez deux électrodes sur la peau de part et d’autre du cœur, vous mesurez la différence de potentiel induite par cette cascade électrique — voilà l’ECG. L’amplitude réelle est 1 à 2 millivolts à la surface de la peau. Soit 1000 fois plus faible qu’une pile AAA. C’est précisément ce que le AD8232 sait amplifier sans bruit.
Comprendre les ondes P, QRS, T en 5 minutes
Un cycle ECG normal ressemble à ceci (vue temporelle, 1 seconde = ~1 battement) :
R
●
│
P │ T
╱╲ │ ╱╲
╱ ╲│╱ ╲___
─ ● ───
Q,S
│
[───── 1 battement ─────]
- Onde P (≈ 0.08-0.12s, 0.25 mV) : contraction des oreillettes. Une P absente ou anormale = trouble auriculaire.
- Complexe QRS (≈ 0.06-0.10s, 1-2 mV) : la dépolarisation massive des ventricules. C’est le pic le plus visible — celui que nous allons détecter pour calculer le BPM.
- Segment ST : isoélectrique normalement. Une élévation ST = signal d’infarctus (STEMI) en clinique.
- Onde T (≈ 0.10-0.25s, 0.5 mV) : repolarisation. Une T inversée peut indiquer une ischémie.
- Intervalle RR : temps entre deux pics R consécutifs.
BPM = 60 / RR(en secondes).
Le AD8232 disséqué : architecture interne
Le AD8232 n’est pas un simple ampli op. C’est une chaîne complète de conditionnement de signal biomédical intégrée dans un boîtier LFCSP 4×4 mm. Ouvrons sa structure :
Étage 1 — Amplificateur d’instrumentation à 3 ampli-op
Gain fixe de ×100. Reçoit le signal différentiel (RA-LA ou RA-RL) entre 2 électrodes. CMRR (taux de réjection du mode commun) de 80 dB minimum à 60 Hz — indispensable pour rejeter les interférences secteur.
Étage 2 — Filtre passe-haut intégré
Fréquence de coupure réglable (typiquement 0.5 Hz). Élimine la dérive de ligne de base causée par la respiration et les mouvements des électrodes (baseline wander).
Étage 3 — Amplificateur opérationnel auxiliaire
Configurable en filtre passe-bas (typiquement 40 Hz) pour limiter le bruit haute fréquence et le tremblement musculaire (EMG).
Étage 4 — Right-Leg Drive (RLD)
Sortie active qui injecte dans le corps un signal en opposition de phase au bruit de mode commun (50 Hz secteur en Tunisie). C’est ce qui élimine le ronflement caractéristique sans isolation galvanique complexe. La sortie RLD se branche à l’électrode RL (right leg), conventionnellement placée sur le mollet droit ou le flanc.
Étage 5 — Détection lead-off
Le AD8232 surveille en continu si les électrodes sont bien collées. Deux sorties (LO+ et LO-) passent à HIGH si une électrode se décolle — le programme Arduino peut alors afficher “Électrode détachée” au lieu d’enregistrer du bruit.
Le résultat : un signal ECG amplifié, filtré, denoised, prêt à être lu par un simple ADC 10 bits d’Arduino UNO.
Module AD8232 ECG complet
Inclut module + câble jack + 3 électrodes Ag/AgCl · Réf DAR-04-E001 · En stock chez Didactico Sfax
Matériel complet pour le moniteur DIY
- 1 × Arduino UNO R3 (ou Nano, ou ESP32 pour version avancée)
- 1 × Module AD8232 (Sparkfun ou équivalent générique)
- 1 × Câble jack 3.5 mm vers 3 fils boutons-pression
- 3 × Électrodes adhésives Ag/AgCl (jetables, type Kendall H92SG ou équivalent)
- ~10 × fils jumper Male/Femelle
- 1 × Breadboard 400 points
- Option PC : Processing 4 + Arduino IDE
- Option portable : OLED 0.96″ + batterie LiPo 3.7V + boîtier 3D imprimé
Choix et placement des électrodes
Les électrodes Ag/AgCl jetables avec gel conducteur sont obligatoires pour un signal propre. Les électrodes en métal sec (type EEG amateur) donnent du bruit insupportable. Ne réutilisez jamais une électrode jetable — le gel sèche et l’impédance peau-électrode explose.
Configuration Einthoven dérivation II (recommandée pour AD8232)
C’est la dérivation qui donne le QRS le plus net :
- RA (Right Arm) → électrode sous la clavicule droite, ou poignet droit
- LA (Left Arm) → électrode sous la clavicule gauche, ou poignet gauche
- RL (Right Leg, Drive) → électrode sur le flanc droit ou le mollet droit
Conseil pratique : avant de coller les électrodes, dégraissez la peau avec une compresse alcoolisée et laissez sécher 30 secondes. Sur une peau bien préparée, le signal est 3 à 4 fois plus propre.
Câblage Arduino + AD8232
| Pin AD8232 | Pin Arduino | Rôle |
|---|---|---|
| 3.3V | 3.3V | Alimentation (ne PAS utiliser 5V) |
| GND | GND | Masse commune |
| OUTPUT | A0 | Signal ECG analogique 0-3.3V |
| LO+ | D11 | Détection lead-off positif |
| LO- | D10 | Détection lead-off négatif |
| SDN | (non connecté) | Shutdown, laisser flottant |
⚠️ Piège classique : alimentationLe AD8232 fonctionne en 3.3V strict. Ne jamais le brancher sur le 5V de l’Arduino — vous le détruirez instantanément. Sur Arduino UNO, utilisez la broche 3.3V (max 50 mA, largement suffisant pour les ~10 mA du AD8232).
Code Arduino — version baseline propre
// ECG AD8232 — version baseline
// Didactico Tunisie · didactico.tn
// Echantillonnage : 250 Hz (largement suffisant pour le QRS)
const int ECG_PIN = A0;
const int LO_PLUS = 11;
const int LO_MINUS = 10;
const unsigned long PERIODE_US = 4000; // 4 ms = 250 Hz
unsigned long t_prev = 0;
void setup() {
pinMode(LO_PLUS, INPUT);
pinMode(LO_MINUS, INPUT);
Serial.begin(115200);
// Reference ADC interne 1.1V pour plus de precision sur petit signal
// analogReference(INTERNAL); // optionnel, attention plage 0-1.1V
}
void loop() {
unsigned long now = micros();
if (now - t_prev < PERIODE_US) return;
t_prev = now;
// Detection electrodes detachees
if (digitalRead(LO_PLUS) == HIGH || digitalRead(LO_MINUS) == HIGH) {
Serial.println(0); // ligne plate dans le plotter
return;
}
int raw = analogRead(ECG_PIN);
Serial.println(raw);
}
Téléversez ce code, ouvrez le Moniteur Série à 115200 bauds puis le Serial Plotter (Ctrl+Maj+L). Vous devriez voir une ligne plate au repos qui passe à des QRS bien visibles dès que vous tenez votre respiration.
Visualisation 1 : Arduino Serial Plotter
Le Serial Plotter est l’outil le plus rapide pour valider votre montage. Réglez l’axe Y entre 0 et 1023 et regardez le tracé. Sur un signal sain en dérivation II, vous reconnaissez visuellement P, QRS, T en moins de 10 battements.
Si vous voyez une ligne très bruyante :
- Vérifiez que vous êtes en 3.3V et non 5V
- Éloignez-vous d’un PC chargeur ou d’un transformateur (50 Hz)
- Renouvelez les électrodes si > 24h
- Reposez-vous, immobile, respirez calmement
Visualisation 2 : Processing avec courbe défilante
Pour un affichage type oscilloscope médical, utilisez Processing 4 (gratuit, processing.org). Le sketch ci-dessous reçoit les valeurs Arduino et trace une courbe ECG défilante sur 5 secondes :
// Sketch Processing 4 — ECG Live Plotter
// Didactico Tunisie
import processing.serial.*;
Serial port;
float[] tampon;
int largeur, hauteur;
void setup() {
size(1200, 400);
largeur = width;
tampon = new float[largeur];
port = new Serial(this, Serial.list()[0], 115200);
port.bufferUntil('n');
background(10, 30, 40);
}
void serialEvent(Serial p) {
String l = p.readStringUntil('n');
if (l == null) return;
try {
float v = float(l.trim());
// decalage du tampon
for (int i = 0; i < largeur - 1; i++) tampon[i] = tampon[i+1];
tampon[largeur - 1] = v;
} catch (Exception e) {}
}
void draw() {
background(10, 30, 40);
stroke(251, 229, 61); // jaune Didactico
strokeWeight(1.5);
noFill();
beginShape();
for (int x = 0; x < largeur; x++) {
float y = map(tampon[x], 200, 800, height - 20, 20);
vertex(x, y);
}
endShape();
// grille
stroke(60, 80, 100);
strokeWeight(0.5);
for (int x = 0; x < largeur; x += 50) line(x, 0, x, height);
for (int y = 0; y < height; y += 40) line(0, y, largeur, y);
}
Traitement du signal : filtre notch 50 Hz + passe-bande
Le AD8232 fait un excellent travail, mais en Tunisie où le réseau électrique tourne à 50 Hz, on observe souvent un résidu de bruit secteur. Solution : filtre notch numérique à 50 Hz implémenté côté Arduino.
Filtre notch IIR à 50 Hz (Fs = 250 Hz)
// Filtre notch IIR ordre 2 — 50 Hz, Fs = 250 Hz
// Coefficients calcules avec scipy.signal.iirnotch(50, Q=30, fs=250)
const float b[3] = { 0.9491, -1.5378, 0.9491 };
const float a[3] = { 1.0, -1.5378, 0.8983 };
float x[3] = {0,0,0};
float y[3] = {0,0,0};
float notch_filter(float in) {
x[2] = x[1]; x[1] = x[0]; x[0] = in;
y[2] = y[1]; y[1] = y[0];
y[0] = b[0]*x[0] + b[1]*x[1] + b[2]*x[2] - a[1]*y[1] - a[2]*y[2];
return y[0];
}
Couplez ensuite avec un passe-bande 0.5-40 Hz pour ne garder que la bande utile du signal ECG (en pratique, le AD8232 le fait déjà partiellement, mais un raffinement numérique aide).
Détection du pic R et calcul du BPM
Pour calculer le rythme cardiaque, on doit détecter chaque pic R. La méthode la plus robuste reste l’algorithme Pan-Tompkins (1985), simplifié ici pour Arduino :
- Différenciation :
diff = x[n] - x[n-1]→ enhance les pentes - Élévation au carré :
sq = diff * diff→ amplifie les fortes pentes (le QRS) - Moyennage glissant sur 30 ms (~ 7 échantillons à 250 Hz)
- Seuil adaptatif : seuil = 0.6 × max_recent
- Refractory period : ignorer pendant 200 ms après chaque détection (interdit physiologiquement un nouveau battement)
// Detection R-peak simplifiee + BPM
float prev = 0, max_recent = 0;
unsigned long last_R = 0;
int bpm = 0;
const unsigned long REFRACTAIRE = 250; // ms
void detecter_R(float sample) {
float diff = sample - prev;
prev = sample;
float sq = diff * diff;
if (sq > max_recent) max_recent = sq;
max_recent *= 0.995; // decroissance lente
if (sq > max_recent * 0.6) {
unsigned long now = millis();
if (now - last_R > REFRACTAIRE) {
unsigned long rr = now - last_R;
bpm = 60000 / rr;
Serial.print("R-peak | BPM : "); Serial.println(bpm);
last_R = now;
}
}
}
À 75 BPM au repos, l’intervalle RR est de 800 ms. À 60 BPM, 1000 ms. À 100 BPM, 600 ms. Le calcul est instantané, sans buffer.
Détection basique d’arythmie
Une fois que vous capturez les RR consécutifs, vous pouvez calculer la variabilité du rythme cardiaque (VRC ou HRV) et détecter des anomalies basiques :
- Bradycardie : BPM < 50 sur 10 battements consécutifs au repos → consultation
- Tachycardie : BPM > 100 au repos (hors effort/stress)
- Extrasystole : un intervalle RR brutalement plus court suivi d’un plus long (“pause compensatoire”) → fréquent et bénin chez la majorité
- Arythmie absolue (fibrillation auriculaire) : RR irrégulier sans pattern → signal d’alerte
Pour une vraie détection clinique, il faudrait analyser la morphologie du QRS (largeur, amplitude, polarité), ce qui dépasse le cadre d’un Arduino UNO. On bascule alors sur ESP32 + TinyML ou Raspberry Pi + Python.
Upgrade ESP32 + interface web Bluetooth/WiFi
Le ESP32 ouvre une nouvelle dimension : visualisation en temps réel sur smartphone via BLE ou WiFi, sans dépendre d’un PC. Quelques pistes :
- BLE GATT custom : exposer une characteristic “ECG” en notify, app Android lit en temps réel (apps “nRF Connect” pour tester)
- WebSocket sur serveur ESP32 : page HTML hébergée par l’ESP32, JavaScript Chart.js qui trace le tracé live
- MQTT vers HiveMQ Cloud : transmettre à un dashboard Grafana cloud pour suivi longue durée
- SD card + RTC DS3231 : holter portable autonome avec horodatage précis (voir section PFE ci-dessous)
Projet de PFE complet : holter portable 24h
Pour les étudiants en biomédical (ISBS, INSAT, ENIT), voici une architecture de Projet de Fin d’Études ambitieuse construite autour du AD8232 :
Architecture matérielle
- ESP32-S3 ou ESP32 WROOM-32 (alimentation, traitement, WiFi/BT)
- AD8232 avec 3 électrodes Ag/AgCl Holter
- Module micro SD SPI pour enregistrer 24h de signal à 250 Hz
- Horloge RTC DS3231 haute précision
- Batterie LiPo 1100 mAh + module de charge TP4056
- Boîtier 3D imprimé portable (clip ceinture)
- Optionnel : capteur MPU6050 pour corrélation mouvement/rythme
Architecture logicielle
- Acquisition à 250 Hz, filtrage notch + passe-bande
- Détection R-peak Pan-Tompkins en temps réel
- Enregistrement compressé (delta-encoding) sur SD : 24h × 250 Hz × 2 octets ≈ 43 Mo brut, ~15 Mo compressé
- Synchronisation WiFi périodique : upload chunks sur backend (Firebase, MQTT)
- Dashboard web React : graphe temps réel, statistiques HRV, alertes
- Export PDF de rapport pour consultation médicale
Soutenance idéale
Pour défendre un tel projet : démo live, comparaison avec un ECG hospitalier de référence (les CHU de Sfax, Tunis et Sousse acceptent parfois ces partenariats avec les écoles d’ingénieurs), métriques précision/F1-score de la détection R, et analyse économique (coût composant ≈ 80 TND vs ~ 2000 TND pour un holter commercial bas de gamme).
Devis préférentiel projet biomédical
Didactico accompagne les PFE INSAT/ENIT/ISBS · Tarifs HT enseignement · support technique gratuit
Questions fréquentes
Le AD8232 mesure-t-il vraiment un ECG cliniquement valide ?
Le AD8232 capture fidèlement la dérivation II d’Einthoven, qui est l’une des 12 dérivations standard d’un ECG hospitalier. C’est donc cliniquement représentatif pour la détection du rythme et de la morphologie du QRS. Cependant, il manque les autres dérivations (V1-V6, aVR, aVL, aVF) nécessaires pour diagnostiquer un infarctus, un bloc de branche, ou une hypertrophie. Un ECG 1-dérivation reste donc un outil d’observation, pas de diagnostic.
Quelle est la différence entre AD8232 et AD8233 ?
Le AD8233 est la version successeur, identique fonctionnellement mais avec un boîtier différent (WLCSP au lieu de LFCSP) et une consommation 10% plus faible. Pour vos projets, les deux sont interchangeables. Le AD8232 reste le plus disponible en module breakout.
Pourquoi le signal devient-il plat soudainement ?
Trois causes principales : (1) une électrode s’est décollée — le LED LO+ ou LO− du module s’allume; (2) le gel de l’électrode a séché — remplacez par une neuve; (3) cordon jack mal branché. Vérifiez systématiquement ces 3 points avant de soupçonner le module.
Peut-on enregistrer un ECG pendant le sport ?
Très difficile sans matériel spécialisé. Le mouvement musculaire (EMG) recouvre complètement l’ECG. Pour du sport, il faut des électrodes ceinture type Polar H10 ou des patches spéciaux (Bittium, BodiTrak). Le AD8232 reste optimal pour l’analyse au repos et au calme.
Quelle est la fréquence d’échantillonnage minimale pour un ECG valide ?
L’AHA (American Heart Association) recommande 250-500 Hz pour la détection du rythme, et 1000 Hz pour l’analyse fine de la morphologie du QRS. À 250 Hz (notre code), vous capturez correctement la position du R-peak avec une précision de ±2 ms — largement suffisant pour le BPM.
Le AD8232 est-il sûr ? Risque-t-on un choc électrique ?
Le AD8232 est alimenté en 3.3V via USB. Le courant maximal qui pourrait théoriquement traverser le corps via les électrodes est limité par les résistances internes du module à moins de 10 microampères — bien en dessous du seuil de perception (1 mA). Cependant, ne jamais brancher l’Arduino à une alimentation secteur sans isolation (transformateur médical certifié). Préférez une batterie ou un PC sur batterie pendant la mesure.
Combien coûte un AD8232 en Tunisie ?
Le module AD8232 complet (avec câble jack + 3 électrodes adhésives) est disponible chez Didactico Sfax. Consultez la fiche produit pour le prix actuel et la disponibilité. Livraison 24-48h dans toute la Tunisie, paiement à la livraison accepté. Pour les commandes étudiantes (lot de 10+), un tarif HT préférentiel est appliqué.
Conclusion : du capteur au système médical embarqué
Le AD8232 est bien plus qu’un module à 30 TND : c’est une porte d’entrée dans la bio-instrumentation moderne. En quelques heures, vous passez de la lecture passive d’une courbe à la détection algorithmique d’un battement cardiaque, puis à la construction d’un appareil portable qui pourrait, demain, contribuer à un programme de télémédecine en zones rurales tunisiennes.
Si vous travaillez sur un projet biomédical, étudiez à l’ISBS, INSAT ou ENIT, ou montez un FabLab médical en Tunisie : Didactico vous fournit l’écosystème complet — AD8232, ESP32, écrans OLED, modules SD, batteries LiPo, électrodes Ag/AgCl, et un support technique assuré par des ingénieurs francophones. Parcourez le catalogue capteurs ou contactez-nous pour un devis sur mesure pour votre établissement.
Le cœur bat. Mesurons-le. Mais surtout, comprenons-le.
🛒 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.
Kit ECG Module AD823230,800 TND
Module capteur ECG AD823258,000 TND
Cable capteur 3 fils électrodes ECG/EKG/EMG28,400 TND📘 Guides liés : MAX30100 Arduino : Capteur SpO2 et Rythme Cardiaque DIY · Pulse Sensor Arduino : Construire une Station Santé DIY Complète
