Änderungen

KY-039 Herzschlag Sensor Modul

6.247 Byte hinzugefügt, 15:40, 29. Apr. 2016
/* Codebeispiel Arduino */
// Das Hauptprogramm hat zwei Aufgaben:
// - Wird ein Herzschlag erkannt, so blinkt die LED kurz aufgesetztauf
// - Der Puls wird errechnet und auf der serriellen Ausgabe ausgegeben.
[[Medium:KY-039-HeartBeatDetector_original_byDanTruong.zip|KY-039-HeartBeatDetector original by DanTruong]]
 
----
---------------------------------------------------
 
[[Medium:KY-039-HeartBeatDetector_GermanComments_byJoyIt.zip|KY-039-HeartBeatDetector deutsche Version by Joy-It]]
 
==Codebeispiel Raspberry Pi==
<span style="color: #ff6600;">!! <span style="color: #ff0000;">Achtung</span> !! <span style="color: #99cc00;">Analoger Sensor</span>  !! <span style="color: #ff0000;">Achtung</span> !!</span>
Der Raspberry Pi besitzt im Gegensatz zum Arduino keine analogen Eingänge bzw. es ist kein ADC (analog digital Converter) im Chip des Raspberry Pi's integriert. Dies schränkt den Raspberry Pi ein, wenn man Sensoren einsetzen möchte, wo nicht digital Werte ausgegeben werden [Spannungswert überschritten -> digital EIN | Spannungswert unterschritten -> digital AUS | Beispiel: Knopf gedrückt [<span style="color: #99cc00;">EIN</span>] <-> Knopf losgelassen [<span style="color: #ff0000;">AUS</span>]], sondern es sich hier um einen kontinuierlichen veränderlichen Wert handeln sollte (Beispiel: Potentiometer -> Andere Position = Anderer Spannungswert)
Um diese Problematik zu umgehen, besitzt unser ''Sensorkit X40'' mit dem '''KY-053''' ein Modul mit 12 16 Bit genauen ADC, welches Sie am Raspberry nutzen können, um diesen um 4 analoge Eingänge erweitern zu können. Dieses wird per I2C an den Raspberry Pi angeschlossen, übernimmt die analoge Messung und gibt den Wert digital an den Raspberry Pi weiter.
Somit empfehlen wir, bei analogen Sensoren dieses Sets das KY-053 Modul mit dem besagten ADC dazwischenzuschalten. Nähere Informationen finden Sie auf der Informationsseite zum [[KY-053 Analog Digital Converter|'''KY-053'''   Analog Digital Converter]]
<span style="color: #ff6600;">!! <span style="color: #ff0000;">Achtung</span> !! <span style="color: #99cc00;">Analoger Sensor</span>  !! <span style="color: #ff0000;">Achtung</span> !!</span>  Das Programm sieht vor, dass im Abstand der eingestellten "delayTime" (Standard: 10ms) die Funktion zur Herzschlagdetektion aufgerufen wird. Wurde ein Herzschlag erkannt, so wird der Puls ausgegeben. Zusätzlich kann man am eingestellten LED_Pin (Standard: GPIO24) eine LED anschließen, um den detektierten Herzschlag auch visuell auszugeben. Wird der Finger beim messen neu aufgelegt oder stark bewegt, so kann es etwas dauern (3-5 Sekunden), bis das Programm sich auf die neue Gegebenheit kalibriert und wieder den richtigen Wert ausgibt. Das Programm nutzt zur Ansteuerung des ADS1115 ADC die entsprechenden ADS1x15 und I2C Python-Libraries der Firma Adafruit. Diese wurden unter dem folgenden Link [[https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code]] unter der BSD-Lizenz [[https://opensource.org/licenses/BSD-3-Clause Link]] veröffentlicht. Die benötigten Libraries sind im unteren Download-Paket enthalten.   <pre class="brush:py">#!/usr/bin/python# coding=utf-8
#############################################################################################################
### Copyright by Joy-IT
### Published under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
### Commercial use only after permission is requested and granted
###
### Parts of Code based on Dan Truong's KY039 Arduino Heartrate Monitor V1.0
### [https://forum.arduino.cc/index.php?topic=209140.msg2168654] Message #29
#############################################################################################################
Programmierbeispiel in # Dieser Code nutzt die ADS1115 und die I2C Python Library fuer den Raspberry Pi# Diese ist unter folgendem Link unter der Programmiersprache BSD Lizenz veroeffentlicht# [https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code]from Adafruit_ADS1x15 import ADS1x15from time import sleep
<pre class="brush:py"># Benoetigte Weitere benoetigte Module werden importiert und eingerichtetimport time, signal, sys, os
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False) # Benutzte Variablen werden initialisiertbeatsPerMinute = 0isPeak = Falseresult = FalsedelayTime = 0.01maxValue = 0schwelle = 25beatTime = 0oldBeatTime = 0 # Adresszuweisung ADS1x15 ADC ADS1015 = 0x00 # 12-bit ADCADS1115 = 0x01 # 16-bit # Verstaerkung (Gain) wird ausgewaehltgain = 4096 # +/- 4.096V# gain = 2048 # +/- 2.048V# gain = 1024 # +/- 1.024V# gain = 512 # +/- 0.512V# gain = 256 # +/- 0.256V # Abtasterate des ADC (SampleRate) wird ausgewaehltsps = 8 # 8 Samples pro Sekunde# sps = 16 # 16 Samples pro Sekunde# sps = 32 # 32 Samples pro Sekunde# sps = 64 # 64 Samples pro Sekunde# sps = 128 # 128 Samples pro Sekunde# sps = 250 # 250 Samples pro Sekunde# sps = 475 # 475 Samples pro Sekunde# sps = 860 # 860 Samples pro Sekunde # ADC-Channel (1-4) wird ausgewaehltadc_channel = 0 # Channel 0# adc_channel = 1 # Channel 1# adc_channel = 2 # Channel 2# adc_channel = 3 # Channel 3 # Hier wird der ADC initialisiert - beim KY-053 verwendeten ADC handelt es sich um einen ADS1115 Chipsatzadc = ADS1x15(ic=ADS1115) # Hier wird der EingangsAusgangs-Pin deklariert, an dem der Sensor die LED angeschlossen ist. Zusaetzlich wird auch der PullUP Widerstand am Eingang aktiviertGPIO_PIN LED_PIN = 24GPIO.setup(GPIO_PINLED_PIN, GPIO.INOUT, pull_up_down initial= GPIO.PUD_UPLOW) print "Sensor############################################################################################################# # Hier wird der Ausgangs-Test [druecken Sie STRG+CPin deklariert, um den Test zu beenden]"an dem der Buzzer angeschlossen ist. def heartBeatDetect(schwelle): global maxValue global isPeak global result global oldBeatTime  # Diese AusgabeFunktion Hier wird bei Signaldetektion ausgefuehrtder aktuelle Spannungswert am Fototransistor ausgelesendef ausgabeFunktion # und in der rawValue - Variable zwischengespeichert # Mit "adc_channel" wird der am ADC angeschlossene Channel ausgewaehlt rawValue = adc.readADCSingleEnded(nulladc_channel, gain, sps # Reset der Ergebnis Variable if result == True: result = False  print# Sollte der aktuelle Wert vom letzten maximalen Wert zu weit abweichen # ("Signal z.B.da der Finger neu aufgesetzt oder weggenommen wurde) # So wird der MaxValue resetiert, um eine neue Basis zu erhalten. if rawValue * 4 < maxValue: maxValue = rawValue * 0.8; # Hier wurd der eigentliche Peak detektiert. Sollte ein neuer RawValue groeßer sein # als der letzte maximale Wert, so wird das als Spitze der aufgezeichneten Daten erkannt". if rawValue > (maxValue - schwelle): if rawValue > maxValue: maxValue = rawValue # Zum erkannten Peak soll nur ein Herzschlag zugewiesen werden if isPeak == False: result = True  isPeak = True  else: if rawValue < maxValue - schwelle: isPeak = False # Hierbei wird der maximale Wert bei jedem Durchlauf # etwas wieder herabgesetzt. Dies hat den Grund, dass # nicht nur der Wert sonst immer stabil bei jedem Schlag # gleich oder kleiner als maxValue sein wuerde, sondern auch, # falls der Finder sich minimal bewegen sollte und somit # das Signal generell schwaecher sein sollte. maxValue = maxValue - schwelle/2  # Wurde in der oberen Abfrage ein Herzschlag detektiert, so wird nun die Ausgabe freigegeben if result == True:  # Berechnung des Puls # Hierbei wird bei jedem registrierten Herzschlag die System-Zeit aufgenommen # Beim Detektieren eines Signals naechsten Herzschlag wird dann die aktuelle Systemzeit mit der gespeicherten verglichen # Die Differenz der beiden ergibt dann die Zeit zwischen den Herz-Schlaegen # womit man dann auch den Puls berechnen kann. beatTime = time.time(fallende Signalflanke) timedifference = beatTime - oldBeatTime beatsPerMinute = 60/timedifference oldBeatTime = beatTime  # Neben der Berechnung des Puls, wird die Ausgabefunktion ausgeloestder Herzschlag auch auf eine LED als kurzes Aufblinken ausgegeben GPIO.add_event_detectoutput(GPIO_PINLED_PIN, GPIO.FALLINGHIGH) time.sleep(delayTime*10) GPIO.output(LED_PIN, callback=ausgabeFunktion, bouncetime=100GPIO.LOW) # Erechneter Puls wird der Funktion übergeben return beatsPerMinute ############################################################################################################# # ########
# Hauptprogrammschleife
# ########
# Das Programm sieht vor, dass im Abstand der eingestellten "delayTime" (Standard: 10ms)
# die Funktion zur Herzschlagdetektion aufgerufen wird. Wurde ein Herzschlag erkannt,
# so wird der Puls ausgegeben.
 
try:
while True:
time.sleep(1delayTime) beatsPerMinute = heartBeatDetect(schwelle) if result == True: print "---Herzschlag erkannt !--- Puls:", int(beatsPerMinute),"(bpm)"  # Aufraeumarbeiten nachdem das Programm beendet wurde
except KeyboardInterrupt:
GPIO.cleanup()
</pre>
</pre>
'''Anschlussbelegung Raspberry Pi:'''
Sensor KY-039 {| style="height: 58px85px; padding-left: 30px;" width="228441"
|-
||Signal
||=
||GPIO24Analog 0||[Pin 18A0 (ADS1115 - KY-053)]
|-
||+V
|}
'''Beispielprogramm Download'''ADS1115 - KY-053:
{| style="height: 127px; padding-left: 30px;" width="436"|-||VDD||=||3,3V||[Pin 01]|-||GND||=||Masse||[Medium:SensorTest_RPi.zipPin 09]|SensorTest_RPi.zip-||SCL||=||GPIO03 / SCL||[Pin 05]|-||SDA||=||GPIO02 / SDA||[Pin 03]|-||A0||=||s.o.||[Sensor: Signal]|} '''Beispielprogramm Download'''
Zu starten mit dem Befehl:
<pre class="brush:bash">sudo python SensorTest_RPiKY-0039_HeartBeatDetector.py
</pre>
Bürokrat, Administrator
611
Bearbeitungen