Kurzbeschreibung

Der Hintergrund unseres Projekts ist ein medizinischer: eine Dekubitus-Prophylaxe. Das Sitzkissen basiert auf dem Prinzip einer Wechseldruckmatratze. Durch verschiedene Komponenten lässt sich der Druck im Kissen steuern. Mithilfe des Touch-Displays lässt sich im Voraus festlegen, ob der Druck manuell gesteuert werden soll oder durch ein integriertes Programm. Das Sitzkissen kann somit nach den Belieben des Anwenders gesteuert werden.


Aufbau

Das 7‘‘ LCD Touch-Display lässt sich über ein Desktop-Icon starten. Es öffnet sich eine grafische Oberfläche mit zwei Buttons mit den Beschriftungen „Zeitprogramm“ und „Manuell“. Nachdem sich der Anwender zwischen den zwei Optionen entschieden hat, erscheinen mehrere Buttons, die bedient werden können. Je nachdem für welche Option sich der Benutzer entschieden hat, lassen sich die Buttons unterschiedlich bedienen. Beispielsweise kann man bei der Auswahl „Manuell“ kein Zeitprogramm starten, sondern nur per manueller Steuerung die einzelnen Kammern füllen oder leeren. Welche Buttons sich wann bedienen lassen, wird durch das angehangene Fließdiagramm deutlich. Die Motoren (ONPIRA Luftpumpen, 12V) pumpen Luft in die jeweiligen Kammern rein bzw. saugen diese ab. Da die Motoren immer zeitgleich Luft pumpen und absaugen, müssen die Magnetventile (stromlos offen, 12V) die Luftzufuhr steuern. Über die Steckplatinen sind die H-Brücken angeschlossen. An den H-Brücken sind die Motoren und die Magnetventile verkabelt.


Bauteile

  • 3x H-Brücke

  • 2x ONPIRA Luftpumpe, 12V

  • 4x Magnetventile 12V, 0.4bar, offen

  • 1x DR. WINKLER Zwilling Sitzkissen mit 2 getrennten Luftkammern (43x43cm)

  • 2x Steckplatinen

  • 1x 7‘‘ LCD Touch-Display

  • 1x GPIO-Adapterkabel
  • 1x T-Cobbler für den Raspberry Pi

  • 1x ZIPPY FlightMax 2800mAh 30C

  • Kabel
  • Schläuche
  • Adapter für die Schläuche aufgrund unterschiedlicher Durchmesser

Schaltplan

Schläuche, Sitzkissen und Schlauchadapter sind auf dem Schaltplan nicht sichtbar


Quellcode

Zunächst haben wir alle benötigten Bibliotheken und GPIO's importiert.

Code.c
import RPi.GPIO as gpio                 #klassische Bibliothek um die Pins anzusteuern
import pygame_horstEdition as horst     #vereinfachte Pygame-Bibliothek
import time                             #Erlaubt Zugriff auf sleep() und Systemzeit
 
 
#region GPIO-Müll
gpio.setwarnings(False)
 
gpio.setmode(gpio.BOARD)  #GPIO-Belegung auf die des Shields stellen
gpio.setup(12, gpio.OUT)  #GPIOs als Ausgang deklarieren
gpio.setup(11, gpio.OUT)     #11 und 12 sind Ventile rechts
gpio.setup(13, gpio.OUT)
gpio.setup(15, gpio.OUT)
gpio.setup(29, gpio.OUT)
gpio.setup(21, gpio.OUT)     #21 und 22 sind Ventile links
gpio.setup(22, gpio.OUT)
gpio.setup(36, gpio.OUT)     #40 36 32 16  --> 40 & 36 und 32 & 16 Motor
gpio.setup(16, gpio.OUT)
gpio.setup(32, gpio.OUT)
gpio.setup(40, gpio.OUT)
 
#endregion

Danach haben wir uns um das Touch-Display gekümmert. Hier haben wir die Auflösung des Bildschirms festgelegt und alle Knöpfe, Icons und die dazugehörigen Texte angelegt.

Code.c
horst.start((1920,1080),(1,1,1))   #startet die Horstbibliothek mit einer Auflösung von 1920x1080 und mit Hintergrundfarbe RGB(1,1,1)
 
bildschenTitel = horst.Picture((217,55),("/home/pi/Desktop/ProjektAktuell/WaggelommaText.png"))   #Titel WaggelOmma
 
knoppekAutomatisch = horst.Knopp((138,300),(770,700),(0,145,0))        #Knopf "Automatisch"
bildschenAutomatisch = horst.Picture((225,426),("/home/pi/Desktop/ProjektAktuell/Audomatique.png"))    #Icon + Text
knoppekManuell = horst.Knopp((1026,300),(770,700),(0,145,0))            #Knopf "Manuell"
bildschenManuell = horst.Picture((1248,426),("/home/pi/Desktop/ProjektAktuell/Manuéla.png"))            #Icon + Text
 
Kammerli = horst.Rect((74,338),(557,122),(25,174,255))    #Feld für Kammer links
Kammerli.setVisible(False)                                #Feld zu Beginn unsichtbar
schriftKammerli = horst.Text((214,375),("Kammer links"),(255,255,255))  #Beschriftung des Feldes links
schriftKammerli.setVisible(False)      #Beschriftung zu Beginn unsichtbar
Kammerre= horst.Rect((1289,338),(557,122),(25,174,255))   #Feld für Kammer rechts
Kammerre.setVisible(False)    #Feld zu Beginn unsichtbar
schriftKammerre = horst.Text((1420,375),("Kammer rechts"),(255,255,255))  #Beschriftung des Feldes rechts
schriftKammerre.setVisible(False)  #Schrift zu Beginn unsichtbar
 
#region HorstElemente
knoppekStart = horst.Knopp((74,885),(374,140),(25,174,255))  #Start Knopf --> Kissen wird aufgeblasen
knoppekStart.setActive(False)  #Start Knopf zu Beginn inaktiv
knoppekStart.setVisible(False)  #Start Knopf zu Beginn nicht sichtbar
schriftStart = horst.Text((207,929),("Start"),(255,255,255))  #Beschriftung 
schriftStart.setVisible(False)  #Beschriftung zu Beginn nicht sichtbar
 
knoppekZeitprogramm = horst.Knopp((544,885),(374,140),(25,174,255))  #Zeitprogramm Knopf --> Zeitprogramm startet
knoppekZeitprogramm.setActive(False)  #Knopf zu Beginn inaktiv
knoppekZeitprogramm.setVisible(False)  #Knopf zu Beginn nicht sichtbar
schriftZeitprogramm = horst.Text((624,929),("Programm"),(255,255,255))  #Beschriftung
schriftZeitprogramm.setVisible(False)  #Schrift zu Beginn nicht sichtbar
 
knoppekPause = horst.Knopp((1019,885),(374,140),(25,174,255)) #Pause Knopf --> Zeitprogramm wird auf Pause gesetzt
knoppekPause.setActive(False)  #Knopf zu Beginn inaktiv
knoppekPause.setVisible(False)  #Knopf zu Beginn nicht sichtbar
schriftPause = horst.Text((1135,929),("Pause"),(255,255,255))  #Beschriftung
schriftPause.setVisible(False)  #Schrift zu Beginn nicht sichtbar
 
knoppekEnde = horst.Knopp((1482,885),(374,140),(25,174,255)) #Ende Knopf --> bricht alles ab
knoppekEnde.setActive(False)  #Knopf zu Beginn inaktiv
knoppekEnde.setVisible(False)  #Knopf zu Beginn nicht sichtbar
schriftEnde = horst.Text((1618,929),("Ende"),(255,255,255))  #Beschriftung
schriftEnde.setVisible(False)  #Schrift zu Beginn nicht sichtbar
 
knoppekDrucklihoch = horst.Knopp((74,495),(257,118),(25,174,255)) #Knopf erhöht den Druck re
knoppekDrucklihoch.setActive(False)  #Knopf zu Beginn inaktiv
knoppekDrucklihoch.setVisible(False)  #Knopf zu Beginn nicht sichtbar
bildschenDrucklihoch = horst.Picture((150,504),("/home/pi/Desktop/ProjektAktuell/PfeilHochKleener.png")) #Icon Pfeil hoch
bildschenDrucklihoch.setVisible(False)  #Icon zu Beginn nicht sichtbar
 
knoppekDrucklirunter = horst.Knopp((374,495),(257,118),(25,174,255)) #Knopf senkt den Druck re
knoppekDrucklirunter.setActive(False)  #Knopf zu Beginn inaktiv
knoppekDrucklirunter.setVisible(False)  #Knopf zu Beginn nicht sichtbar
bildschenDrucklirunter = horst.Picture((450,504),("/home/pi/Desktop/ProjektAktuell/PfeilRunterKleener.png"))  #Icon Pfeil runter
bildschenDrucklirunter.setVisible(False)  #Icon zu Beginn nicht sichtbar
 
knoppekDruckrehoch = horst.Knopp((1294,495),(257,118),(25,174,255)) #Knopf erhöht den Druck li
knoppekDruckrehoch.setActive(False)  #Knopf zu Beginn inaktiv
knoppekDruckrehoch.setVisible(False)  #Knopf zu Beginn nicht sichtbar
bildschenDruckrehoch = horst.Picture((1370,504),("/home/pi/Desktop/ProjektAktuell/PfeilHochKleener.png"))  #Icon Pfeil hoch
bildschenDruckrehoch.setVisible(False)  #Icon zu Beginn nicht sichtbar
 
knoppekDruckrerunter = horst.Knopp((1591,495),(257,118),(25,174,255)) #Knopf senkt den Druck li
knoppekDruckrerunter.setActive(False)  #Knopf zu Beginn inaktiv
knoppekDruckrerunter.setVisible(False)  #Knopf zu Beginn nicht sichtbar
bildschenDruckrerunter = horst.Picture((1665,504),("/home/pi/Desktop/ProjektAktuell/PfeilRunterKleener.png"))  #Icon Pfeil runter
bildschenDruckrerunter.setVisible(False)  #Icon zu Beginn nicht sichtbar
 
slider = horst.Slider((74,670),(1774,146),(1,1,1),(25,174,255),(0),(1)) #Slider wieviel Zeit übrig ist
slider.setVisible(False)  #Slider zu Beginn nicht sichtbar
 
#endregion
 
horst.refresh()  #Bildelemente werden neu geladen, damit sie endgültig verschwinden und das 'Verschwinden' auch wirksam ist

Nun werden alle benötigten Methoden deklariert. Dies haben wir gemacht, um später weniger Arbeit zu haben, da dann nur noch die einzelnen Methoden aufgerufen werden müssen und man sich unnötige Schreibarbeit spart.

Code.c
#region Hauptfunktionen
def ElBlaso(kammer):                #Methode: Der Kammer [kammer] wird Luft zugeführt, bzw. Ventile vom Blasen sind auf (stromlos offen) und Ventil vom Saugen zu
    #print("blaso "+str(kammer))     #zum debuggen, um in der Konsole zu sehen, was grade passiert
    if(kammer ==1):          #wir pusten in Kammer 1                            
        gpio.output(22, 1)   #ventil zu
        gpio.output(21, 0)   #ventil offen
    else:                    #wir pusten in Kammer 2
        gpio.output(12, 0)   #ventil offen
        gpio.output(11, 1)   #ventil zu
 
def ElSaugo(kammer):                #Methode: Der Kammer [kammer] wird Luft abgezogen, bzw. Ventile vom Saugen sind offen und vom Blasen zu
    #print("saugo "+str(kammer))    #zum debuggen, um in der Konsole zu sehen, was grade passiert
    if(kammer==1):           #Kammer 1 wird angesprochen
        gpio.output(22, 0)   #ventil offen
        gpio.output(21, 1)   #ventil zu
    else:                    #Kammer 2 wird angesprochen
        gpio.output(12, 1)   #ventil zu
        gpio.output(11, 0)   #ventil offen
 
def ElHalto(kammer):                #Methode: Die Ventile zu Kammer [kammer] halten die Luft, bzw. Ventile sind zu
    #print("halto "+str(kammer))  #zum debuggen, um in der Konsole zu sehen, was grade passiert
    #gpio.output(36, 0)   #Motoren aus
    if(kammer==1):          #Kammer 1 wird angesprochen
        gpio.output(22, 1)  #ventil zu
        gpio.output(21, 1)  #ventil zu
    else:                   #Kammer 2 wird angesprochen
        gpio.output(12, 1)  #ventil zu
        gpio.output(11, 1)  #ventil zu
 
def reicht():                           #Methode: Motor aus, ventile offen --> Luft geht raus        
    gpio.output(36, 0)   #Motoren aus
    gpio.output(11, 0)   #ventil offen
    gpio.output(22, 0)   #offen
    gpio.output(21, 0)   #offen
    gpio.output(12, 0)   #offen
    gpio.cleanup()      #räumt uff
 
def Motörchen(state):           #Methode: setzt die Motoren auf [state] --> 1 oder 0
    #print("Motor "+str(state))  #zum debuggen, um in der Konsole zu sehen, was grade passiert
    gpio.output(36, state)      #Motoren werden auf [state] gestellt --> 1 oder 0
 
def KritischeAbbruchfrage():        #Methode: Bricht ab wenn der Ende-Knoppek gedrückt wird
    if knoppekEnde.isPressed():     #Ist der Ende-Knoppek gedrückt?
        reicht()            #Motoren aus, Ventile auf
        exit()              #Programm wird beendet
 
def DruckVerstello(input):      #Methode: verstellt einen bestimmten Kammerdruck für 10 Sekunden, Definiert als 1: Links rein; 2: Links raus, 3: Rechts rein; 4: Rechts raus
    horst.keepAlive()       #verhindert, dass pygame-Bibliothek abstürtzt und sucht nach gerade gedrückten Knöpfen
    time.sleep(0.2)
    zeitpunkt = time.time()   #neue variable [zeitpunkt] wird mit der aktuellen zeit in sekunden seit 1970 belegt
    if(input ==1):    #wenn input = 1
       ElBlaso(1)     #Luft in linke kammer rein
       ElHalto(2)    #luft bleibt in rechter kammer drin
    if(input == 2):   #wenn input = 2
        ElSaugo(1)    #luft aus kammer links raus
        ElHalto(2)    #luft bleibt in kammer rechts drin
    if(input == 3):   #wenn input=3
        ElBlaso(2)    #luft in kammer rechts rein
        ElHalto(1)    #luft bleibt in kammer links drin
    if(input == 4):   #wenn input = 4
        ElSaugo(2)    #luft aus rechter kammer raus
        ElHalto(1)    #luft bleibt in kammer links drin
    Motörchen(1)  #motor wird angeschaltet
    while time.time()-zeitpunkt < 10:  #zeit - jetzigem zeitpunkt kleiner 10 --> while schleife läuft 10sek
        horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
        time.sleep(0.2)
        KritischeAbbruchfrage()   #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
        if (knoppekDruckrehoch.isPressed()or knoppekDruckrerunter.isPressed()or knoppekDrucklihoch.isPressed()or knoppekDrucklirunter.isPressed()):  #wenn irgendein Druckregulationsknopf gedrückt wird,...
            break #... dann brich ab --> 10sek werden nicht abgewartet, sondern bricht ab
    Motörchen(0) #motoren aus
 
def MannoProgram():     #manuelles Programm
    while 1:  #endlosschleife
            horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
            if knoppekDruckrehoch.isPressed(): #wenn Knopf rehoch gedrückt,...
                DruckVerstello(3)  #... dann luft rechts rein
            if knoppekDruckrerunter.isPressed():
                DruckVerstello(4)  #... dann luft rechts raus
            if knoppekDrucklihoch.isPressed():
                DruckVerstello(1)  #... dann luft links rein
            if knoppekDrucklirunter.isPressed():
                DruckVerstello(2)  #... dann luft links raus
            KritischeAbbruchfrage() #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
            if knoppekPause.isPressed():break  #wenn knopf pause gedrückt wird, break
            time.sleep(0.2)
 
def GroßKnoppeksWech():    #Methode: grüne Knöpfe weg
    knoppekAutomatisch.setActive(False)  #Knopf automatisch nicht aktiv
    knoppekAutomatisch.setVisible(False)  #knopf automatisch nicht sichtbar
    knoppekManuell.setActive(False)  #knopf manuell nicht aktiv
    knoppekManuell.setVisible(False)  #knopf manuell nicht sichtbar
    bildschenAutomatisch.setVisible(False)  #bild automatisch unsichtbar
    bildschenManuell.setVisible(False)  #bild manuell unsichtbar
 
def KleineKnoppeksHer():  #methode: kleine knöpfe sichtbar machen und aktivieren
    knoppekZeitprogramm.setActive(True)  #knopf zeitprogramm aktiv
    knoppekZeitprogramm.setVisible(True)  #knopf zeitprogramm sichtbar
    knoppekStart.setActive(True)  #knopf start aktiv
    knoppekStart.setVisible(True)  #knopf start sichtbar
    knoppekPause.setActive(True)  #knopf pause aktiv
    knoppekPause.setVisible(True)  #knopf pause sichtbar
    knoppekEnde.setActive(True)  #knopf ende aktiv
    knoppekEnde.setVisible(True)  #knopf ende sichtbar
    knoppekDrucklihoch.setActive(True)  #knopf drucklihoch aktiv
    knoppekDrucklihoch.setVisible(True)  #knopf drucklihoch sichtbar
    knoppekDrucklirunter.setActive(True)  #knopf drucklirunter aktiv
    knoppekDrucklirunter.setVisible(True)  #knopf drucklirunter sichtbar
    knoppekDruckrehoch.setActive(True)  #knopf druckrehoch aktiv
    knoppekDruckrehoch.setVisible(True)  #knopf druckrehoch sichtbar
    knoppekDruckrerunter.setActive(True)  #knopf druckrerunter aktiv
    knoppekDruckrerunter.setVisible(True)  #knopf druckrerunter sichtbar
    slider.setVisible(True)  #slider sichtbar
    Kammerli.setVisible(True)  #feld kammerli sichtbar
    Kammerre.setVisible(True)  #feld kammerre sichtbar
 
def bildschenWech():  #methode: bilder ausblenden
    bildschenDrucklihoch.setVisible(False)  #pfeil drucklihoch unsichtbar
    bildschenDrucklirunter.setVisible(False)  #pfeil drucklirunter unsichtbar
    bildschenDruckrehoch.setVisible(False)  #pfeil druckrehoch unsichtbar
    bildschenDruckrerunter.setVisible(False)  #pfeil druckrerunter unsichtbar
 
def bildschenHer():  #methode: bilder anzeigen
    bildschenDrucklihoch.setVisible(True)  #pfeil drucklihoch sichtbar
    bildschenDrucklirunter.setVisible(True)  #pfeil drucklirunter sichtbar
    bildschenDruckrehoch.setVisible(True)  #pfeil druckrehoch sichtbar
    bildschenDruckrerunter.setVisible(True)  #pfeil druckrerunter sichtbar
 
def textWech():  #methode: text unsichtbar machen
    schriftKammerli.setVisible(False)  #schrift kammerli unsichtbar
    schriftKammerre.setVisible(False)  #schrift kammerre unsichtbar
    schriftStart.setVisible(False)  #schrift start unsichtbar
    schriftZeitprogramm.setVisible(False)  #schrift zeitprogramm unsichtbar
    schriftPause.setVisible(False)  #schrift pause unsichtbar
    schriftEnde.setVisible(False)  #schrift ende unsichtbar
 
def textHer():  #methode: text sichtbar machen
    schriftKammerli.setVisible(True)  #schrift kammerli sichtbar
    schriftKammerre.setVisible(True)  #schrift kammerre sichtbar
    schriftStart.setVisible(True)  #schrift start sichtbar
    schriftZeitprogramm.setVisible(True)  #schrift zeitprogramm sichtbar
    schriftPause.setVisible(True)  #schrift pause sichtbar
    schriftEnde.setVisible(True)  #schrift ende sichtbar
 
#endregion

Jetzt folgen einige Schleifen, die verschiedene Methoden und Variablen aufrufen. Diese steuern dann die Funktionen und Sichtbarkeiten der einzelnen Knöpfe.

Code.c
while 1:
    horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
    time.sleep(0.2)
    if knoppekAutomatisch.isPressed():    #ZeitprogrammKnopf -> startet den Zeitprogrammmoddus
        #print("Automode selected")       #zum debuggen, um in der Konsole zu sehen, was grade passiert 
        GroßKnoppeksWech()    #Methode wird aufgerufen
        KleineKnoppeksHer()   #Methode wird aufgerufen
        bildschenHer()        #Methode wird aufgerufen
        textHer()             #Methode wird aufgerufen
        while 1:    #endlosschleife, die auf eine knoppek wartet
            horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
 
            if knoppekStart.isPressed():    #knoppek start wird gedrückt
                timenow = time.time()   #neue variable [timenow] wird mit der aktuellen zeit in sekunden seit 1970 belegt
                ElBlaso(1)       #luft in kammer links rein
                ElBlaso(2)     #luft in kammer rechts rein
                Motörchen(1)   #motoren an
 
                while time.time()-timenow < 150:  #zeit - jetzigem zeitpunkt kleiner 150 --> while schleife läuft 150sek
                    horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
                    time.sleep(0.2)
                    KritischeAbbruchfrage() #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
                ElHalto(1)    #luft bleibt in kammer links
                ElHalto(2)   #luft bleibt in kammer rechts
                Motörchen(0) #motoren aus
                knoppekStart.setActive(False)   #deaktiviert StartKnoppek
                knoppekZeitprogramm.setActive(True) #aktiviert Zeitprgrammknoppek
 
            KritischeAbbruchfrage() #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
 
            if knoppekZeitprogramm.isPressed(): #Zeitprogrammknopf gedrückt -> startet Zeitprogramm
                timenow = time.time() #legt aktuelle Zeit auf timenow
                while time.time()-timenow < 20:  #zeit - jetzigem zeitpunkt kleiner 20 --> while schleife läuft 20sek
                    zeitjeloofen = 0  #variable zeitjeloofen am anfang auf 0 gesetzt
                    horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
                    slider.newValue((time.time()-timenow)/20)  #berechnet balkenlänge, indem es den slider-wert auf (abgelaufenezeit:20) setzt
                    horst.refresh()  #aktualisiert die bildinhalte
                    if time.time()-timenow < 15: #zeit - jetzigem zeitpunkt kleiner 15 --> wenn wir innerhlab der 15sek sind, dann...
                        ElSaugo(2) #... luft aus kammer rechts raus
                        Motörchen(1) #motoren an
                    else: 
                        ElHalto(2)  #Methode elhalto für kammerre
                        Motörchen(0) #motoren aus
                    KritischeAbbruchfrage()  #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
                    if knoppekPause.isPressed(): #wenn knopf pause gedrückt wird,...
                        zeitjeloofen = time.time()-timenow  #anzahl der sekunden, die bis jetzt in der schleife gelaufen sind
                        Motörchen(0) #motoren aus
                        ElHalto(1) #elhalto kammerli 
                        ElHalto(2)  #elhalto kammerre
                        while 1: #endlosschleife
                            horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
                            time.sleep(0.2)
                            MannoProgram()  #manuelles Programm wird gestartet (Methode wird aufgerufen)
                            KritischeAbbruchfrage()  #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
                            if knoppekPause.isPressed():  #wenn pause knopf gedrückt wird,...
                                timenow = time.time()-zeitjeloofen  #slider und zeitprogramm machen da weiter, wo sie aufgehört haben
                                break  #pause-schleife wird beendet
                    ElHalto(1)  #in den ersten 20sek nach dem start, muss die luft in der linken kammer gehalten werden
 
                ElHalto(1) #nach den 20sek, luft halten in beiden kammern
                ElHalto(2)  
                KammerMehr = 2   #kammer links, die luft kriegt, wird auf kammermehr gesetzt
                KammerWenig= 1   #kammer rechts, die luft verliert, wird auf kammerwenig gesetzt
                while 1:  #endlosschleife
                    zeitjeloofen = 0  #zeit, die gelaufen ist, liegt bei 0sek
                    timenow = time.time() #legt aktuelle Zeit auf timenow
                    while time.time()-timenow < 20:  #schleife, wechselspiel der kammern beginnt und slider läuft insgesamt 20sek
                        horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
                        slider.newValue((time.time()-timenow)/20)  #berechnet balkenlänge, indem es den slider-wert auf (abgelaufenezeit:20) setzt
                        horst.refresh()  #aktualisiert die bildinhalte
                        if time.time()-timenow < 15:  #wechselspiel der kammern läuft 15sek lang
                            ElSaugo(KammerWenig)  #kammer wird luft entzogen
                            ElBlaso(KammerMehr)  #kammer wird luft zugeführt
                            Motörchen(1)  #motoren sind an
                        else: #nach den 15sek, wird luft in beiden kammern für 5sek gehalten
                            ElHalto(KammerMehr) #luft wird gehalten
                            ElHalto(KammerWenig)  #luft wird gehalten
                            Motörchen(0)  #motoren sind aus
                        KritischeAbbruchfrage()  #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
 
                        if knoppekPause.isPressed():  #wenn knopf pause gedrückt wird
                            zeitjeloofen = time.time()-timenow  #anzahl der sekunden, die bis jetzt in der schleife gelaufen sind
                            Motörchen(0) #motoren aus
                            ElHalto(1) #luft wird in kammer gehalten
                            ElHalto(2)  #luft wird in kammer gehalten
                            while 1:  #endlosschleife
                                horst.keepAlive()  #verhindert absturz des programmes und sucht nach gedrückten knöpfen
                                time.sleep(0.2) 
                                MannoProgram() #manuelles Programm wird gestartet (Methode wird aufgerufen)
                                KritischeAbbruchfrage()  #wenn ende knopf gedrückt wird, wird alles beendet --> Methode wird aufgerufen
                                if knoppekPause.isPressed():  #wenn knopf pause gedrückt wird,...
                                    timenow = time.time()-zeitjeloofen  #slider und zeitprogramm machen da weiter, wo sie aufgehört haben
                                    break
 
                    if(KammerMehr==1):  #wenn kammer links luft kriegt,..
                        KammerMehr=2 #.. kriegt kammer rechts in der nächsten runde luft
                        KammerWenig=1 #.. und die linke kriegt luft abgezogen
                    else:  #andererseits...
                        KammerMehr=1  #..kriegt kammer rechts luft abgezogen
                        KammerWenig=2  #..und kammer links kriegt luft
 
            time.sleep(0.2)
 
    if knoppekManuell.isPressed(): #falls man ganz zu beginn den manuell knopf drückt,...
        GroßKnoppeksWech() #methodenaufruf: grüne knöpfe+icons verschwinden
        KleineKnoppeksHer()  #methodenaufruf: blaue knöpfe werden angezeigt 
        bildschenHer() #methodenaufruf: icons erscheinen und sind aktiv
        textHer()  #methodenaufruf: text (blau) wird sichtbar gemacht
        MannoProgram()  #methodenaufruf: manuelles programm bedienbar

Probleme

Zu Beginn unseres Projekts hatten wir die Idee, die Motoren mit dem Luftdruck in den Kammern zu steuern und diesen auch ausgeben zu lassen. Das heißt, dass die Kammern einen gewissen Druck erreicht hätten und sich der Kammerdruck anhand dessen reguliert hätte. Allerdings hat dies nicht funktioniert.

Zuerst hatten wir die MPX5500DP Drucksensoren erhalten, die den Druck analog ausgeben, weshalb wir hier mit dem AD-Wandler arbeiten mussten. Da der Druck in den Kammern zu gering war und die Drucksensoren ihn nicht registrieren konnten, hat es nicht funktioniert. Danach bekamen wir die Drucksensoren BME280, die bereits digital waren, wodurch der AD-Wandler wegfiel. Leider bekamen wir immer wieder die Fehlermeldung „Connection timed out“. Warum es letztendlich nicht funktionierte, ist unklar. Wahrscheinlich lag es an einem Teil der Programmierung für das Touch-Display, womit die Sensoren dann Probleme hatten. Dadurch kamen wir zu dem Entschluss, ohne die Drucksensoren weiterzumachen.


Quellen

Extern bezogene Bibliothek (pygame_horstEdition as horst)

Skripte aus der Vorlesung

Anleitung zur Erstellung vom Desktop-Icon: https://www.hackster.io/kamal-khan/desktop-shortcut-for-python-script-on-raspberry-pi-fd1c63