Guides Arduino

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.

5 avril 202615 min de lectureÉquipe Didactico

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.

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 :

  1. Nœud sinusal (SA node) → impulsion initiale
  2. Propagation dans les oreillettes → elles se contractent (onde P)
  3. Nœud auriculo-ventriculaire (AV node) → délai de 100 ms pour laisser le sang descendre
  4. Faisceau de His → conduit l’impulsion vers les ventricules
  5. Les fibres de Purkinje propagent simultanément dans les deux ventricules → contraction massive (complexe QRS)
  6. 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.

❤️
Composant principal

Module AD8232 ECG complet

Inclut module + câble jack + 3 électrodes Ag/AgCl · Réf DAR-04-E001 · En stock chez Didactico Sfax

Voir le produit →

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 :

  1. Différenciation : diff = x[n] - x[n-1] → enhance les pentes
  2. Élévation au carré : sq = diff * diff → amplifie les fortes pentes (le QRS)
  3. Moyennage glissant sur 30 ms (~ 7 échantillons à 250 Hz)
  4. Seuil adaptatif : seuil = 0.6 × max_recent
  5. 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).

🎓
Pour étudiants en PFE

Devis préférentiel projet biomédical

Didactico accompagne les PFE INSAT/ENIT/ISBS · Tarifs HT enseignement · support technique gratuit

Programme étudiants →

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.

Voir toute la catégorie « Capteurs – Prototypage » →

📘 Guides liés : MAX30100 Arduino : Capteur SpO2 et Rythme Cardiaque DIY · Pulse Sensor Arduino : Construire une Station Santé DIY Complète

🛒 Passez à la pratique
Retrouvez nos capteurs santé & biomédical en stock chez Didactico, livraison partout en Tunisie.
Voir la boutique →