Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| ekg-to-go [2017/07/10 20:09] – student | ekg-to-go [2023/07/03 10:15] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ===== EKG-to-go ===== | ||
| + | |||
| + | Unser EKG-to-go ist ein kleines EKG-Gerät für Zuhause, welches einem ermöglicht zu jeder Zeit eine Ableitung der {{ : | ||
| + | Herzfrequenz zu kontrollieren. Da das EKG mit einem Akku versehen ist, ist es zusätzlich auch unterwegs einsatzbereit. | ||
| + | Die Elektroden werden je nach gewünschter Ableitung unterschiedlich am Körper des Patienten angelegt. | ||
| + | |||
| + | |||
| + | |||
| + | **Aufbau:** | ||
| + | Das EKG-Gerät zieht seinen Strom aus dem Akku. Dieser versorgt das Raspberry und den [[lcd_display|LCD - Touch - Display]] jeweils mit Strom. | ||
| + | Um die Ableitung darstellen zu können, wird ein EKG-Chip benötigt, welcher zusätzlich mit den Elektroden verbunden ist. | ||
| + | Dieser EKG-Chip besitzt ein analoges Signal. Dieses Signal kann der Raspberry jedoch nicht einlesen, aufgrund dessen wurde | ||
| + | das Raspberry mit einem [[ad-wandler|Analog - Digital - Wandler]] versehen, der dieses Signal wiederum digitalisieren kann. Die Messwerte werden daraufhin | ||
| + | auf den [[lcd_display|LCD - Touch - Display]] geleitet, wo diese dann als Kurve graphisch dargestellt werden. | ||
| + | |||
| + | {{ : | ||
| + | **Bauteile: | ||
| + | unten links: Akku, oben: LCD-Bildschirm, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | **Code-Ausschnitte: | ||
| + | Besteht aus drei Teilen: | ||
| + | * AD-Wandlung | ||
| + | * Graphische Oberfläche | ||
| + | * Wertezeichnung (Kurve) = Dauerschleife | ||
| + | |||
| + | Import von ,, | ||
| + | Python als Programmiersprache | ||
| + | <file python Bibliotheken.py> | ||
| + | #----> Import | ||
| + | from tkinter import * | ||
| + | import random | ||
| + | import time | ||
| + | import RPi.GPIO as GPIO | ||
| + | import numpy as np | ||
| + | import sys | ||
| + | if sys.hexversion > 0x02ffffff: | ||
| + | import tkinter as tk | ||
| + | else: | ||
| + | import Tkinter as tk | ||
| + | </ | ||
| + | <file python Analogwerte am ADChannel auslesen.py> | ||
| + | def getAnalogData(adCh, | ||
| + | GPIO.output(CSPin, | ||
| + | GPIO.output(CSPin, | ||
| + | GPIO.output(CLKPin, | ||
| + | | ||
| + | cmd = adCh | ||
| + | cmd |= 0b00011000 # Kommando zum Abruf der Analogwerte des Datenkanals adCh | ||
| + | # Bitfolge senden | ||
| + | for i in range(5): | ||
| + | if (cmd & 0x10): | ||
| + | GPIO.output(DINPin, | ||
| + | else: | ||
| + | GPIO.output(DINPin, | ||
| + | # Clocksignal negative Flanke erzeugen | ||
| + | GPIO.output(CLKPin, | ||
| + | GPIO.output(CLKPin, | ||
| + | cmd <<= 1 # Bitfolge eine Position nach links verschieben | ||
| + | # Datenabruf | ||
| + | adchvalue = 0 # Wert auf 0 zurücksetzen | ||
| + | for i in range(13): #12 Bit Auflösung vom Wandler + 0 Bit | ||
| + | GPIO.output(CLKPin, | ||
| + | GPIO.output(CLKPin, | ||
| + | adchvalue <<= 1 # 1 Postition nach links schieben | ||
| + | if(GPIO.input(DOUTPin)): | ||
| + | adchvalue |= 0x01 | ||
| + | adchvalue = adchvalue * 0.0008 | ||
| + | | ||
| + | |||
| + | # | ||
| + | CLK = 18 # Clock | ||
| + | DIN = 24 # Digital in | ||
| + | DOUT = 23 # Digital out | ||
| + | CS = 25 # Chip-Select | ||
| + | |||
| + | # | ||
| + | GPIO.setup(CLK, | ||
| + | GPIO.setup(DIN, | ||
| + | GPIO.setup(DOUT, | ||
| + | GPIO.setup(CS, | ||
| + | |||
| + | #----> Funktion: Beendet Programm | ||
| + | def callback1(): | ||
| + | sys.exit(0) | ||
| + | </ | ||
| + | <file python Wertedarstellung.py> | ||
| + | def append_values(self, | ||
| + | self.Line1.append(float(x)) | ||
| + | self.Line1 = self.Line1[-1 * self.npoints: | ||
| + | return | ||
| + | def replot(self): | ||
| + | | ||
| + | aufloesung = 1600 # Höhe Y-Achse - ((Auflösung-ADC /2)*Faktor) = 0 | ||
| + | h = self.winfo_height() | ||
| + | max_X = max(self.Line1) + 1e-5 | ||
| + | coordsX | ||
| + | for n in range(0, self.npoints): | ||
| + | x = (800 * n) / self.npoints # 800 ist die breite | ||
| + | coordsX.append(x) | ||
| + | coordsX.append(200-(self.Line1[n]*aufloesung)) | ||
| + | self.canvas.coords(' | ||
| + | |||
| + | def read(self): | ||
| + | self.after(1, | ||
| + | self.after_idle(self.replot) | ||
| + | self.after(20, | ||
| + | def ReadADC(self): | ||
| + | x = getAnalogData(1, | ||
| + | self.append_values(x) | ||
| + | |||
| + | root = tk.Tk() | ||
| + | w, h = root.winfo_screenwidth(), | ||
| + | root.overrideredirect(1) | ||
| + | root.geometry(" | ||
| + | app = App(root) | ||
| + | app.mainloop() | ||
| + | </ | ||