Met een paar elektronische onderdelen en een Arduino kan je een hartslag registreren.
Werking:
Bij iedere hartslag veranderd de doorbloeding in (o.a.) je vinger. Infrarood licht wordt goed geabsorbeerd door het rode bloed. Als het hart net gepompt heeft dan is de vinger vol bloed, het licht wordt geabsorbeerd en de fototransistor (schema hier rechtsonder) laat weinig stroom door waardoor meer stroom loopt naar Arduino analoge pin 0. Is er minder bloed in de vinger dan wordt er minder licht geabsorbeerd (en meer teruggekaatst naar de fototransistor), de fototransistor opent meer en er loopt meer stroom via de transistor naar GND dan naar pin0 en dat verschil kunnen we meten op de pin.
Voor de led en fototransistor gebruiken we hier een 'tcrt5000', die is al geplaatst in een behuizing en dat is wel zo gemakkelijk. Om de sensor zo goed mogelijk te laten werken is het het beste om een soort klip of huls te maken voor om de vinger. Eventueel kan je ook de 10k potententiometer weglaten.
Deze schakeling werkt best goed, maar om een echt goede werking te krijgen is deze hardware niet voldoende. Het signaal is erg zwak maar kan versterkt worden met een opamp schakeling (kijk helemaal beneden bij de links). We kunnen ook met alleen software de sensor verbeteren door de resolutie te verhogen. Wat dat is en hoe dat werkt kan je onder de afbeelding van het aansluitschema zien.
Om de hartslag grafisch weer te geven op het beeldscherm gebruiken we Excel. Bekijk beneden hoe je de data in een grafiek plaatst.
// Eenvoudige hartslagsensor
// Voor iedere meting de seriele monitor openen of op de reset knop drukken.
unsigned long meetTijd; // variabele voor de meet-tijd
int delayTijd; // variabele voor de tijd tussen de metingen
void setup() {
Serial.begin(9600);
Serial.println("millisec., sensorWaarde");
}
void loop() {
delayTijd = 10; // tijd tussen twee metingen (zelf in te stellen)
meetTijd = 20000; // totale meettijd (zelf in te stellen)
int sensorWaarde = analogRead(0); // sensor op de analoge pin 0
Serial.print (millis());
Serial.print (", ");
Serial.println (sensorWaarde);
delay(delayTijd);
if (millis() > meetTijd) while (true); // als de tijd vanaf de start van het programma (millis)
// groter is dan meetTijd: ga niets doen
}
- Monteer de onderdelen (zie afbeelding beneden).
- Plak de bovenstaande sketch in het Arduino scherm en upload.
- Leg je vinger op de tcrt5000.
- Open de seriele monitor en de data worden opgeschreven zolang de meettijd duurt.
- Stel de meettijd en de delay tijd naar behoefte in.
- Kijk of je met draaien aan de potmeter een duidelijkere meting krijgt.
- Druk om opnieuw te meten op de reset knop op de Arduino of start de seriele monitor opnieuw.
- Druk op 'invoer wissen' om de seriele monitor leeg te maken.
Kopieer de getallen (met komma) naar (b.v.) een kladblok bestand.
Open Excel (recente versie).
Ga nu naar Gegevens klik op: Uit tekst/CSV en zoek het kladblokbestand waar je het opgeslagen hebt en dubbelklik (of klik op Importeren).
Je krijgt nu de een nieuw scherm: Zet Scheidingsteken op Komma en klik op Laden.
De gegevens worden nu in Excel geplaatst.
Nu gaan we van de gegevens nog een grafiek maken zodat we (mogelijk) het statische- en dynamische wrijvingsgebied goed kunnen onderscheiden.
Selecteer de getallen.
Ga naar Invoegen dan naar Grafieken en selecteer een Spreidingsgrafiek.
Geef de grafiek een grafiektitel en maak ook as-titels (klik op het plusje naast de grafiek).
Als je een oudere versie van Excel gebruikt moet je misschien eerst het decimaal teken op Europees zetten: Ga naar Bestand > Opties > Geavanceerd en maak Decimaalteken een komma en Scheidingsteken een punt.
B/E is de fototransistor.
A/C is de infrarood led
E en C zijn verbonden met GND
A is via 220 ohm weerstand verbonden met 5v.
B is via 10kohm potmeter en 4,7kohm weerstand verbonden met 5v.
A0 is met de fototransistor verbonden.
De tcrt5000 bestaat uit twee onderdelen: Een infrarood led (blauw) en een foto transistor (zwart).
Resolutie verhogen:
Op de Arduino pin 0 kan tussen de 0 en 5 volt (5000 millivolt) staan. Dit wordt vertaald door de Arduino naar getallen tussen de 0 en 1023 (0 volt is 0 en 5 volt is 1023). Dit zijn de getallen die we zien op de seriële monitor. Een stijging van 5 millivolt levert een stijging met ongeveer 1 op in de seriële monitor.
We ook in plaats van de Arduino te laten meten tussen 0 en 5 volt op de pin laten meten tussen 0 en 1,1 volt. Dan wordt 1,1 (1100 mV) volt verdeeld over 1023. Nu levert een stijging van ongeveer 1 millivolt een stijging op van 1 punt. Op deze manier verhogen we de resolutie (met ongeveer een factor 5) en wordt de grafiek in Excel beter.
We gebruiken hiervoor de instructie: analogReference(INTERNAL); https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
Hieronder kan je de code bekijken en kopiëren.
Let op: Gebruik de potmeter om ervoor te zorgen dat de spanning op de pin niet hoger dan 1,1 volt wordt want alles hierboven wordt in de seriële monitor 1023.
// Eenvoudige hartslagsensor met internal reference.
// Voor iedere meting de seriele monitor openen of op de reset knop drukken.
unsigned long meetTijd; // variabele voor de meet-tijd
int delayTijd; // variabele voor de tijd tussen de metingen
void setup() {
Serial.begin(9600);
Serial.println("millisec., sensorWaarde");
}
void loop() {
delayTijd = 50; // tijd tussen twee metingen (zelf in te stellen)
meetTijd = 20000; // totale meettijd (zelf in te stellen)
analogReference(INTERNAL); // meten tussen 0 en 1,1 volt
analogRead(0);
Serial.print (millis());
Serial.print (", ");
Serial.println (analogRead(0));
delay(delayTijd);
if (millis() > meetTijd) while (true); // als de tijd vanaf de start van het programma (millis)
// groter is dan meetTijd: ga niets doen
}
Om de sensor nog meer te verbeteren kan je het signaal versterken en filteren met de nodige hardware (kijk b.v. naar de links hieronder).
Je kan ook met alleen software filteren. Je wil bij voorbeeld uitschieters in je metingen afvlakken. Daarvoor kan je de ‘smoothing’ voorbeeld code gebruiken: https://www.arduino.cc/en/Tutorial/Smoothing
Hierbij wordt gebruik gemaakt van een array ( https://www.arduino.cc/reference/en/language/variables/data-types/array/ ). Als je op de seriële monitor wil bekijken hoe het programma werkt kan je de onderstaande code uitproberen.
// Smoothing met seriele monitor
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int inputPin = A0;
void setup() {
Serial.begin(9600);
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void loop() {
total = total - readings[readIndex];
readings[readIndex] = analogRead(inputPin);
total = total + readings[readIndex];
readIndex = readIndex + 1;
average = total / numReadings;
if (readIndex >= numReadings) {
readIndex = 0;
}
Serial.print("readIndex= ");
Serial.print(readIndex);
Serial.print(" ");
Serial.print("total= ");
Serial.print(total);
Serial.print(" ");
Serial.print("average= ");
Serial.print(average);
Serial.print(" ");
Serial.print("analogreading= ");
Serial.print(analogRead(inputPin));
Serial.println(" ");
delay(1000);
}