Mein Blog    Projekte    Archiv    Impressum

EKGUI 2 - Dynamische Anzeige

Das aufnehmen und anzeigen eines EKGs funktioniert bereits. Der nächste Schritt ist es jetzt die Kurve in Echtzeit anzuzeigen.

Damit das ganze mit dem Auge angenehm zu verfolgen ist soll sich die Kurve bei der Echtzeitanzeige nicht bewegen, sondern kontinuierlich nach rechts erweitert werden. Ist dann ein Plot gefüllt, wird er durch einen neuen leeren Plot ersetzt der dann wieder von links nach rechts gefüllt wird.

Erste Version

Ein erstes Konzept sieht folgendermaßen aus:

#!/usr/bin/python3

import serial # python3 -m pip install pyserial
import numpy as np
import matplotlib.pyplot as plt

plt.ion()
fensterbreite = 1000

def plotter(testliste):
    # Das 3xN array in 3 1xN arrays aufteilen:
    testlistea = np.array(testliste)
    testliste1 = testlistea[:,0]
    testliste2 = testlistea[:,1]
    testliste3 = testlistea[:,2]
    x1 = t1 = np.arange(0.0, fensterbreite, 1.0)
    #print(x1)
    #print(testliste2)
    
    plt.figure(1)
    plt.subplot(311)
    plt.axis([0, fensterbreite, 0, 255])
    plt.plot(testliste1)
    plt.subplot(312)
    plt.axis([0, fensterbreite, 0, 255])
    plt.plot(testliste2)
    plt.subplot(313)
    plt.axis([0, fensterbreite, 0, 255])
    plt.plot(testliste3)
    plt.show()
    plt.pause(0.0001)

ser = serial.Serial('/dev/ttyUSB0' , 9600)  # Schnittstelle öffnen.
ser.flushInput()
ser.flushOutput()
print(ser.name)         # Kontrollieren welcher Port verwendet wurde.

# Auf korrekte Startposition warten:
dump = 0
while dump < 230:
    dump  = ser.read(1)[0]
    print(".")

# Testweise eine Liste mit korrekt angeordneten Unterlisten erstellen.
testliste = []
#for i in range(0, fensterbreite):
#    testliste.append( [0, 0, 0] )

for i in range(0, fensterbreite):
    test1 = []
    for j in range(0,4):
        test1.append(ser.read(1)[0])
    del test1[-1]
    testliste.append(test1)
    if  not(i % 10):
        plotter(testliste)
#print(testliste)

ser.close()             # Schnittstelle schließen.

Dieser Ansatz hat aber zwei deutliche Probleme:

  • Mit jedem Aktualisierung wird der Plot nicht um die hinzugekommenen Datenpunkte erweitert, sondern er wird komplett neu gezeichnet. Dies fällt insbesondere deshalb sehr deutlich auf, da pyplot, wie auch bei normalen Plots, für jeden neuen Plot eine neue Farbe verwendet. Dadurch sieht die kontinuierliche Aktualisierung sehr psychedelisch aus.
  • Der Plot reagiert nicht direkt, sondern teilweise deutlich verzögert, auf Ereignisse am Eingang des EKGs. Möglicherweise liegt das eventuellen Puffern der seriellen Schnittstelle (innerhalb des Linux Treibers, innerhalb von pyserial, oder anderswo). Das muss definitiv noch behoben werden, da es sehr beim Experimentieren stört.

Fortsetzung folgt…