Das Modul HW-827 besteht im Wesentlichen aus einer LED, aus dem Lichtsensor-Modul APDS-9008 und einem Operationsverstärker (s. Abb. 2, Quelle: https://circuitdigest.com/microcontroll ... th-arduino). Die Kondensatoren und Widerstände zwischen dem Ausgang des Lichtsensor-Moduls und dem Eingang des Verstärkers sollen das Rauschen beim Ausgangssignal des APDS9008 mindern.
Die Pulsmessung verläuft so: Man legt eine Fingerspitze (locker) auf das HW-827-Modul. Die LED sendet grünes Licht aus; ein Teil davon wird durch das Blut in den Kapillaren reflektiert. Während der Systole (Das ist die Kontraktionsphase des Herzmuskels, in der sich das Herz zusammenzieht und Blut in die Arterien pumpt.) befindet sich mehr sauerstoffhaltiges Blut in den Kapillaren und es wird dementsprechend mehr Licht auf den Lichtsensor reflektiert. Dies führt zu einem größeren Signal am Ausgang des HW-827. Der zeitliche Verlauf dieses Signals wird nun mit Hilfe des TTGO graphisch dargestellt (s. Abb. 3).
Auf der horizontalen Achse entsprechen 20 Pixel (ziemlich) genau 0,5 Sekunden; das zugehörige/entsprechende Zeitraster wird durch senkrechte Linien markiert. Damit kann man dann den Abstand der Maximalstellen (und damit die Periodendauer T) ermitteln. In der Abb. 3 habe ich den Zeitabstand zwischen Puls A und Puls B zu 4,025 s bestimmt (Bei genauerem Hinschauen erkennt man, dass der Hochpunkt B ganau 1 Pixel Abstand von dem 6. Skalenstrich hat, während der Hochpunkt B genau neben dem 1. Skalenstrich liegt.) Die Periodendauer ist damit T = 4,025 s / 5 = 0,805 s. In 1 Minute gibt es daher 60 / 0,805 Pulse. Die Pulsrate in BPM (Beats Per Minute) beträgt in unserem Fall also ungefähr 75 BPM. (Eine Vergleichsmessung mit einem kommerziellen Messgerät ergab in diesem Fall Werte zwischen 76 und 77 BPM; die Genauigkeit dieses Geräts liegt laut Hersteller bei 2 %.)
Kommen wir nun zum praktischen Teil:
1. Verdrahtung
HW-827 | TTGO |
GND | G |
VCC | 3V |
Signal | Pin 36 |
2. Programm
- A/D-Wandler
Dazu benutzen wir die Klassen Pin und ADC. Diese importieren wir zunächst aus dem machine-Modul. Damit erzeugen wir die ADC-Instanz puls:
Code: Alles auswählen
from machine import Pin, ADC
puls = ADC(Pin(36))
Code: Alles auswählen
puls.atten(ADC.ATTN_11DB) # Messbereich: 0 - 3.6 V;
puls.width(ADC.WIDTH_12BIT) # 12 Bit: Messwerte von 0 bis 4095
- Kalibrierung
Code: Alles auswählen
glob_min = 4095
glob_max = 0
for i in range(220):
puls_wert = puls.read()
display.pixel(10+i, 60, st7789.BLUE) # Fortschrittsbalken
# print(puls_wert)
if puls_wert < glob_min:
glob_min = puls_wert
if puls_wert > glob_max:
glob_max = puls_wert
sleep_ms(delta_t0)
diff_5 = int((glob_max - glob_min) / 5)
# Anzeige-Bereich für die Werte etwas vergrößern...
glob_min = int(glob_min - diff_5)
glob_max = int(glob_max + diff_5)
glob_diff = glob_max - glob_min
# zur Kontrolle...
print('glob_min =', glob_min, ', glob_max =', glob_max)
print('glob_diff =', glob_diff)
- Messschleife
Code: Alles auswählen
puls_wert = puls.read()
Code: Alles auswählen
puls_wert_bar = int((puls_wert - glob_min) / glob_diff * 100) # wenn puls_wert = glob_max, dann puls_wert_bar = 100
Dieser normierte Wert wird durch entsprechend lange vertikale Linie (Säule) dargestellt.
Code: Alles auswählen
if puls_wert_bar > 0:
display.line(10+i, 120, 10+i, 120-puls_wert_bar, st7789.RED) # i-te Messung
Code: Alles auswählen
if i % 20 == 0:
display.line(10+i, 30, 10+i, 125, st7789.BLUE)
- Abbruch des Programms und Auswertung
- Berechnung der Pulsrate durch den TTGO
.