In vorige deel van het ECG-verhaal heb ik kort uitgelegd wat een ECG is en wat er zoal nodig is om de module gebaseerd op de AD8232 in te zetten. Inmiddels zijn alle spulletjes al een tijdje binnen en ben ik aan het experimenteren geslagen.
Ik wil uiteindelijk het ECG signaal op een een 2,2″ LCD schermpje tonen, maar om de een of andere reden wilde het schermpje dat ik nog ergens had liggen niet direct werken. Misschien kapot?
Om de zaak stapje voor stapje uit te voeren, vond ik ook webpagina’s (o.a. hier) waar het signaal op het beeldscherm van de pc getoond wordt. De AD8232 is aangesloten op een Arduino Nano, de sketch is geladen en op de pc draait een programma (gemaakt in Processing) om het signaal te tonen. De elektrodes op de borst geplakt: de “Li” links op de borst, de “Re” rechts op de borst en de “Com” links op de bovenbuik. In eerste instantie kreeg ik alleen maar een hoop storing te zien.
Door het uitgangssignaal van de module direct aan de oscilloscoop te leggen kreeg ik te zien wat de module registreerde en dat zag er prima uit!
Een beetje (brom)storing en een wiebelige basislijn van bewegingsstoring. Ook is het signaal geïnverteerd: kwestie van de plaatsing van de elektroden aan te passen. Normaal wordt de linker elektrode links en de rechter rechts van het borstbeen geplakt. Dit bekeken vanuit de patiënt. Blijkbaar moet dit omgedraaid worden: dus bekeken vanuit de “kijkers thuis”. Rechts links en links rechts dus. 🙂
Dan krijg je dus dit beeld te zien.
Een keurig sinusritme met positieve P- en T-toppen. Vreemd genoeg moet je na het aansluiten van de voedingsspanning elke keer de gnd op de Arduino aanraken om de metingen te starten. De bromstoring is mogelijk te beperken dan wel te elimineren door e.e.a. in een door metaal afgeschermde behuizing onder te brengen.
Terugkijkend naar het bovenstaande, eerste plaatje (het resultaat in het processing-programma): waar komt al die storing vandaan? Wordt het als bijproduct op de analoge input van de Arduino opgepikt? Of gaat er iets mis in de sketch?
Ik heb nog een 3,2″ Nextion touch schermpje liggen, dat ik nog niet eerder heb gebruikt. Het concept van Nextion (of Itead) is op zich prima: maak een layout met de items die je op het scherm wilt hebben (knoppen, labels, metertjes, e.d.): dat ontwerp kan je maken met de gratis Nextion Editor. Zet het ontwerp op een micro SD kaartje, stop die in het Nextion schermpje en boot daarmee op. De layout wordt in het geheugen van het scherm gezet. Hieronder zie je het scherm met daarop een naam (ECG), een knop (Start) en een “waveform” veld waar het ECG-signaal getoond met gaan worden.
Slechts 4 draadjes zijn er nodig; twee voor de voeding Vcc en gnd en twee voor de communicatie tussen het scherm en de Arduino Tx (zenden) en Rx (ontvangen). Een en ander wordt alsvolgt aan elkaar geknoopt: linksonder de Arduino Nano, daarboven de AD8232 module en rechts het Nextion TFT-scherm.
Vervolgens maak je een sketch in Arduino die vertelt wat je wilt dat er gebeurt wanneer je bijvoorbeeld een knop aanraakt, of welke waarden je wilt tonen als grafiek. Hieronder wordt de analoge waarde op A0 (waar het signaal uit de AD8232 wordt aangeboden) van de Arduino (analogRead) ingelezen. Vanwege de offset wordt van die waarde 50 afgetrokken en om het geheel op het scherm te krijgen wordt de zo gevonden waarde nog eens gedeeld door 4.
#include "Nextion.h" #define aIn A0 NexWaveform ecg_wave = NexWaveform(0,2,"s0"); NexButton b_start = NexButton(0,3,"b_start"); NexTouch *nex_listen_list[] = { &b_start, NULL }; // uint32_t attenuation; uint32_t analogValue; /* void b_startPopCallback(void *ptr) { // b_start.getValue(&attenuation); } */ void setup() { // put your setup code here, to run once: nexInit(); // b_start.attachPop(b_startPopCallback); } void loop() { // put your main code here, to run repeatedly: nexLoop(nex_listen_list); analogValue = analogRead(aIn); analogValue = (analogValue-50)/4; ecg_wave.addValue(0,analogValue); }Het resultaat is hieronder te zien.
Video’s: eerste resultaat met zeer veel ruis,
het tweede resultaat met ruis en het signaal wordt achterstevoren getoond
en (voorlopig) laatste resultaat.