Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
pulssensor [2022/06/23 17:55] – student | pulssensor [2023/07/03 10:16] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Pulssensor ====== | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | ====== Projekt====== | ||
+ | |||
+ | Der Pulssensor hat die Aufgabe den Puls zu messen und diesen auf einem LED-Display und auf einer Website auszugeben. Er wird durch ein auf dem RaspberryPi liegendes Python-Skript aktiviert, welches wiederrum durch ein in die Website integriertes PHP-Skript aktiviert wird. Das PHP-Skript der Website wird aktiviert, sobald ein Benutzer alle Formularfelder (Name, Vorname und Geburtsdatum) befüllt hat und den Knopf „Messung“ gedrückt hat. Das Python-Skript wird gestartet, läuft ca. 15 Sekunden, nach Ablaufen der Zeit lädt die Website neu und zeigt die Patientenstammdaten und den gemessenen Puls in Puls/Minute (BPM) auf der rechten Seite an. | ||
+ | Der Pulssensor misst den Puls indem er die Helligkeitsunterschiede zwischen den Herzschlägen misst. Wenn viel Licht vom Transistor aufgenommen wird misst der Sensor eine niedrige Spannung. Sobald Blut gepumpt wird erkennt der Transistor einen Helligkeitsunterschied und man misst eine höhere Spannung. Diese Werte werden vom ADC Wandler in Digitale Werte zwischen 0 und 4095 verarbeitet (0 = Keine Spannung, 4095 = 3,3 Volt). Der RaspberryPi kann von Haus aus keine analogen Werte interpretieren, | ||
+ | |||
+ | ====== Bauteile====== | ||
+ | Verwendete Teile: | ||
+ | * Raspberry Pi 3 | ||
+ | * Breadboard 200 Pin | ||
+ | * 2-Zeilen-LCD-Display | ||
+ | * ADC Wandler 2^12 Bit | ||
+ | * KY-039 Herzschlagsensor | ||
+ | * (Tablet als Eingabegerät) | ||
+ | |||
+ | ====== Aufbau====== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ====== Code====== | ||
+ | |||
+ | ====Pulssensor==== | ||
+ | Beim Starten des Python-Skripts werden (falls vorhanden) die alten CSV- und TXT-Dateien gelöscht, damit das Skript nach dem Aufzeichnen der Werte wieder problemlos eine neue Datei anlegen kann. | ||
+ | Wir sprechen den Channel 0 des ADC-Wandlers an, also den Channel ganz unten am Board. Um die ADC-Werte auszulesen, läuft eine While-Schleife mit einer Abfrage-Clock des ADC-Wandlers 250 Durchläufe in 15 Sekunden. Die Werte werden dann jeweils in einem Array und in einer CSV Datei abgespeichert. Sobald der Mittelwert ausgerechnet wurde, definiert man die Peaks und Troughs. Um auf einen Schwellenwert zu kommen, welcher ein Peak/Trough definiert, haben wir viele verschiedene Werte ausprobiert und sind zum Entschluss gekommen, dass man mit +- 80 vom Mittelwert die realistischsten Werte erhält. | ||
+ | Nach dem Sammeln der Werte wird ausgerechnet, | ||
+ | |||
+ | <code python> | ||
+ | try: | ||
+ | os.remove(' | ||
+ | except FileNotFoundError: | ||
+ | time.sleep(1) | ||
+ | |||
+ | try: | ||
+ | os.remove(' | ||
+ | except FileNotFoundError: | ||
+ | time.sleep(1) | ||
+ | |||
+ | |||
+ | i = 0 #Variable zum Hochzaehlen der Schleife | ||
+ | a = [] #Leerer Array | ||
+ | |||
+ | while i < 250: #250 Werte -> 15 Sekunden messen | ||
+ | word=[1, | ||
+ | gp.output(24, | ||
+ | anip=0 # | ||
+ | #Clock out of 7 bits to select channel => AD-Wandler kann von 0 bis Channel 7 angepsrochen werden | ||
+ | #for k in range (0, | ||
+ | for x in range (0,7): | ||
+ | gp.output(19, | ||
+ | time.sleep(0.0001) | ||
+ | gp.output(23, | ||
+ | time.sleep(0.0001) | ||
+ | gp.output(23, | ||
+ | #Clock in 11 bits of data | ||
+ | for x in range (0,12): | ||
+ | gp.output(23, | ||
+ | time.sleep(0.0001) | ||
+ | bit=gp.input(21) # | ||
+ | time.sleep(0.0001) | ||
+ | gp.output(23, | ||
+ | value=bit*2**(12-x-1) # | ||
+ | anip=anip+value # | ||
+ | time.sleep(0.06) | ||
+ | #print (anip) | ||
+ | #Werte in den Array speichern | ||
+ | a.append(anip) | ||
+ | #tup1 = ("", | ||
+ | #ADC-Werte werden in CSV Datei abgespeichert | ||
+ | writer = csv.writer(f) | ||
+ | writer.writerow([anip]) | ||
+ | f.close | ||
+ | i = i + 1 | ||
+ | #Erster Ansatz vom CSV Writer | ||
+ | #k = (anip) # | ||
+ | #writer = csv.writer(f) | ||
+ | # | ||
+ | gp.output(24, | ||
+ | |||
+ | |||
+ | |||
+ | min = min(a) | ||
+ | max = max(a) | ||
+ | mean = statistics.mean(a) | ||
+ | |||
+ | print(min) # | ||
+ | print(max) | ||
+ | print(mean) | ||
+ | |||
+ | T = mean - 80 # | ||
+ | P = mean + 80 # | ||
+ | |||
+ | count_t = sum(1 for i in a if i < T) #Summe Taeler: | ||
+ | print(count_t) | ||
+ | |||
+ | count_p = sum(1 for i in a if i > P) #Summe Peaks: | ||
+ | print(count_p) | ||
+ | |||
+ | if count_t > count_p: | ||
+ | wert = count_t | ||
+ | else: | ||
+ | wert = count_p | ||
+ | |||
+ | if wert == count_p and wert > 60: #Wenn die Peaks groesser sind als 60 soll er Taeler nehmen und andersherum. | ||
+ | wert = count_t | ||
+ | elif wert == count_t and wert > 60: | ||
+ | wert = count_p | ||
+ | </ | ||
+ | |||
+ | ====LCD-Display==== | ||
+ | Das LCD-Display ermöglicht es uns auf zwei Zeilen zwei kurze Nachrichten auszugeben. Nachdem die Pulsmessung abgeschlossen ist, wird der gemessen Wert sowohl in eine TXT-Datei geschrieben (damit diese von der Website ausgewertet und angezeigt werden kann), als auch auf dem LCD-Display angezeigt. Auch hier wird bei einem unrealistischen Ruhepuls eine Meldung eingeblendet, | ||
+ | |||
+ | <code python> | ||
+ | #Display Ausgabe | ||
+ | #Wenn Werte realistisch dann werden sie ausgegeben | ||
+ | if wert > 10 and wert < 60: | ||
+ | lcd.lcd_display_string(" | ||
+ | #Um auf Beats per Minute zu kommen | ||
+ | wert = wert * 4 | ||
+ | lcd.lcd_display_string(str(wert), | ||
+ | print (wert) | ||
+ | with open (" | ||
+ | file.write(" | ||
+ | file.close | ||
+ | #wert an server schicken | ||
+ | #Sonst wird man aufgeforder noch einmal zu messen | ||
+ | else: | ||
+ | lcd.lcd_display_string(" | ||
+ | lcd.lcd_display_string(" | ||
+ | with open (" | ||
+ | file.write(" | ||
+ | file.close | ||
+ | |||
+ | time.sleep(4) | ||
+ | lcd.lcd_clear() | ||
+ | </ | ||
+ | |||
+ | ====Website==== | ||
+ | Die Website funktioniert im Grunde ganz simple, sie ist ein zwei Bereiche aufgeteilt: | ||
+ | |||
+ | 1. Den Patientendaten-Eingabe-Bereich: | ||
+ | |||
+ | 2. Auf dem Patienten-Ausgabe-Bereich werden bei jedem Laden der Website die Patientenstammdaten und der gemessene Puls ausgegeben. Da beides bei einem erstmaligen Laden der Seite noch nicht existiert beziehungsweise logischerweise noch keines der Eingabefelder befüllt wurde, würde die Seite eigentlich eine Fehlermeldung anzeigen. Über die dreifache „empty($_POST[„*Feldname*“])-Bedingung wird dieser Vorgang allerdings verhindert, sodass der PHP-Skript-Teil erst ausgeführt wird, wenn das Formular mit allen drei befüllten Feldern abgeschickt wurde. Unter der Werteübergabe der Felder wird im Anschluss das Pulsmessungs-Python-Skript ausgeführt, | ||
+ | |||
+ | |||
+ | |||