Seite 1 von 1

Pulsraten messen mit dem HW-827

Verfasst: So 20. Apr 2025, 09:37
von Heinrichs
Das Modul HW-827 ist ein einfaches Modul zur Bestimmung der Pulsrate. Es besitzt 3 Anschlüsse, zwei für die Stromversorgung und einen für das analoge Ausgangssignal (s. Abb. 1)

HW_287_Anschluesse_klein.jpg
Abb. 1: Anschlüsse beim HW-827
HW_287_Anschluesse_klein.jpg (16.78 KiB) 2222 mal betrachtet

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.

HW_827_Schaltplan.jpg
Abb. 2: Schaltplan des HW-827
HW_827_Schaltplan.jpg (214.14 KiB) 2221 mal betrachtet

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).

Messung_4s_fuer_5_Perioden_Grafik_1.jpg
Abb. 3: Eine Pulsratenmessung
Messung_4s_fuer_5_Perioden_Grafik_1.jpg (174.54 KiB) 2220 mal betrachtet

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-827TTGO
GNDG
VCC3V
SignalPin 36


2. Programm
  • A/D-Wandler
Da das HW-827-Modul nur ein analoges Signal zur Verfügung stellt, müssen wir einen Analog-Digital-Wandler einsetzen; den stellt der ESP32-Mikrocontroller unseres TTGO zur Verfügung.

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))
Mit dieser kann die Spannung am Pin 36 des TTGO über die Methode puls.read() bestimmt werden. Zuvor muss der AD-Wandler aber noch konfiguriert werden:

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
Von dem Finger wird nur ein geringer Teil des von der LED emittierten Lichts zum Lichtsensor reflektiert; und die vom Puls stammenden Schwankungen der Lichtmenge sind entsprechend noch deutlich kleiner. Die vom HW-827 gelieferten Messwerte befinden sich deswegen in einem relativ kleinen Intervall, welches wenige hundert Einheiten groß ist. Um die Messwerte nun sinnvoll graphisch darstellen zu können, erfassen wir zunächst im zeitlichen Abstand von 25 ms insgesamt 220 Messwerte und bestimmen von diesen den maximalen Wert glob_max sowie den minimalen Wert glob_min. Die gemessenen Werte liegen damit alle im Intervall [glob_min, glob_max]. Es ist nicht ausszuschließen, dass während der anschließenden Messung auch Werte auftauchen, welche sich nicht in diesem Intervall, sondern leicht außerhalb befinden. Damit es bei der graphischen Darstellung der Messwerte dadurch nicht zu Problemen kommt, vergrößern wir das Intervall, indem wir glob_min (glob_max) um ein Fünftel der Intervalllänge verkleinern (vergrößern). Der zugehörige Programm-Code ist:

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
In der Messschleife werden im Abstand von jeweils 25 ms insgesamt 220 Messwerte mit dem Befehl

Code: Alles auswählen

puls_wert = puls.read() 
aufgenommen; zur graphischen Darstellung werden diese Werte auf 100 normiert (d. h. in der Graphik entspricht glob_diff gerade 100 Pixeln):

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
Zusätzlich wird bei jeder 20-ten Messung ein blauer Skalenstrich gezeichnet:

Code: Alles auswählen

if i % 20 == 0:
        display.line(10+i, 30, 10+i, 125, st7789.BLUE)
Die Skalenstriche haben einen zeitlichen Abstand von 20 * 25 ms = 0,5 s.

  • Abbruch des Programms und Auswertung
Nach 220 Messungen ist die erste Messreihe abgeschlossen. Das Programm kann dann innerhalb von 4 s durch Betätigen des Tasters T0 abgebrochen werden. Das aufgezeichnete Diagramm kann man nun manuell wie oben dargestellt auswerten. Wird der Taster nicht betätigt, dann wird automatisch eine neue Messreihe aufgezeichnet...

  • Berechnung der Pulsrate durch den TTGO
Aus den aufgezeichneten Messdaten kann man die Herzrate auch vom TTGO berechnen lassen. Wie man dazu vorgehen kann, habe ich in meinem Beitrag Messung von Pulsraten mit dem MAX30102 beschrieben.


.