Eigene Cocktailmaschine

Du hast eine Idee für ein Projekt?
BlackJack

Mittwoch 17. Mai 2017, 08:44

@Kallinero: Das Vorgehen ist so vielleicht auch nicht wirklich zielführend. Du schreibst 130-Zeilenprogramme die ein komplettes Rezept mit externer Hardware mixen sollen, die aber ziemlich offensichtlich werden lassen, dass Du mit den Sprachmitteln zur Steuerung des Programmflusses noch deutliche Probleme hast. Vielleicht solltest Du das etwas kleinschrittiger angehen. Programme entwickelt man. Also man schreibt nicht ein komplettes Programm runter und testet *dann* erst ob es läuft und ob es das tut was man möchte, sondern man schreibt eine Funktion nach der anderen, und *testet* jede Funktion ob sie auch das tut was man möchte, *bevor* man mit der nächsten weiter macht.

Und gerade am Anfang, mit für Anfänger noch kompliziert aussehenden Schleifen und Bedingungen, macht es Sinn auch die eine oder andere Funktion nicht erst zu testen wenn sie komplett fertig geschrieben ist, sondern ebenfalls einen Teil schreiben und dann prüfen ob der bis dahin auch das tut was man möchte.

Ich bin ja immer noch der Meinung Du solltest Dich mal losgelöst von diesem Programm mit den Python-Grundlagen beschäftigen. Also zum Beispiel das Tutorial in der Python-Dokumentation durcharbeiten. Danach hast Du dann eine solidere Grundlage und kennst die Dir zur Verfügung stehenden Werkzeuge wie Sprachmittel und Datenstrukturen besser.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Donnerstag 18. Mai 2017, 17:51

So, ja nach lagem suchen hab ich auch den elif-Fehler entdeckt. Nach ein bisschen modifizieren hat alles funktioniert ... tadaa. Ich bin auch schon sehr weit gekommen mit dem Cocktailfinder, meiner Suchfunktion. Sie arbeitet eig auch schon so wie ich will. Ich kann mir ganze Rezepte suchen und ausgeben lassen, nur das einzige Problem ist, ich bekomme die beiden Funktionen Cocktailfinder() und mixen() nicht im Einklang. Selbst wenn ich aus ihnen eine Funktion mache und die Variablen nicht übergebe funktioniert das ganze nicht. Jetzt ist die Frage, ich fänd es natürlich sinnvoller wenn alles in zwei Funktionen funktioniert. Wie übergebe ich die Werte der einen Funktion der anderen ? Ich habe jetzt schon ein paar Sachen ausprobiert und gegooglt, erreiche aber nie das gewünschte Ziel.

Code: Alles auswählen

import sys
import RPi.GPIO as GPIO
import time


oSaft = 0				#Bedingung
grenadine = 0
zitronensaft = 0
tequila = 0
wodka = 0
blueCoracao = 0
maracujasaft = 0
ananassaft = 0

oSaft_ventil = 2				#Ventile zugeordnet
grenadine_ventil = 3
zitronensaft_ventil = 4
tequila_ventil = 5
wodka_ventil = 6
blueCoracao_ventil = 17
maracujasaft_ventil =18
ananassaft_ventil = 19

GPIO.setmode(GPIO.BCM)   		#gleiche Bezeichnung wie rasp

GPIO.setwarnings(False)

GPIO.setup(oSaft_ventil,GPIO.OUT)      	#Initiualisierung der GPIOs
GPIO.setup(grenadine_ventil,GPIO.OUT)
GPIO.setup(zitronensaft_ventil,GPIO.OUT)
GPIO.setup(tequila_ventil,GPIO.OUT)
GPIO.setup(wodka_ventil,GPIO.OUT)
GPIO.setup(blueCoracao_ventil,GPIO.OUT)
GPIO.setup(maracujasaft_ventil,GPIO.OUT)
GPIO.setup(ananassaft_ventil,GPIO.OUT)

GPIO.output(oSaft_ventil,True)      		#Alle Ventile schließen
GPIO.output(grenadine_ventil,True)
GPIO.output(zitronensaft_ventil,True)
GPIO.output(tequila_ventil,True)
GPIO.output(wodka_ventil,True)
GPIO.output(blueCoracao_ventil,True)
GPIO.output(maracujasaft_ventil,True)
GPIO.output(ananassaft_ventil,True)


#Datein-Lesemethode:

def cocktailfinder():

    oSaft = 0				#Bedingung
    grenadine = 0
    zitronensaft = 0
    tequila = 0
    wodka = 0
    blueCoracao = 0
    maracujasaft = 0
    ananassaft = 0

    zeile = 0

    gewaehlterCocktail = "Tequila Sunrise"
    
    cocktailliste = open("cocktailliste.txt","r")

    for line in cocktailliste:
        zeile = zeile + 1
        gefundenerCocktail = line.rstrip()
	
        if gefundenerCocktail == gewaehlterCocktail:
            print(gewaehlterCocktail)
            for line in cocktailliste:
                zeile = zeile + 1
                zutat = line.rstrip()
                         
                if zutat == "O-Saft":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        oSaft = int(line.rstrip())
                        break
                if zutat == "Grenadine":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        grenadine = int(line.rstrip())
                        break
                if zutat == "Zitronensaft":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        zitronensaft = int(line.rstrip())
                        break
                if zutat == "Tequila":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        tequila = int(line.rstrip())
                        break
                if zutat == "Wodka":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        wodka = int(line.rstrip())
                        break
                if zutat == "Blue Coracao":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        blueCoracao = int(line.rstrip())
                        break
                if zutat == "Maracujasaft":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        maracujasaft = int(line.rstrip())
                        break
                if zutat == "Ananassaft":
                    for line in cocktailliste:
                        zeile = zeile + 1
                        ananassaft = int(line.rstrip())
                        break
                if zutat == "Ende":
                    break

    print(oSaft)
    print(grenadine)
    print(zitronensaft)
    print(tequila)
    print(wodka)
    print(blueCoracao)
    print(maracujasaft)
    print(ananassaft)
    
def mixen():
        
    if oSaft != 0:					#Ventile öffenen
        GPIO.output(oSaft_ventil,False)
    if grenadine != 0:
        GPIO.output(grenadine_ventil,False)
    if zitronensaft != 0:
        GPIO.output(zitronensaft_ventil,False)
    if tequila != 0:
        GPIO.output(tequila_ventil,False)
    if wodka != 0:
        GPIO.output(wodka_ventil,False)
    if blueCoracao != 0:
        GPIO.output(blueCoracao_ventil,False)
    if maracujasaft != 0:
        GPIO.output(maracujasaft_ventil,False)
    if ananassaft != 0:
        GPIO.output(ananassaft_ventil,False)
    
    for i in range(25):				#Ventile schließen
        if i == oSaft:
            GPIO.output(oSaft_ventil,True)
        if i == grenadine:
            GPIO.output(grenadine_ventil,True)
        if i == zitronensaft:
            GPIO.output(zitronensaft_ventil,True)
        if i == tequila:
            GPIO.output(tequila_ventil,True)
        if i == wodka:
            GPIO.output(wodka_ventil,True)
        if i == blueCoracao:
            GPIO.output(blueCoracao_ventil,True)
        if i == maracujasaft:
            GPIO.output(maracujasaft_ventil,True)
        if i == ananassaft:
            GPIO.output(ananassaft_ventil,True)

        time.sleep(.1)

def main():
    mixen()
main()
Für alle Interessierten meine Cocktailliste.txt

Code: Alles auswählen

Tequila Sunrise
O-Saft
16
Grenadine
3
Zitronensaft
2
Tequila
9
Sirius3
User
Beiträge: 7781
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 18. Mai 2017, 20:36

Statt etlicher Variablen für die verschiedenen Bestandteile, solltest Du passende Datenstrukturen verwenden, also Wörterbücher. Eines für die Pins, eines für die Mengen. Dann sind die Parameter und Rückgabewerte, die noch bei Deinen Funktionen fehlen, ganz einfach. cocktailfinder wird nie aufgerufen.
Benutzeravatar
Kebap
User
Beiträge: 396
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Freitag 19. Mai 2017, 09:14

Kallinero hat geschrieben:Wie übergebe ich die Werte der einen Funktion der anderen ? Ich habe jetzt schon ein paar Sachen ausprobiert und gegooglt, erreiche aber nie das gewünschte Ziel.
Welche Sachen hast du denn ausprobiert?

Wieso googlst du solche Grundlagen, anstatt einfach Blackjacks Vorschlag zu folgen, und das Tutorial zu lesen?
MorgenGrauen: 1 Welt, >12 Gilden, >85 Abenteuer, >1000 Waffen und Rüstungen,
>2500 NPC, >16000 Räume, >170 freiwillige Programmierer, einfach Text, seit 1992.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Montag 29. Mai 2017, 12:22

So,
da mir ja alle dazu geraten haben das Tutorial zu lesen, habe ich noch mehr gemacht. Ich habe das Vorgeschlagene gelesen und noch weitere, ich hab mir auch noch ne Youtube-Reihe dazu reingezogen. Ich habe versucht alles zu behalten und nicht für mich typisch alles wieder über den Jordan zu schicken. Ich verstehe jetzt eure vorherige Kritik an meinem Code. Ich bin aber immer noch nicht ganz überzeugt meine integer Variablen (Rezept-Variablen) durch eine andere Datenstruktur ab zu ändern.

SO, nun seht den Quellcode, den ich jetzt poste, nicht als fertig oder fast "vorzeigbar" an, das ist nur ein weiterer Zwischenschritt zu meiner für mich perfekten Methode. Zur Zeit kämpfe ich damit ,dass ich wenn ich das Programm aufrufe nur einmal einen Cocktail mixen kann.

PS. Ich weiß das ich mir immer mehrere Probleme gleichzeitig schaffe, indem ich ein Problem nicht behandel sondern direkt ein "neues" schaffe, weil ich mit was neuem anfange, aber ich bin sehr schnell von so etwas genervt. Wenn es selbst beim 5 mal korrigieren immer noch Fehler gibt, macht mich das wütend und ich muss mit was neuem anfangen um zumindest ein bisschen ein Erfolgserlebnis zu haben.

Code: Alles auswählen

import sys
import RPi.GPIO as GPIO
from Tkinter import *
import time

#---------------------------------------------- Ventile zuordnen ----------------------------------------------

oSaft_ventil = 2				
grenadine_ventil = 3
zitronensaft_ventil = 4
tequila_ventil = 5
wodka_ventil = 6
blueCoracao_ventil = 17
maracujasaft_ventil =18
ananassaft_ventil = 19

#---------------------------------------------- Initiualisierung der GPIOs ----------------------------------------------

GPIO.setmode(GPIO.BCM)   		

GPIO.setup(oSaft_ventil,GPIO.OUT)      	
GPIO.setup(grenadine_ventil,GPIO.OUT)
GPIO.setup(zitronensaft_ventil,GPIO.OUT)
GPIO.setup(tequila_ventil,GPIO.OUT)
GPIO.setup(wodka_ventil,GPIO.OUT)
GPIO.setup(blueCoracao_ventil,GPIO.OUT)
GPIO.setup(maracujasaft_ventil,GPIO.OUT)
GPIO.setup(ananassaft_ventil,GPIO.OUT)

#---------------------------------------------- Ventile schließen ----------------------------------------------

GPIO.output(oSaft_ventil,True)      		
GPIO.output(grenadine_ventil,True)
GPIO.output(zitronensaft_ventil,True)
GPIO.output(tequila_ventil,True)
GPIO.output(wodka_ventil,True)
GPIO.output(blueCoracao_ventil,True)
GPIO.output(maracujasaft_ventil,True)
GPIO.output(ananassaft_ventil,True)

#---------------------------------------------- Cocktailfinder ----------------------------------------------

def mixen(gewaehlterCocktail):
        
    oSaft = 0				
    grenadine = 0
    zitronensaft = 0
    tequila = 0
    wodka = 0
    blueCoracao = 0
    maracujasaft = 0
    ananassaft = 0
    
    cocktailliste = open("cocktailliste.txt","r")

    for line in cocktailliste:
        gefundenerCocktail = line.rstrip()
	
        if gefundenerCocktail == gewaehlterCocktail:
            print(gewaehlterCocktail)
            for line in cocktailliste:
                zutat = line.rstrip()
                         
                if zutat == "O-Saft":
                    for line in cocktailliste:
                        oSaft = int(line.rstrip()) 
                        break
                if zutat == "Grenadine":
                    for line in cocktailliste:
                        grenadine = int(line.rstrip())
                        break
                if zutat == "Zitronensaft":
                    for line in cocktailliste:
                        zitronensaft = int(line.rstrip())
                        break
                if zutat == "Tequila":
                    for line in cocktailliste:
                        tequila = int(line.rstrip())
                        break
                if zutat == "Wodka":
                    for line in cocktailliste:
                        wodka = int(line.rstrip())
                        break
                if zutat == "Blue Coracao":
                    for line in cocktailliste:
                        blueCoracao = int(line.rstrip())
                        break
                if zutat == "Maracujasaft":
                    for line in cocktailliste:
                        maracujasaft = int(line.rstrip())
                        break
                if zutat == "Ananassaft":
                    for line in cocktailliste:
                        ananassaft = int(line.rstrip())
                        break
                if zutat == "Ende":
                    break

#---------------------------------------------- Mischfunktion ----------------------------------------------

#---------------------------------------------- Max-Finder ----------------------------------------------

    maximum = 0

    if maximum < oSaft:
        maximum = oSaft
    if maximum < grenadine:
        maximum = grenadine
    if maximum < zitronensaft:
        maximum = zitronensaft
    if maximum < tequila:
        maximum = tequila
    if maximum < wodka:
        maximum = wodka
    if maximum < blueCoracao:
        maximum = blueCoracao
    if maximum < maracujasaft:
        maximum = maracujasaft
    if maximum < ananassaft:
        maximum = ananassaft

#---------------------------------------------- Ventile öffnen ----------------------------------------------

    if oSaft != 0:					
        GPIO.output(oSaft_ventil,False)
    if grenadine != 0:
        GPIO.output(grenadine_ventil,False)
    if zitronensaft != 0:
        GPIO.output(zitronensaft_ventil,False)
    if tequila != 0:
        GPIO.output(tequila_ventil,False)
    if wodka != 0:
        GPIO.output(wodka_ventil,False)
    if blueCoracao != 0:
        GPIO.output(blueCoracao_ventil,False)
    if maracujasaft != 0:
        GPIO.output(maracujasaft_ventil,False)
    if ananassaft != 0:
        GPIO.output(ananassaft_ventil,False)

#----------------------------------------------Ventile schließen ----------------------------------------------
    
    for i in range(maximum):				
        if i == oSaft:
            GPIO.output(oSaft_ventil,True)
        if i == grenadine:
            GPIO.output(grenadine_ventil,True)
        if i == zitronensaft:
            GPIO.output(zitronensaft_ventil,True)
        if i == tequila:
            GPIO.output(tequila_ventil,True)
        if i == wodka:
            GPIO.output(wodka_ventil,True)
        if i == blueCoracao:
            GPIO.output(blueCoracao_ventil,True)
        if i == maracujasaft:
            GPIO.output(maracujasaft_ventil,True)
        if i == ananassaft:
            GPIO.output(ananassaft_ventil,True)            
        time.sleep(1)
        
    GPIO.cleanup()

#---------------------------------------------- Kontrolle kann geschlöscht werden! ----------------------------------------------

    print(" ")
    print("So viel Osaft ist drin: %d "%(oSaft))
    print("So viel Grenadine ist drin: %d "%(grenadine))
    print("So viel Zitronensaft ist drin: %d "%(zitronensaft))
    print("So viel Tequila ist drin: %d "%(tequila))
    print("So viel Wodka ist drin: %d "%(wodka))
    print("So viel Blue Coracao ist drin: %d "%(blueCoracao))
    print("So viel Maracujasaft ist drin: %d "%(maracujasaft))
    print("So viel Ananassaft ist drin: %d "%(ananassaft))

#---------------------------------------------- Layout ----------------------------------------------   

#---------------------------------------------- Funktionen ----------------------------------------------

#---------------------------------------------- Auswaehlen ----------------------------------------------    

def choose():
    print("auswaehlen")                                                                   
#---------------------------------------------- Mixen ----------------------------------------------

def mixit():                                                                    
    gewaehlterCocktail = liste.get("active")
    mixen(gewaehlterCocktail)

#---------------------------------------------- Fullscreen ----------------------------------------------

def close(event):
    top.attributes("-fullscreen", False)
                
top = Tk()
top.attributes("-fullscreen", True)
top.config(bg="white")
top.bind("<Escape>", close)

#---------------------------------------------- Label ----------------------------------------------

cocktail = Label(top)                               
cocktail.config(height = 30,width = 50, bg = "red")
cocktail.grid(row = 1 , column =2)

rezept = Label(top)
rezept.config(height = 25, width = 35, bg = "grey")
rezept.grid(row = 1 , column = 3)

#---------------------------------------------- Liste ----------------------------------------------

liste = Listbox(top, height = 17)                                         
liste.config(font=('Times New Roman',20))
liste.grid(row = 1, column = 4)

def wechselalk():
    liste.delete(0,50)
    liste.insert("end","All in One","Alice Deluxe","Baltic","Black Death","El Dorado","Emerald Dream","Exotic Blue","Festini","Florida Sunrise","Green Eyes","Green Poisen","Grüne Wiese","Happy Hour","Hawaiian Vodka","Knock Out","Mexicano","Pink Pussycat","Screwdriver","Simple Red","Springtime Cooler","Tequila Sunrise")

def wechselalkfrei():
    liste.delete(0,50)
    liste.insert("end","Alice","Ballerina","Batman Cocktail","Bora Bora","Golden Nugget","Pussy Foot","Yellowjacket","Thoothless Shark")

#---------------------------------------------- Frame ----------------------------------------------

frame1 = Frame(top)
frame1.grid(row = 0, column = 4)

#---------------------------------------------- Radiobutton ----------------------------------------------

anti = Radiobutton(frame1, text="Alkoholfrei",font=('Times New Roman',18), bg = "white", value=0,height = 1, command = wechselalkfrei)
voll = Radiobutton(frame1, text="Alkoholvoll",font=('Times New Roman',18), bg = "white", value=1,height = 1, command = wechselalk)
anti.grid(row = 0, sticky = "w")
voll.grid(row = 1, sticky = "w")

#---------------------------------------------- Scrollbar ----------------------------------------------

scroll = Scrollbar(top, orient = VERTICAL, width = 50)
liste["yscrollcommand"]=scroll.set
scroll["command"]=liste.yview
scroll.grid( row = 1, column = 5, sticky=N+S+E)

#---------------------------------------------- Knopf ----------------------------------------------

knopf = Button(text='Choose',height= 2,width = 10,font=('Times New Roman',20),command=choose)
knopf.grid(row = 1,column = 3, sticky=N+E)

mix = Button(text='Mix it',height= 2,width=10,font=('Times New Roman',18), command=mixit)
mix.grid(row = 1, column = 3, sticky = S+E)

top.mainloop()
Sirius3
User
Beiträge: 7781
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 29. Mai 2017, 12:48

@Kallinero: es hilft, nicht alles auf einmal zu wollen und mit einem soliden Code anzufangen, der keine Fehler hat, bevor man immer weiter schreibt und die einzelnen Fehler sich zu einem undurchschaubaren durcheinander vermengen. Was auch hilft, Frust zu vermeiden ist, kleine Funktionen zu schreiben, die genau eine Aufgabe haben, z.B. das Initialisieren von allen Pins, das Einlesen von einem Rezept, usw. Dann kann man sich freuen, wenn dies eine Funktion getestet ist und funktioniert. Ansonsten gilt zum aktuellen Quellcode alles, was bisher dazu gesagt wurde: weg mit dem *-Import, Verwenden von Datenstrukturen für GPIO-Pins und für Rezepte; keine Anweisungen auf oberster Ebene, sondern alles in Funktionen packen.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Dienstag 30. Mai 2017, 08:31

Kallinero hat geschrieben: PS. Ich weiß das ich mir immer mehrere Probleme gleichzeitig schaffe, indem ich ein Problem nicht behandel sondern direkt ein "neues" schaffe, weil ich mit was neuem anfange, aber ich bin sehr schnell von so etwas genervt. Wenn es selbst beim 5 mal korrigieren immer noch Fehler gibt, macht mich das wütend und ich muss mit was neuem anfangen um zumindest ein bisschen ein Erfolgserlebnis zu haben.
Mir hilft es meistens ein Minimalbeispiel zu erstellen, in dem ich mich nur um das aktuelle Problem kümmern kann. Dadurch, dass das Programm dann viel kleiner und übersichtlicher ist, kann ich mich viel besser auf das eigentliche Problem konzentrieren. Wenn das dann gelöst ist und ich die Lösung wirklich verstanden habe, kann ich sie auch normalerweise in mein großes Programm einbauen.
Falls das mit dem Lösen trotzdem nicht klappt, hat man wenigstens ein schönes Beispiel an dem man sein Problem aufzeigen kann :wink:
Antworten