===== 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 {{ :ekg-box.png?nolink&200|}} 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. {{ :schaltung.jpg?nolink&400 |}} **Bauteile:** unten links: Akku, oben: LCD-Bildschirm, mitte: Raspberry Pi, rechts daneben: Breadboard mit Ad-Wandler, ganz rechts: Breakout-Board mit EKG-Chip + Elektrodenkabel {{:fitzing_schaltung.png?nolink&400|}} Fitzing-Schaltung **Code-Ausschnitte:** Besteht aus drei Teilen: * AD-Wandlung * Graphische Oberfläche * Wertezeichnung (Kurve) = Dauerschleife Import von ,,tkinter“ Bibliothek erforderlich Python als Programmiersprache #----> 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 def getAnalogData(adCh, CLKPin, DINPin, DOUTPin, CSPin): GPIO.output(CSPin, HIGH) GPIO.output(CSPin, LOW) GPIO.output(CLKPin, LOW) 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, HIGH) else: GPIO.output(DINPin, LOW) # Clocksignal negative Flanke erzeugen GPIO.output(CLKPin, HIGH) GPIO.output(CLKPin, LOW) 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, HIGH) GPIO.output(CLKPin, LOW) adchvalue <<= 1 # 1 Postition nach links schieben if(GPIO.input(DOUTPin)): adchvalue |= 0x01 adchvalue = adchvalue * 0.0008 #----> Konfiguration Eingangskanal und GPIOs CLK = 18 # Clock DIN = 24 # Digital in DOUT = 23 # Digital out CS = 25 # Chip-Select #----> Pin-Programmierung GPIO.setup(CLK, GPIO.OUT) # CLK-Signal = Output vom Raspberry GPIO.setup(DIN, GPIO.OUT) # Digital Input ADC = Output vom Raspberry GPIO.setup(DOUT, GPIO.IN) # Digital Output ADC = Input vom Raspberry GPIO.setup(CS, GPIO.OUT) # Chip-Select = Output vom Raspberry #----> Funktion: Beendet Programm def callback1(): sys.exit(0) def append_values(self, x): 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)) # 250 pixel (y-achse) - (messwert in v) * auflösunsfaktor self.canvas.coords('X', *coordsX) def read(self): self.after(1, self.ReadADC) self.after_idle(self.replot) self.after(20, self.read) # zeitabstand zwischen ad wandlung 20 def ReadADC(self): x = getAnalogData(1,CLK,DIN,DOUT,CS) self.append_values(x) root = tk.Tk() w, h = root.winfo_screenwidth(), root.winfo_screenheight() root.overrideredirect(1) root.geometry("%dx%d+0+0" % (w, h-20)) app = App(root) app.mainloop()