OpenHRStrap

Het Pan-Tompkins-algoritme is in Python geïmplementeerd om de filterketen te volgen zoals oorspronkelijk beschreven in de wetenschappelijke publicatie. Het apparaat is zo geprogrammeerd dat het wordt herkend als een standaard BLE-apparaat (Bluetooth Low Energy), waardoor het compatibel is met apps zoals Strava. Daarnaast is er informatie beschikbaar over hoe data uit Strava kan worden geëxtraheerd en geanalyseerd met Python.

Referenties

  • Laatste blog over het project: [element14 Running Tracker Blog]
  • Laatste video over het project: [Running Tracker Video Part 1]
  • Originele Pan-Tompkins publicatie: [A Real-Time QRS Detection Algorithm]

---

Projectupdates

November 2025 — Er is een DIY-vriendelijke versie gemaakt met gebruik van een XIAO ESP32-board en de AD8232 ECG-module. De integratie van Pan–Tompkins is getest op statische data en werkt uitstekend; realtime detectie tijdens het hardlopen is nog in ontwikkeling (WIP).

Versie 2 (V2) is momenteel in ontwikkeling. Deze versie zal een custom PCB bevatten met verbeterde datalogging en een geüpgradede AFE (Analogue Front End).

---

Versie 1 van het Project

De onderstaande secties hebben betrekking op versie 1 (V1) van dit project. Het doel was om een open-source DIY-variant van een commerciële borstband-sensor te creëren met de volgende specifieke doelen:

  • Een module ontwikkelen die op een commerciële borstband past.
  • Het ECG-signaal meten en hieruit de hartslag berekenen.
  • Verbinding maken met een telefoon via BLE, net als een commercieel apparaat.

Hardware

De hardware voor deze versie is zeer toegankelijk en bestaat uit veelvoorkomende modules:

  • MCU: Een ESP32 XIAO S3 board, gekozen vanwege de rekenkracht voor signaalverwerking en de eenvoudige implementatie van BLE.
  • Analogue Front End (AFE): De populaire AD8232 ECG-module.
  • Elektroden: Om de borstband geschikt te maken, is er een extra referentie-elektrode toegevoegd door een knoop aan de achterzijde van de band te naaien.
  • Behuizing: Geprint uit PLA en TPU. Voor de interface met de borstband zijn draden direct aan stalen drukknoppen gesoldeerd.
  • Voeding: Een kleine 1S LION-cel met een boost-converter die het voltage naar 5V brengt; de onboard ESP-elektronica regelt de verdere spanningsvoorziening.

---

Het Pan-Tompkins Algoritme

Voor de berekening van de hartslag is gekozen voor het Pan-Tompkins-algoritme, een van de meest significante en breed gebruikte methoden voor ECG-signaalverwerking. Het algoritme is gebaseerd op het artikel "A Real-Time QRS Detection Algorithm" uit 1985, gepubliceerd door Jiapu Pan en Willis J. Tompkins.

Het doel van het algoritme is het herkennen van een QRS-complex in het signaal, oftewel een hartslag. Het algoritme houdt een aantal cruciale parameters bij:

  • SPK: Lopende schatting van de signaalpiek (Signal Peak).
  • NPK: Lopende schatting van de ruispiek (Noise Peak).
  • TH1: Drempelwaarde 1 voor het detecteren van pieken.
  • TH2: Drempelwaarde 2 voor het detecteren van pieken (meestal TH1 / 2).

Elk van deze parameters heeft varianten voor zowel het gefilterde signaal ("F") als het volledig verwerkte geïntegreerde signaal ("I").

Werkwijze

Aan het begin worden alle parameters geïnitialiseerd met een paar seconden aan data die niet worden gebruikt, waarbij gekeken wordt naar de maximale piekwaarde of het gemiddelde en de maximumwaarden van het signaal. Daarna wordt het signaal in kleine batches geanalyseerd via de volgende filterketen:

  1. Band-pass filtering
  2. Afgeleide (Derivative)
  3. Kwadrateren (Squaring)
  4. Moving window integratie

Dit proces resulteert in twee soorten pieken:

  • FILT-pieken: Pieken uit het band-pass gefilterde signaal.
  • INT-pieken: Pieken uit het volledig verwerkte geïntegreerde signaal.

Bij de INT-pieken wordt gecontroleerd of ze boven de waarde van TH1 liggen. Is dit het geval, dan wordt er gezocht naar een FILT-piek die eveneens aan TH1 voldoet en zich binnen een kleine $\Delta t$ van de INT-piek bevindt. Alleen dan wordt de piek geclassificeerd als een R-piek, waarna de parameters (SPK, NPK, TH1, TH2) worden bijgewerkt. Pieken onder TH1 worden geclassificeerd als ruispieken.

Een essentieel onderdeel is de search-back functie. Deze wordt geactiveerd als er langer dan 166% van de gemiddelde RR-afstand geen R-piek is gevonden. Het algoritme zoekt dan terug vanaf de laatste geclassificeerde R-piek, waarbij TH2 wordt gebruikt om een piek als R-piek te categoriseren.

---

Voorbeeld van Datafiltratie

In dit voorbeeld wordt het Pan-Tompkins-algoritme toegepast op verzamelde data. De stappen zijn als volgt:

  1. Ruw ECG-signaal: Het startpunt van de analyse.
  2. Band-Pass Filter: Het signaal gaat door een laagdoorlaatfilter (low-pass) gevolgd door een hoogdoorlaatfilter (high-pass).
  3. Derivative Filter: Het gefilterde signaal gaat door een afgeleide-filter om voorbereid te worden voor het "INT"-signaal.
  4. Kwadrateren (Squaring): Het signaal wordt gekwadrateerd.
  5. Moving Window Integration: De laatste stap voordat het piekdetectie-algoritme wordt uitgevoerd.
  6. INT-pieken: Bij een signaal met weinig ruis worden hierdoor meestal alle R-pieken, enkele T-golven en een paar ruispieken gevangen.
  7. FILT-pieken: Hetzelfde detectie-algoritme wordt toegepast op het band-pass gefilterde signaal.

---

Detectievoorbeeld

Bij vooraf opgenomen data worden alle filters en algoritmen in één keer toegepast, maar de detectie zelf werkt iteratief over de pieken heen, ongeacht of dit in kleine batches of in één geheel gebeurt.

In de resultaten is te zien dat de detectie over het algemeen goed werkt, hoewel er in sommige gevallen een R-piek gemist kan worden (bijvoorbeeld na 80+ seconden). De eerste 10 seconden van het signaal bevatten geen detecties, aangezien dit deel wordt gebruikt voor het initialiseren van de parameters.

---

Strava Data en Real-world Testing

In deze fase is V1 tegen enkele problemen aangelopen. Er is een test uitgevoerd tijdens een 5K-run, waarbij de DIY-borstband werd vergeleken met een smartwatch met een PPG-sensor als controle-apparaat. Hoewel PPG-sensoren in smartwatches vaak minder accuraat zijn dan ECG-borstbanden tijdens het hardlopen, diende het als referentie.

Bevindingen

Door de data uit Strava te downloaden en te analyseren met Python, werden de volgende trends waargenomen:

  • Start van de run: Beide apparaten stemmen goed met elkaar overeen.
  • Stijgende hartslag: Naarmate de hartslag stijgt, wordt het gat tussen de signalen groter.
  • Tempoverschillen: Bij een verlaging van het tempo komen de signalen soms weer overeen, maar in andere gevallen blijven ze sterk afwijken.
  • Algemene trend: De door het DIY-apparaat geregistreerde hartslag was over het algemeen lager dan die van de smartwatch.

Omdat er in V1 geen proper datalogging aanwezig was om te zien hoe het signaal er precies uitzag en hoe het algoritme reageerde, is de exacte oorzaak moeilijk vast te stellen.

Toekomstig plan: Het ontwerpen van een PCB rond een nieuwe AFE IC en het toevoegen van datalogging-mogelijkheden. Dit zal het debuggen tijdens real-world tests aanzienlijk verbeteren en helpen bij het tunen van het algoritme en de hardware.

---

Disclaimer

Dit project is uitsluitend bedoeld voor educatief, experimenteel en hobbygebruik.

OpenHRStrap is geen medisch hulpmiddel, is niet gecertificeerd en mag niet worden gebruikt voor diagnose, monitoring van medische aandoeningen of andere gezondheidskritische toepassingen.

Alle hardware, firmware en software worden "as-is" geleverd zonder garantie. De auteur aanvaardt geen verantwoordelijkheid voor enige schade, letsel of verliezen die voortvloeien uit het gebruik van dit project.