<#!/usr/bin/python3 from CA_BOARD_FUNCTIONS import * import lcddriver import matplotlib.pyplot as plt import gpiozero import time import os import ssl import smtplib from email.message import EmailMessage import scipy.signal from pulse_width import * email_sender = 'melaley98@gmail.com' email_password = 'ddvpqksaxtxvhlne' email_receiver = 'pflegepersonal98@gmail.com' # Board-Pinbelegung wird gewaehlt initBoard() # alle LEDs auf dem BOARD werden als Output definiert initLEDs() # Klassen # adc: MCP3008 # lcd: lcd adc = gpiozero.MCP3008(channel = 0) lcd = lcddriver.lcd() # Variablendefinition x = [] rawData = [] filteredData = [] filteredDataMean = 0 filteredDataMaxValue = 0 thres = 0 thres_vec = [] binPulseData = [] meastime = 0 # Konfiguration # Messzeit MEASURE_TIME = 10 # Abtastfrequenz SAMPLE_FREQ = 1000 # Zeit zwischen zwei Messungen TIME_PER_SAMPLE = 1/SAMPLE_FREQ # Anzahl der Messungen in der angegebenen Messzeit # (stimmt nicht zu 100% ueberein, da das Programm durch andere Prozesse "gestoppt" wird NUM_SAMPLES = MEASURE_TIME * SAMPLE_FREQ # Dateiname (plot) FILENAME = "Aleyna-Yildirim-puls.png" # Variablen für das LCD-Display # lcd_row1: string für die 1. Zeile # lcd_row2: string für die 2. Zeile lcd_row1 = "-----Pulse------" lcd_row2 = "" lcd.lcd_display_string(lcd_row1, 1) # Ausgabe measure starts in 5,4,3 .... for i in range(2, 0,-1): lcd_row2 = "starts in " + str(i) + "sec." lcd.lcd_display_string(lcd_row2, 2) print(lcd_row2) time.sleep(1) # Ausgabe Messung wird gestartet (start) lcd_row2 = "start" print("start") lcd.lcd_clear() lcd.lcd_display_string(lcd_row1, 1) lcd.lcd_display_string(lcd_row2, 2) # Messung # für die Berechnung der Dauer wird zunaecht ein Zeitstempel gesetzt t1 = time.time() for i in range(NUM_SAMPLES): # rawData (analog Wert) wird gelesen rawData.append(adc.raw_value) # x-Achse x.append(i) time.sleep(TIME_PER_SAMPLE) # 2. Zeitstempel t2 = time.time() # Ueberpruefung, ob die angegebene Messzeit erreicht wurde if (t2-t1) > MEASURE_TIME: break # die Messdauer wird berechnet measTime = t2-t1 # Filter: Das Signal (raw values) wird gefiltert # Lowpass filter (Tiefpass Filter) b, a = scipy.signal.butter(3, 0.1) filteredData = scipy.signal.filtfilt(b, a, rawData) # Schwellwert wird berechnet for i in filteredData: filteredDataMean = filteredDataMean + i filteredDataMean = filteredDataMean/len(filteredData) filteredDataMaxValue = max(filteredData) thres = int((filteredDataMean + filteredDataMaxValue)/2) # Mit dem gefilterten Signal und einem Schwellwert wird die 3. Kennlinie generiert for i in range(len(filteredData)): # falls, das gefilterte Signal an der Stelle i groesser oder gleich thres ==> 1 sonst 0 if filteredData[i] >= thres: binPulseData.append(1) else: binPulseData.append(0) # Es wird ein Vektor generiert, damit auch der Schwellenwert geplottet werden kann for i in range(len(filteredData)): thres_vec.append(thres) # Verarbeitung der 3. Kennlinie (Beispiel siehe **) # Eingabe der Funktion: # binPulseData: binarisierte Samples || 0: Sample-Wert kleiner als Schwellwert, 1: Sample-Wert groesser als Schwellwert # Ausgabe der Funktion: # PulsBreite: Gibt die Anzahl der PulsBreite in Samples an (Nullen und einsen) # PulsBin: Gibt die Änderung der Sample-Werte in binPulseData an || 0: Änderung 1 --> 0, 1: Änderung 0 --> 1 PulsBreite, PulsBin = analysisPulseBin(binPulseData) # binPulseData =[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0] # PulseBreite = [10, 6, 7, 2, 10, 1, 8, 4, 6] # PulsBin = [0, 1, 0, 1, 0, 1, 0, 1, 0] # Wird die Messung richtig durchgefuehrt, so sind alle Impulse in der Variable PulsBin enthalten. counterPuls = 0 # Da die Variable PulsBin alle Impulse beinhaltet, werden hier die einsen gezaehlt # Die Einsen geben an, wie viele Impulse waehrend der Messung erkannt wurden. for i in PulsBin: if i == 1: counterPuls = counterPuls + 1 # Ausgabe und Berechnung der Herzschlaege pro Minute (Anzahl der Impulse in 10 Sekunden * 6 = Anzahl der Impulse in einer Minute) print(counterPuls) num_samples = 0 time_per_sample = 0 num_samples = len(rawData) ## Beispiel * # 20 Werte in 10Sek. # 2 Daten/Sekunde: Frequenz 1/sek. # 10/20 = 0.5 s PulseTime = [] # Berechnung Dauer eines Samples (Beispiel siehe *) time_per_sample = measTime / num_samples for i in PulsBreite: PulseTime.append(i*time_per_sample) print(PulseTime) # Plot mit drei subplots werden erstellt. Die x-Achse gilt fuer alle Plots (Parameter: sharex=True) fig, axs = plt.subplots(3, sharex=True) # Plot axs[0].plot(x, rawData) axs[0].set_title('Pulse sensor raw data') axs[1].plot(x, filteredData) axs[1].plot(x, thres_vec, 'r') axs[1].set_title('Pulse sensor fltered data') axs[2].plot(x, binPulseData) axs[2].set_title('Pulse') plt.show() # Plot wird gespeichert. Dateiname: FILENAME (wird in der Variablendefinition angegeben) plt.savefig(FILENAME) # Ausgabe LCD-Display lcd.lcd_clear() lcd.lcd_display_string(lcd_row1, 1) lcd_row2 = "measure done..." lcd.lcd_display_string(lcd_row2, 2) # Ausgabe am Terminal print("measure done...") print("###############") print("### Summary ###") print("Pulse/min.: " + str(counterPuls*6)) print("Time per sample: " + str(time_per_sample)) print("measure time: " + str(measTime)) print("number samples: " + str(len(rawData))) print("saved file name: " + FILENAME) # alle LEDs blinken 5x allLedBLINK(5, 0.5) puls = counterPuls if puls > 100: subject = 'Pulswert aus Zimmer 014' body = 'Der Puls des Patienten aus Zimmer 014 liegt bei mehr als 100 Schlägen pro Minute!' em = EmailMessage() em['From'] = email_sender em['to'] = email_receiver em['Subject'] = subject em.set_content(body) context = ssl.create_default_context() with smtplib.SMTP_SSL('smtp.gmail.com', 465, context=context) as smtp: smtp.login(email_sender, email_password) smtp.sendmail(email_sender, email_receiver, em.as_string()) elif puls < 60: subject = 'Pulswert aus Zimmer 014' body = 'Der Puls des Patienten aus Zimmer 014 liegt bei weniger als 60 Schlägen pro Minute!' em = EmailMessage() em['From'] = email_sender em['to'] = email_receiver em['Subject'] = subject em.set_content(body) context = ssl.create_default_context() with smtplib.SMTP_SSL('smtp.gmail.com', 465, context=context) as smtp: smtp.login(email_sender, email_password) smtp.sendmail(email_sender, email_receiver, em.as_string()) # GPIOs freigeben cleanGPIOs() >