Projekt: PflegeRuf

Ziel & Funktion des PflegeRufs

Ziel:

Das Pflegepersonal in medizinischen Einrichtungen, wie Krankenhäusern oder Pflegeeinrichtungen, ist, aufgrund des Mangels an Pflegepersonal, mit der intensiven und zeitaufwendigen Pflege der Patienten oder Bewohner stark überfordert. Das System „PflegeRuf“ soll das Pflegepersonal unterstützen und entlasten, indem die Patienten auswählen können, warum Sie das Pflegepersonal zu sich ins Zimmer rufen möchten. Somit spart sich das Pflegepersonal kostbare Zeit und Energie, hin und her zu laufen, um erstmal den Grund für den Ruf zu erfahren und daraufhin die notwendigen Materialien zu holen, um dann wieder zurück zum Patienten zu gehen.

Funktion:

Um den PflegeRuf nutzen zu können, muss der Patient die Gesichtserkennung nutzen, indem er das Gesicht zur Kamera hält, welche sich über dem Touch Display befindet. Die Kamera erkennt nur bereits vorher registrierte Nutzer. Unbekannte Gesichter werden mit der Bezeichnung „Unknown“ nicht zur Nutzung des PflegeRufs zugelassen. Nachdem der Patient erkannt wurde, öffnet sich der PflegeRuf. Hier gibt es 3 Auswahlmöglichkeiten (siehe Bild oben).

  1. Entweder kann der Patient das Pflegepersonal rufen und ein bestimmtes Anliegen auswählen. Nachdem einer der Button angeklickt wurde, erhält das Pflegepersonal sofort eine Email mit dem ausgewählten Grund für den Ruf. Folgende Anliegen können auf der grafischen Benutzeroberfläche ausgewählt werden:
  • Schmerzen
  • Medikamente
  • WC
  • Waschen
  • Essen
  • Getränke
  • TV
  1. (2) Zusätzlich kann der Patient eigenständig seinen Puls messen. Sobald der Button „Puls messen“ betätigt wird, startet die Messung. Auf dem kleineren Display unter dem großen Display wird dem Patienten angezeigt, wann die Messung startet und wann es fertig ist. Sobald die Messung vollendet ist, erscheint eine Grafik mit der Herzschlag des Patienten. Wenn der Wert zu hoch oder zu niedrig ist, erhält auch hier das Pflegepersonal ebenfalls eine E-Mail mit einer Warnung.
  2. (3) Zu guter Letzt kann der Patient, falls Langeweile besteht, mit dem Zimmergenosse „TicTacToe“ spielen. Der Gewinner wird auf dem kleinen Display angezeigt.

Diese Bauteile wurden verwendet:

  • Raspberry Pi 4 B
  • (Half-Size) Breadboard –> darauf: MCP 3008 A/D Wandler
  • Jumper Kabel
  • KY-039 Herzschlagsensor
  • RASPBERRY PI 7TD Raspberry Pi Shield - Display LCD-Touch, 7„, 800×480 Pixel
  • I2C LCD Display
  • Raspberry Pi Camera Module V2

Beschreibung des Quellcodes

Gesichtserkennung

Der Vorgang zur Einrichtung der Gesichtserkennung, sowie der Quellcode mit Ausnahme Zeile 78-80, sowie Zeile 113-114, wurden aus folgendem Tutorial entnommen und kann dort ausführlich nachgelesen werden: https://core-electronics.com.au/guides/face-identify-raspberry-pi/ Um die Gesichtserkennung starten zu können musste OpenCV installiert werden und eine haarcascade_frontalface.xml Datei aus dem Internet heruntergeladen werden für das Erkennen von Gesichtern. Wir haben mindestens 10 Fotos von unseren Gesichtern aufgenommen und diese in einem Ordner gespeichert. Auf diesen Ordner wird zugegriffen und während der Videoaufnahme erscheint der Name des Ordners und somit der Name der Person.

facial_req.py
<#!/usr/bin/python3
 
# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import face_recognition
import imutils
import pickle
import time
import cv2
import RPi.GPIO as GPIO
from time import sleep
import subprocess
import sys
 
#Initialize 'currentname' to trigger only when a new person is identified.
currentname = "unknown"
#Determine faces from encodings.pickle file model created from train_model.py
encodingsP = "encodings.pickle"
 
# load the known faces and embeddings along with OpenCV's Haar
# cascade for face detection
print("[INFO] loading encodings + face detector...")
data = pickle.loads(open(encodingsP, "rb").read())
 
# initialize the video stream and allow the camera sensor to warm up
# Set the ser to the followng
# src = 0 : for the build in single web cam, could be your laptop webcam
# src = 2 : I had to set it to 2 inorder to use the USB webcam attached to my laptop
#vs = VideoStream(src=2,framerate=10).start()
vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)
 
# start the FPS counter
fps = FPS().start()
 
# loop over frames from the video file stream
while True:
	# grab the frame from the threaded video stream and resize it
	# to 500px (to speedup processing)
	frame = vs.read()
	frame = imutils.resize(frame, width=500)
	# Detect the fce boxes
	boxes = face_recognition.face_locations(frame)
	# compute the facial embeddings for each face bounding box
	encodings = face_recognition.face_encodings(frame, boxes)
	names = []
 
	# loop over the facial embeddings
	for encoding in encodings:
		# attempt to match each face in the input image to our known
		# encodings
		matches = face_recognition.compare_faces(data["encodings"],
			encoding)
		name = "Unknown" #if face is not recognized, then print Unknown
 
		# check to see if we have found a match
		if True in matches:
			# find the indexes of all matched faces then initialize a
			# dictionary to count the total number of times each face
			# was matched
			matchedIdxs = [i for (i, b) in enumerate(matches) if b]
			counts = {}
 
			# loop over the matched indexes and maintain a count for
			# each recognized face face
			for i in matchedIdxs:
				name = data["names"][i]
				counts[name] = counts.get(name, 0) + 1
 
			# determine the recognized face with the largest number
			# of votes (note: in the event of an unlikely tie Python
			# will select first entry in the dictionary)
			name = max(counts, key=counts.get)
			#If someone in your dataset is identified, print their name on the screen
			if currentname != name:
				currentname = name
				cmd = 'python3 pflegeRuf.py'
				p = subprocess.Popen(cmd, shell=True)
				sys.exit().sys.exit()
 
 
		# update the list of names
		names.append(name)
 
 
 
	# loop over the recognized faces
	for ((top, right, bottom, left), name) in zip(boxes, names):
		# draw the predicted face name on the image - color is in BGR
		cv2.rectangle(frame, (left, top), (right, bottom),
			(0, 255, 225), 2)
		y = top - 15 if top - 15 > 15 else top + 15
		cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
			.8, (0, 255, 255), 2)
 
	# display the image to our screen
	cv2.imshow("Facial Recognition is Running", frame)
	key = cv2.waitKey(1) & 0xFF
 
	# quit when 'q' key is pressed
	if key == ord("q"):
		break
 
	# update the FPS counter
	fps.update()
 
# stop the timer and display FPS information
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
 
if currentname != name:
    sys.exit().sys.exit()
    cv2.destroyAllWindows()
    vs.stop()
>

Graphische Benutzeroberfläche

Die Graphische Benutzeroberfläche wurde mit dem GUI-Framework PysimpleGui erstellt. Jede Zeile mit den []-Klammern erweitert das Display und ermöglicht das Hinzufügen von den gewünschten Elementen wie z.B. Button, Bilder, Text, Input Felder und vieles mehr. Um „Image Buttons“ erstellen zu können, müssen Bilder (png oder jpeg) vorher zu Base_64 konvertiert und im Quellcode als Variable hinzugefügt werden. Erst dann können die Bilder als Button genutzt werden. Nachdem ein Anliegen ausgewählt wurde, erscheint für 4 Sekunden ein Pop up Fenster, welches sich automatisch wieder schließt. Zusätzlich werden E-Mails verschickt, indem der Email Sender und Empfänger, sowie ein Passwort für die externe Nutzung durch weniger gesicherte Apps, notiert werden.

pflegeRuf.py
<#!/usr/bin/python3
import PySimpleGUI as sg
import smtplib
import os
from email.message import EmailMessage
import ssl
import subprocess
import RPi.GPIO as GPIO
import time
 
email_sender = 'melaley98@gmail.com'
email_password = 'ddvpqksaxtxvhlne'
email_receiver = 'pflegepersonal98@gmail.com'
 
 
 
schmerzen_base64 = b'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'
medikamente_base64 = b'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'
wc_base64 = b'iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAAXNSR0IArs4c6QAAIABJREFUeF7tXQd4VMUW/ufeu7vphGooAgGko4ACggLSCRpFQRGlC4J0BBERkac+RToIagRUBFFEVGpAVJqA9KogEeklQCCB1N29d9535t5NdkPqJkR338736Qfs7r0z559z5vRhQ5fu5fANr6UA8wHstdiKhfkA9m58fQB7Ob4+gH0AezsFvHx9vjPYB7CXU8DLl+fjYB/AhU8Bxjk4A7zbw8LAjAVqkCFBA4MGzljhEzSHJxYpB2uaBtACJWGCAxogMRncC5FmTDUglSAxDYyWrnFALlJ8i9BM4hyqqsLEOFIuxOD47u04dngvblw+AzXNWrSrLoq3MQmBYeVRtXpt1GvaEqXDayHVFABZUsCKkIsLnYOZxsAZiWBOPArYrfhr/3akxJ7F3o0rkRJ3ERpXi4LE/553CEIoYCZ/NGwTiZLV6qF6w5bgFpOQZHRkCcl2B0ahA0zy1s4UmCWO+JjD2LQsCpePH4BNTQN9RruXe6NMzgM4Em15JgFMRrkaNRHesA3qd+oOO5Mh3yGNpNABVhmDnJqIH+dPQ8yOtUKxICVDHEIEMO1ZSYFiNkNWFP0shncqXAwcmqZCtVphV1WQZilDBckvBQx2SChesRqee2M2WEDJO8LFhQSwHRoUKJzj2pm/sHfFh4jZ/ys4Z7rmCAmyyYQKtRqgWNnKCChVFuG1GyKscjXSszIWRqq1lwzSG2XYcTMuFiePHkLC+b9hu3kNx/dsgWZN0ddNkhkMgSXC0LrvGJS7vyVMhoVRWGQoFIDJHCD1/9T+rdi+aAoSrsUKMWySoO/SsIpo138cQspVgim4FCRwoTnrykYGqF6ELxjXLQZhHDEJMreD21Jw9dRJHN/8HX7ftlYXW1yDxhkCgkNRr8OzaNzlRfBC1FEKCDDNUAfoaswRRM95HTfjLumKAzSYg0ugbY9hCG/ZFRpPhSSMXwZNIq42fmmgqkPtPfaSBjpx6UjikDQJmsShkeLJZcjEEck38NmrfZB4/ZJgBolzcZQ93H0g7uvUE5BJiBd8uA0wiV2Fp8DO/KDdiscPU0bi8smjQnuWIKFy3cZoENkb5eo2opMIhvFb8Bl70RNuxl7A4TWLcHTLGqh2m3D+BIWWxmPD3kJorcZQBCcXDGa3AWaczCEVsqZh1ZRROH1kNzjXwBhH1QYt8Uj/8fAvVgaq8GvYfABnsTE5N0G1JeGvzd/gpy/mAppdKF+BpSthwMylSGGmAtvMBQCYnG8qDq/7Ctu/mi20RRJKQaXK4ZlJnyCgVBg0sQF5hjj2Iu4rnKWokCUTbElJgobHf16BNFLOOEdo1QZ4dtJcSLKlQAeX2wBzLkGzJ2D12yNx8eQhIUoUSxCeGjcHxe+pC0mi80b4JH0jDxRIir2A5f8ZgOSEq8LuCAgojvbD30T5Oi0A2S7ObneMSbcBZpKM83uj8cO0N8AlDhOX8HCPEajV6TmhFZq4WuSO9TzQ8V/6FWGGIO3KGSwc0w0aiWoO1GnTGU37TxB/zlBn87cEtwHm9hR81K89JDUVKmcIDSuPx16ejZC7K0AiE4g4vGD6Qf5W4uHfJrOKTuBtH0/AH9vXQY/LmNDnw+UICqkgaOkOOfMFMCn9EtdDXqcPbMOP08fAxlURDKvbrita9n0V6v+pG7Kg+4uYQpIknDm0AxvmjENychJkJuHBbn3RMHKQQNcdIzJfADssVYVrWDdnPE7t2Qi72GlmDJ+/FmpA8YKu8//29wSwcOrZU7Hi3eE4/+d+oUEzORDDFm2ExszkHso3ffIHsHEQqGnJWD/rVZw6shNMkxAQGoZe81ZBFp6p/E8i37P2wh84kgOIetEfvIlTv60VYlnhMl74eBVMwXe5JaPzCTA5y+2IvXge0VOHI+HKBUHqDj1HosqjPaGoeqaGbxSEAgzXft+NZf8dLJxGMmdoMWAC6rTq7Bbz5BtgBhWnjx7C6ilDATVNiJEXpi+FuUwNkbngliZQEHp42W+JgwN4Cqb2agOmkoOIo+rDTyFi8Hi3ZGP+AKZXcIYzh3Zh9ZThgAh8MfSYuQIly1SByuxeRu5/YDmMQeE2zOr5CJhqFT798EYdETHqHbcmk0+AyXdlxvlDm7Hm/Zd1HzOT0WP6twgNu9utCfh+dDsFyFKZ07M5wG0wcQ0VG7dBxMj33SKVWwCfO7gZa6a8DJE1Bxk9ZqxAaFgFtybg+1E2APdqDmj/AMAazDh7cDPWTiEOphQcGc8LDvYBXFiblXK0Puj1sACYTNJKRcXB9GINJpw9tAlrp4wCxTwp7fW56ct9ABcWunp8RgDMNKtIHAhv1AYRo4pARPsALkQUc3iUD+CiofM/9hYfwP8Y6YvmxT6Ai4bO/9hbPBJgZw+mu97qwniGM2r/1ud5JMCOaAkR2N04cWE8wxngwn4eAePYNO6ukebnkQDLlEBqxIrdXbxIJDBKX9x9RmaAHXPiUsGiJCL1leLlhTA/jwFYoko6exp2rFwCWFPAmYyHIp8BAkuCq3aRcZkbWR2pKiIZ15aMPeu/g5pyE5LFghoPtoZf2cowU1lmHgeZeiozAclxOLhxFezWJMhmPzR9vAdskgmaUV7jeBzlNTs/XZIVPTFd08ATr+P3PTtx89plMG4X9UUqzUWS4VfiLjRo9gi4f6h4JiRFlK1QIryIq3MZUja+e88BWNOw86vZ2P/TSmhplKEAlKxcG+0GvoGgirWh8LRc63FERjXnMHM7Ph3XE8mxZ6HarZBlf5iLh2HA9CWwKZY8wkvOVRk85Sai503C2SO7wOzJ4LIFpSvXwNNvzAM3+Ym0/XSAuQaVKSKFncEGf0nCwV/WYM/aL4GUBCQn3oTdSuWvohjFGAosJhmBxUrBJlnQvGs/1HioLZIkf5i4VWRNKpodVtmc5bw9BuC4k0exbNIAcJWSumVRpkG796Ene6Pu0yNg4vbcWVhEsICdyz7EvlWf6YngxrMoB7vyg+3x2PB381yxSGAlH9uGxW+NFHndDvak9Jh6nV/EQ1376RWAxhDnqiSDJ8bh2G8b8cuiWZDsaSKOJs5LI0oruJymZrC7KLMz/kJJc5pfCB7rNxSh1Zsh8C7KW7NnK708BuD4mP34ctIgPSHeKVxdrEwFdHv/a/iZA6BRDDnHocGWZsPPc8birwM7jG/qVCSeovywEZ9vhmoKMN6Qs9CnTbF4ZFckxJ4VAXU9Q4GLfKgGHZ9F0+eGg0smUNyb3kD5Zn9sWo0zu9cj5sgeULK3XiPpENyO9xn10OmfZPx7xvIYSt59D9r3HYFiNZpBZpRLrhfuOc/aYwC+FnMIyyYNBCdOdRpUPjr042ggIBS5KzcaLsYcx5r3h8KafDPLrdC2/0TUah1pkDxngM1qMmb2biOqCDLnONXv+Dwe7jlCbBridFLqzmz6FtGfzYBmT3UroyKrCZsCiqHFMwNQq0N3sWGERHI66T0G4PjYC1g7eQRuxJ6+bZ11Wj6J1gMn5J5Ixhgu7PkRK2dNENUTWY16rZ5Aq/7jRRVfTjKfNPBd30Rh7/efGMpOhvokK2Z0fmUWytZrLOYkcyBm8w/YsGAqJG6FnfLNCiljVGxBxhAx4n1UadQ6Q9Y7HQseEWwg6bvpk//g2NY1IMGWcbABMvPD8MVbYGVUBK6rMFkl7FE4cuW7g3DuyK5sU1bKV6uLiJenw794CVGTnNUQx6GmInrmGJzcv814Y8acTAHF8VLUWqgSacnAiZ+W4+dF08Xx4px0bkh08QoyiSgeToqbYgkAkyVo1lRoahokbmjM1GRG089bURDuNLn7Wj+FFi/QxnTdlh7DwbSavas+x+5v5olyDOdBZ1uHl6ehygMtDGCJ+243dxR7Gmb1bQWo2TdqkWQzur8ZhdCqdcCcFKTMQMefPonVM0Yh4drFdAWJ/kBvfaBDNzTp86r4S/xfB/H120Og2qnthAMSo/0CV9O7FNxVowG6jX0PqaYQWDUOlcswy9SOQUVxloaVUVNwYttqccqmv9AJ4Qatn0Tzfq/BLhE1MtbuMQCTzWlLjscnAztB0yiBzLFOBiZxVGsSgYghk8R5l65+ZkIlZssP+HH+u+CU6p/NIO5o03M4anTqoxdeZzU4w7m9P2PlrHHpoKXLDFnByIU/IUUJhJKSiE/HPAvrrStQRYF2BuFpC8qyGTWad0LDjs8iqOI9QkeTuSZMOfF1o/mMnZlEsN6WFI+fF07Dqf1boNpSMh7HGNq98AZqt34cZDo7Cx6PAZi6cxB9lo3tgesXYpwltCDE3dXvRbtRsxAUFABNIlGdsQVIxEGSsHhsd8Sfj8nx+CMPkiWkJAZERYu6qMxDeJmYhK1Rb+HwlpXpvKK365JRolJNdH/nU3D6zsL/4simH3RN2fBO6SYQh2QKRsRLE1G1UXPYJeqQo4tdJ95zWoEjk52Bq2k49dvP+HVZFG5duwDI/ug8+HVUaNwWnJxBmdo2eAzAZGfaVAWW66cxd3gXsXjySKU7BSQzOr82DxVr3wtNaJIGhxu1x8nXLuObN/shKT4uRztX6D+QMGpBNGz+JW/nX8Zg4XbM6NEK0JJdDgI6458YPB7lHuqMxIunsXrqUNyIpS4FGYOgtMsWtOszFrXadxHKXn46BcmqjFSZyn5S4K9qYJKERO4Pk5x1FqrHAEwcQGk9MrMjqn972JMTMmmvDB36v4KqrZ8VqkoGJ1C7A4ZjG77F5i+mCSUlxyHEJFCtaQTaD3/nNuKTCEyK2Y8vyGQztpnjeRb/IHQc+T7urtcIR9YuxfalH8CeqUeGWZHR8NF+eLD7YKRx0rBpPnkvjdWYHZKmQNYk2CX6pX6MZFck4DkAi1Xo1Q47v5iJA+uXupBXdJgpUw49Z6+FQk1KHFSnswsmHFn6Pnas/dpFtItgAxWVO9RZhyQEULJCFTz37hKoiu4CTHc1cI7lr/dF3OnfDQ+U4ShhEspVq4vI1+ZBliVETx+DU4dJW884x+l9QWWrod/kz6CZ/I3N46xX57z3nD/V5yNSFXPer56YkxWzbS1+/ORtEWTIGMR6MkZ8+gs0U4ALB6clJuKLMU/DevPabc7+RyK7YdMPXwoykYRwiHyzfxA6DH4Xle5v5mLaKPZkLBjeBUnxVzOJZ4aKDVvh0ZHvgaWl4MNBEeCZHBqklfd9Kwp+4fUhFTDilNet4FkcbKzq+vmTWDdtFOKvXnSxhgike9t3R/PeozNYjgG2iycQNaYn4CIuJZgsgej538/w2Wu9RaBAE10EMjzDrXuMQt2I5wWfEJNTA9TjW9Zg66fv6c3InLhTkmR0fTMKpe9pCH79PD4a9qSwe50nGFKmAiLHfYgSYeXcKh3JK6gunO6JHEx0XfH2QFz5c5+Lo57YMLTU3eg1+1tRAC14kilYM3koTh3a7kIfcixUbdgMrQdNwd6VC7F/zWe3nalV6jZBxNg5YIru1dJUjoPLZ2PnqiVCNJK9qXM9B5MtGPrlFnBNwbHNK7D5k8lCE3DWi+s0j0DLgZMgS/TL3IKb7sCZhU7okQBzCftXLsTO5R8ZXJKxMP+AEHQcPQ3lazUUhLdwDdN7PQKoKS6rVyQZ90U8ixY9RuPqn/ux5D+DDA53BB/I6rFg2Px1sPuFCICtCTewavIQxJ45oT9LGL+6X6lF9xdR7/EXhAm+bs5EnP5tvW7LOvFqvdZPokX/8UKJI8WvKIZHimix+9NuYV6/toBT8EG0ypY5mnYZgsZP9BE+31O7f8a62eOcFBqdrIqs4NFXZ6FincaiReCq90fixoVTrmIXDJ1eeh13N+8sMiysl09h/uhuGaKe2jqRY0G2oPf0pQguEy66aX49cSDiT+7XnQ5OANdt8zRavDBOOC18AOewvWlX2pkda94ajvPH9winAjMafZFWXLNJW7Qe/BYURca6Dybir50bbnsaRWEGfrIBnHy+KsfWhZNxbPNKaE7eKwLVFFgcLy7YABUKdi2Zgf1rF2cK7plRtnptRIyZAf+gYoJnv39vFC4doSOBRHiGwVanTVe07jceqkTeqqLgXw/NyRIAyzKsfx/G5+P7gDy6eqNSY0hm9PtgFRSzgrVTR+HSX78LBcl51Gz+GNoMmkheftEW8bfvP8e+FR+6fE+XwDIGzVsJv9DSmNWDQoOJ6Y/R3ZMymnbuiQeeGZJ+rm5bNAtHNpAZ5wpwvVaP45H+E/U2hL4zOPsdTkBK3IT4a2fx/cR+SEy45uLmI/XnyTFTAEsQVk4dCdVK8Vcng4oxDIxaBzm4DCSRg8VguxWHjwdH6DFVJwjJJ3ZfZF/UuL+piEeTCHYeismMVoPeQo2mbdP/+eofu7H8HR1wZzu4aoMH0XbIVJgCyLYumn78HnkGC0qSoqJZsf3TyTiyabWLKFSoH0XxcLR7qgtWL5ye7uQnrpEgI6RsOJ6f/qVwSRIXkvglvXb+kA6wxl/VH+7k9KjZpCWsdoa/9212tX3BEFCsJPrNXgVu1juui6kl3cKHA1obWR4Z20ExB+CpNxeidKXKYIb/+U4Las8FWPjsOXavWIDd33/i4lIUZJbMCC1RAjeuxbqkxBDE7fqMQPX2z2XwqciOVJB0cg++eGOgoftmOD2CQ0tA1TSk3Ix3SbGhDVOmekN0+88nerajMbjNivmDI2FNjssUtZQQ0WcYKrXvDSWTJLhTQHs0wMROiZdP48vxPWBLo86MGSaOw7/rGhZnMFsC0H7oO6h8f3MXgMUlJhLDvD6PgFuTDD+3qzjOnEZAaa99Ji+GX4V7XJQm0px3LpqOAz8uc9l41DkXioKe73+J4LLhdwpT1+PII+1g51OSA1EDH4WaFKvHXHMY5CosV6U2Hhs3D6bAwEzf1P26OxfPxIFoEt85PYg+Y4AlEEM+o/ZPVkM6O8IPEg7/9B22fT4FoM8yjfL31EPXNz+CRsF5TUk3mfLSVYgkjUz9NmTqUUTDBNmWAgqDGx2lPTPpLltyc+DvLd8hesHkHAP5QmpLEirf3xqPjngXXMo6gnNiyypsnP9f41lZwazzMf3/4WcGovbjg2BhNiOHS5+luPlEVfHNhF6IPWs4RVz5Cg06dEOzPmP009/Q8PNywRfTNCTeTEDiuWNIunoRwaGhUCrURWjpMJGi68jgdLzOs0W0cVoqqg2z+7QERKug7Af597u+sQCla9bP1kiJPfMn1k8bjcS42GyS+HQXJZfNeHT0dITXbypOU2e/FMFPyaun9m7C6pljson3SmjQsgPu6/wigkqVF5svLwDLqfH4ZvoEXD2+DxqtV1JQokIVdBr6NoIrVNf9AU6T8XCA9aaLClSsmjIap47+Cq6SDzproCXJDy8t2SpsV+e8pcxb4ttJA3DlxIHs1SAGlA+vg/ajZyCQkvMyWbXC8DKYP3re2zi7cxVsQv7engIkWwLQfcQbKNWwDazMDFhTYZJ17Z60fLLuVR4E8JvYuWQODv+0DKr99ph2/XbPoHnfV43N5oE5WdmLaAYbl3DxtzVYN2+i6FabFSHp9w907IYmvV5xpLln/UjOsWPZxziw+tNsOE+vMrinUUd0Gvm2cLLkNJKunMcPU8ci/tJJ8CxSdR1pr4qlGBp2eAJlwmtBYybYNf0iEonbcOHYHhz6ZSNUNRE8m9qp+q2eQIv+r0NlojQvfUoezsFEa00UesWdOIAfZ45DQsI1p+xFV9I/P2UJipWrDUnUkGStRtH5aU9MQNTgjtBc4s3pp5r4bcdhU1CtaeuskjddXyrLuB5zGF9R2Y09u2xOfZOkA0MpRyJ3iO6Hoo68jrKW7POp723zDFr0e1W3JLxHRBNZdE8UnT2r3huBc0d3uTg99LWaULJ8OCInzEVgSAlDE8qG70TzcTM+G9YJyXFXjI1AhNa/T8KTurWOWrIN1Dsut7sDxT6igjdFxsw+D0OzpkHRVIjsZkrLzRQzzlEcGMk9VJ6iSykucrJMsowBH0aDBZcwrkPIeIrHc3A6XzFg86czcHTjV1koRzIejHwOjZ4dJgITOQ5xnZ4ZcQd/woopo42QX4YFTIBWatgaT7w8GXQzW27DUYdMvzt77CD2fvsRzh3bLzakHk7MbF3n9kS9rlmsQpJRrub9eGr0ZMA/SE9YEGmzXiSiHeSgJVmvx2L+sMjbRLQim9D8hddR55HHcqeeuGFNxY3LZ7FsQj9oKTeNc9bhu5TQZ9rXCA6rYlwzkLPx7Vr5z5GcEI/zezbi5yUfAdZb6QkLuU/MiStpk0p+eOylsShTrzlCQovDKpRnqoDQ7xdO3/ie7ujIWAiJaQ1LJg5CytmDSLXrQQNZ1q+WeWHqUlhlqv3NxRsiPqZLQFTs/HIGDkQvNxpo6+fnXVXqo+vYqUBwCRHBcneYVCvmTxgCfu0krClJsGn6NUJObnDxaOJv8p8Lj5wsweIfiGqN2qFlr+HC0eJIvEtPCsxksnmNiCZikEYrJ8dh44JpOHlghzBeqtVvhCZPD0Jwuaq5F6dlQuvG+dP4Y+PXOLbjF9htNlRr0AS123ZBWM1GYLIeosxDUXKWe0DcoyBrsN+8jsO/rEPajVhYb8Xh7MkTuBV3FYzypZmE0LvKo3zlcJGMby5RFg+07yo6EqiyCchSCXR9nVcBTOomORytqUm4folqhhhKli0HS2CQYaLkfmY6k0cws2pH7JnTokS0dPm7YQoIMe4sdoCbv2dmPF9X3DgpTEwFXQ5mt6YhPu6a4GjybtH7/YNCEFIiFCaLv97uUeiU9BnVSececvQygJ0ZyuEXLmBo3ZDoDj9xBpy69l6Q4TgsdPPIWci6PjXDkZLxvby+3bsALgi1vfS3PoC9FFiv06K9HCe3l+fjYLdJ5xk/9AHsGTi5PUsfwG6TzjN+6APYM3Bye5Y+gN0mnWf88B8DWFTnaRLOHt4ksjGET1VS0HPacoTepd+blJckNM8g8z80S1HiA3z8/MMAUoUXrErjtogY+Z5b1Y35vDeJPG4yzhzdilV0b5KmimTwntO+QfGwiiKbojDa/P5DpP1XvFZ4y5mKj59vDpWi1xpH1Qc7ImL420UAsPDTKfj70DasmzpKVAkypqD3jBUILl1OxDx9ABdwn4hcbxvmdn9ItFum5IIqjTug04h3cu3Mm9Wb88XBdDaoTMKlPw9gzdRRsBm9I3tN+giB1ZtAFolzuTvTC0gCr/65OAYTr2DuixF6RyKmoV7HvmjZc7BbfvR8ASwykKgyIe4S1s8cjSunTwixXOuhCLQb/LbROTbv3We8Gim3F8dwJHoptiyeLjiWmPiJcXNRvl4Tt8Ik+QKYdhc1s6YXb5g9Gid2b9GzGCUzRn6xDfYcOta5vd7/sx+SlPzunaG4cGyXnmgIGSO++hU21Zxt0mFOJMoXwLqarEuKX5fMxu/rF8OmUfWBCV1enY4ydZuJxELfyD8FqGmcrJqRcP0M1k95GbEX/haJ+MXKV8ezU5YY3Jt/4uYfYGPuaVfPY8GorqJJGTVHqXhvM0S+Ml2YTb6RfwoQs1L7/3PbVmBj1Duwqqpglh4T5iK4VjORieKcO53XN7gNMImOBUMjkXr9vGBpi18g2g59C+ENqXusb+SXAuRfsDMbFg17Ckk3qNWUDCUoGH1nrRQ5XdnlhOf2HvcBZjLSLp3EwleeF0XdlHtco0krdBw1FXYqGczUYDO3ify/f075Yn98vwibls3Vj0FJQtMuA/DAk31hF9TNf6ou0dRtgElcqCrHjkWTcfDn742OqRJqPvIk2g0YDwk2UYXvG3mjwPFfo/FLFHUCpCaOgH/p8nh6wjwElCqv9zMRx28u2aVZvMptgKlXpAIbzv5xCNEzX0Fqyk0hReiupJa9X0aNtl0hi1k5/sv/5PJGGk/71u2cGHc2ButnvoYbV88YJVoSmjw1EA90exHMrldDOPpQ53e1bgPs0KgpI/L3tUuwbdlHoi6IMgdD6FKoJwbg3rZPGNfpZF9XlN8Je/r3KRNT9NLTfRg4//se/PbNB7jy13HdQJGA2s06otXACdBki1uKlTONCgaw40lMwZHv5mHbd5+L+leqlZMs/qjZIhJt+o5GGjNBztSi19OBcnv+xs1rElRc3LcVPy58FykJcaIBG0UWwmvdjw7D3gEPKQ8zTzUqMdx+m/tnsPMrKSFcS03C9sXTcHTranDRIFQvyKhYtxEe6jkCwXdVgmy2CE+Ys61cVP0f3SeRe790NWl05wGtVeUa0q5ewJENy7Fvw7dg3Cq61JNTI6RMRXQZPxN+pSpQNnWeymxym13hcLDwmXLwxETsWTkf+9Z9bTQnM24sYRLqtIxEySr3on7L9tBMFmhcNorKsr4qJ7eJ/9s/pwoHyahCpA1v1lJxfN9OxJ44hL/3btIvBhH3JIpLfBB+b2O06/8qLGUqgYuuuIUzCgVg0d+Cpkr1VVYV+zeswK5ls6FqNr3JiNCvNMgmM4KKlQBXAlCyQiWUrXUfSoVVhp+/f+Gs5l/0FKorvnb5PGL/jsG5E4cg2VKQcusGrGkpusUBBQqjTgAM5arXR+SYyeDBYbDwZKMbbuEsplAAVpkm2tXTjWEEJN2DcOvsH4heMA3Xz52EmnYLzBDbVMrBmHHVHYXGCu++qcKhSCE9hRqXOvRlAlQvedPL0oT4Zgyh5Svh4a79Ed6kveg2JJqk5t8bmeOMCwXg7N5gT03BuQNbcWrfNvy5azM0lRwiVHDmfBdRIa+okAAqjMe4VA8KcUxSjqFslbqo1bwjKtzbGIFhFSFrdE1BYbzx9mfcUYDpLiGC0m63Q0mOR8yuX7DhyyjAlixsBPpcREy80EQmYUZcqSdA0NUFQWjQqhOaPdkd8AsF/EL0YnIh/dwK9eZpR9xRgB33AYlF0v/ELtZgYSrSkm7ixtXLSIu/Aa0QlYo8rboIvkR1w0pwKIqXLIPg4iVhE24hWTTzowPKBPIZUHIEKaIUN7ozu/yOAlwEdPS9IhcK+AD28i3iA9gHsJdTwMuX5+P5KvJuAAAAMklEQVRgH8BeTgEvX56Pg30AezkFvHx5Pg72AezlFPDy5fk42Aewl1PAy5fn42AvB/h/rHNnEPC/lgUAAAAASUVORK5CYII='
waschen_base64 = b'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'
essen_base64 = b'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'
getränk_base64 = b'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'
tv_base64 = b'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'
 
 
layout = [
    [sg.Text('  ')],
    [sg.Text('Willkommen im PflegeRuf des Krankenhauses Niederrhein!', size=(800,1), font=('Calibri',19), justification='center')],
    [sg.Image('hospitalLogo.png', size=(800,100))],
    [sg.Text('Wählen Sie eine der folgenden Optionen aus:', size=(800,1), font=('Calibri',17), justification='center')],
    [sg.Text(' ', size=(800,2))],
    [sg.Text(' ', size=(19,1)), sg.Button('Pflegepersonal rufen',  size=(17,2), font=('Calibri',13)), sg.Text('    '), sg.Button('Puls messen', size=(17,2), font=('Calibri',13))],
    [sg.Text('  ')],
    [sg.Text(' ', size=(36,1)), sg.Button('TicTacToe spielen', size=(17,2), font=('Calibri',13))]
]
 
window = sg.Window('PflegeRuf - Krankenhaus Niederrhein - Menü', layout, size=(800,480))
 
 
 
def pflegeruf_window():
    pflegeruf_layout = [
        [sg.Button('Menü', size=(6,1), font=('Calibri', 11))],
        [sg.Text('Bitte wählen Sie Ihr Anliegen aus, indem Sie auf das entsprechende Feld klicken!', size=(800,1), font=('Calibri',14), justification='center')],
        [sg.Text(' ', size=(800,2))],
        [sg.Text(' ', size=(5,1)), sg.Button('', image_data=schmerzen_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='Schmerzen'), sg.Text(' ', size=(5,1)), sg.Button('', image_data=medikamente_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='Medikamente'), sg.Text(' ', size=(5,1)), sg.Button('', image_data=wc_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='WC'), sg.Text(' ', size=(5,1)), sg.Button('', image_data=waschen_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='Waschen'), sg.Text(' ', size=(5,1))],
        [sg.Text(' ', size=(800,1))],
        [sg.Text(' ', size=(18,1)), sg.Button('', image_data=essen_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='Essen'), sg.Text(' ', size=(5,1)), sg.Button('', image_data=getränk_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='Getränk'), sg.Text(' ', size=(5,1)), sg.Button('', image_data=tv_base64, button_color=(sg.theme_background_color(),sg.theme_background_color()),border_width=0, key='TV'), sg.Text(' ', size=(5,1))],
    ]
 
    pflegeruf_window = sg.Window('PflegeRuf - Krankenhaus Niederrhein - Pflegepersonal rufen', pflegeruf_layout, size=(800,480))
 
    while True:
        event, values = pflegeruf_window.read()
        if event == sg.WIN_CLOSED:
            break
        elif event == 'Schmerzen':
           subject = 'PflegeRuf aus Zimmer 014'
           body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: Schmerzen!'
 
           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())
           sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: Schmerzen. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
 
        elif event == 'Medikamente':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: Medikamente!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: Medikamente. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'WC':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: WC!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: WC. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'Waschen':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: Waschen!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: Waschen. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'Essen':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: Essen!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: Essen. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'Getränk':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: Getränk!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: Getränk. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'TV':
            subject = 'PflegeRuf aus Zimmer 014'
            body = 'Aus dem Zimmer 014 wurde der PflegeRuf betätigt, mit folgendem Anliegen: TV!'
 
            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())
            sg.popup_timed('Sie haben den PflegeRuf betätigt, mit folgendem Anliegen: TV. In Kürze wird sich das Pflegepersonal um Sie kümmern!', auto_close_duration=4)
 
        elif event == 'Menü':
            break
 
    pflegeruf_window.close()
 
 
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    elif event == 'Pflegepersonal rufen':
        pflegeruf_window()
 
    elif event == 'Puls messen':
        cmd = 'python3 pulse_v3.py'
        p = subprocess.Popen(cmd, shell=True)
 
    elif event == 'Kalender':
        print('hallo')
 
    elif event == 'TicTacToe spielen':
        cmd = 'python3 sign_up_window.py'
        p = subprocess.Popen(cmd, shell=True)
 
window.close()>

Puls messen

pulse_v3.py
<#!/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()
 
>

Spiel spielen (TicTacToe)

Nebenbei haben wir ein Spiel hinzugefügt auf PysimpleGui, was über Touch einfach zu spielen ist. Der Quellcode wurde komplett aus dem Tutorial entnommen: https://www.youtube.com/watch?v=q7Q1EQ1dZdM

<#!/usr/bin/python3
import PySimpleGUI as sg
import game_window
import subprocess
import lcddriver
from time import*
 
lcd = lcddriver.lcd()
lcd.lcd_clear()
 
layout = [
            [sg.Text("Geben Sie den Namen des ersten Benutzers an!"), sg.Input(key='-FIRST_PLAYER-', do_not_clear=True, size=(20, 1))],
            [sg.Text(" ", size=(400,1))],
            [sg.Text("Geben Sie den Namen des zweiten Benutzers an!"), sg.Input(key='-SECOND_PLAYER-', do_not_clear=True, size=(20, 1))],
            [sg.Text(" ", size=(400,2))],
            [sg.Button('Spiel starten'), sg.Text(" "), sg.Exit()]
        ]
 
 
window = sg.Window('Tic Tac Toe', layout, size=(400,260))
 
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Exit'):
        lcd.lcd_clear()
        break
 
    elif event == 'Spiel starten':
        players = [values['-FIRST_PLAYER-'], values['-SECOND_PLAYER-']]
        game_window.initiate_game(players)
 
 
window.close()
 
>
game_window.py
<#!/usr/bin/python3
import PySimpleGUI as sg
import lcddriver
from time import*
 
lcd = lcddriver.lcd()
lcd.lcd_clear()
 
 
sg.theme('DarkBrown5')
 
def check_if_winner(board):   
    for column in range(0, 3):
        print(board)
        if ((0,column) in board.keys()) and ((1, column) in board.keys()) and ((2, column) in board.keys()):
            if board[(0, column)] == board[(1, column)] == board[(2, column)]:
                return board[(0, column)]
 
    for row in range(0, 3):
        if ((row, 0) in board.keys()) and ((row, 1) in board.keys()) and ((row, 2) in board.keys()):
            if board[(row, 0)] == board[(row, 1)] == board[(row, 2)]:
                return board[(row, 0)]
 
    if ((0,0) in board.keys()) and ((1,1) in board.keys()) and ((2,2) in board.keys()):
        if board[(0,0)] == board[(1,1)] == board[(2,2)]:
            return board[(1,1)]
 
    if ((2,0) in board.keys()) and ((1,1) in board.keys()) and ((0,2) in board.keys()):
        if board[(2,0)] == board[(1,1)] == board[(0,2)]:
            return board[(2, 0)]        
 
def initiate_game(players):
    board, player = {}, 0
 
    layout = [[sg.Text('Current Player: ' + players[player], key='-CURRENT_PLAYER-')]]
    for row in range(3):
        new_row = []
        for column in range(3):
            new_row.append(sg.Button(size=(3, 2), key=(row, column)))
        layout.append(new_row)
    layout.append([sg.Button('Nochmal'), sg.Button('Cancel')])
 
    window = sg.Window('TicTacToe', layout, size=(400,240), use_default_focus=False)
    while True:
        event, values = window.read()
        if event == sg.WIN_CLOSED or event == 'Cancel':
            break
 
        if event == 'Reset':
            board = {}
            for row in range(3):
                for col in range(3):
                    window[(row, col)].update('')
 
        elif event not in board:
            board[event] = player
            window[event].update('X' if player else '0')
            is_winner = check_if_winner(board)
            if is_winner is not None:
                sg.popup("Der Gewinner ist "+ players[player])
                lcd.lcd_display_string("Gewinner: "+ players[player], 1)
                lcd.lcd_display_string("Glückwunsch!", 2)
                break
            player = (player + 1) % 2
            window['-CURRENT_PLAYER-'].update('Current player: ' + players[player])
 
    window.close()
 
>

LCD-Display

Der Quellcode für den kleinen LCD-Display wurde aus den Vorlesungsskripten entnommen.

Schaltplan

Auf dem Schaltplan (linke Seite) fehlt die Kamera. Deswegen ist auf der rechten Seite extra der Anschluss der Kamera am Raspberry Pi 4 B zu sehen.