Eigene Cocktailmaschine

Du hast eine Idee für ein Projekt?
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Eigene Cocktailmaschine

Beitragvon Kallinero » Montag 8. Mai 2017, 15:16

Sehr geehrte Python-Gemeinde,
ich habe ein Problem, abgesehen davon, dass ich mir gerade versuche Python im Alleingang in einer Woche beizubringen, bin ich dabei eine Cocktailmaschine zu bauen. Ich habe schon alle Teile beisammen und es funktioniert alles mehr oder minder auch im Einklang, nur bei dem Programmierteil habe ich meine Schwierigkeiten. Ich habe leichtes Verständnis in C++ also ist Python mehr oder minder Neuland, also bitte versteht das wenn ihr meinen sehr sehr aufwendigen Quellcode seht.
Meine Probleme sind die folgenden, ich möchte eine Oberfläche haben, in der man durch die verschiedenen Cocktails scrollen kann und des Weiteren das ein Ladebalken oder sowas in der Art erscheint, damit man nicht einfach alle Cocktails gleichzeitig drücken kann. Außerdem bekomm ich es einfach nicht hin alles smart in einem Algorithmus zu schreiben(aber das ist mir im Endeffekt egal).
Ich hoffe ihr könnt mir weiterhelfen.

  1.  
  2. import sys
  3. import Tkinter
  4. import RPi.GPIO as GPIO
  5. import time
  6.  
  7. GPIO.setmode(GPIO.BCM)      #gleiche Bezeichnung wie rasp
  8. GPIO.setwarnings(False)     #keine Fehlermeldung
  9. GPIO.setup(2,GPIO.OUT)      #Initiualisierung der GPIOs
  10. GPIO.setup(3,GPIO.OUT)
  11. GPIO.setup(4,GPIO.OUT)
  12. GPIO.setup(5,GPIO.OUT)
  13. GPIO.setup(6,GPIO.OUT)
  14. GPIO.setup(17,GPIO.OUT)
  15. GPIO.setup(18,GPIO.OUT)
  16. GPIO.setup(19,GPIO.OUT)
  17.  
  18. GPIO.output(2,True)     #Zum Start alle GPIOs aus
  19. GPIO.output(3,True)
  20. GPIO.output(4,True)
  21. GPIO.output(5,True)
  22. GPIO.output(6,True)
  23. GPIO.output(17,True)
  24. GPIO.output(18,True)
  25. GPIO.output(19,True)
  26.  
  27. n = .1       #Sekunden-Masseinheit
  28.  
  29. i = 0
  30. kanister = {}
  31. for i in range(8):          #Kanisterfuellmenge
  32.     kanister[i+1] = int(input("Geben sie die Menge des Kanisters an:"))
  33.     kanister[i+1] = kanister[i+1]*1000
  34. """
  35. for i in range(8):          #Fehlermeldung
  36.    if kanister[i+1]<0:
  37.        print"Der Kanister ist leer, bitte auffuellen"
  38. """
  39. def ausgabe():              #aktuelle Kanisterfuellmenge
  40.     for i in range(8):
  41.         print(i+1 ,kanister[i+1])
  42.     print("")
  43.  
  44. def allinone(event):
  45.         GPIO.output(2,False)
  46.         GPIO.output(3,False)
  47.         GPIO.output(4,False)
  48.         GPIO.output(5,False)
  49.         GPIO.output(6,False)
  50.         GPIO.output(17,False)
  51.         GPIO.output(18,False)
  52.         GPIO.output(19,False)
  53.         time.sleep(3.75*n)
  54.         GPIO.output(2,True)
  55.         GPIO.output(3,True)
  56.         GPIO.output(4,True)
  57.         GPIO.output(5,True)
  58.         GPIO.output(6,True)
  59.         GPIO.output(17,True)
  60.         GPIO.output(18,True)
  61.         GPIO.output(19,True)
  62.         kanister[1] = kanister[1]-3.75
  63.         kanister[2] = kanister[2]-3.75
  64.         kanister[3] = kanister[3]-3.75
  65.         kanister[4] = kanister[4]-3.75
  66.         kanister[5] = kanister[5]-3.75
  67.         kanister[6] = kanister[6]-3.75
  68.         kanister[7] = kanister[7]-3.75
  69.         kanister[8] = kanister[8]-3.75
  70.         ausgabe()
  71.        
  72. def alicedeluxe(event):                     #Alice Deluxe
  73.         GPIO.output(19,False)
  74.         GPIO.output(2,False)
  75.         GPIO.output(3,False)
  76.         GPIO.output(6,False)
  77.         time.sleep(4*n)
  78.         GPIO.output(3,True)
  79.         GPIO.output(6,True)
  80.         time.sleep(6*n)
  81.         GPIO.output(2,True)
  82.         time.sleep(2*n)
  83.         GPIO.output(19,True)
  84.         kanister[8] = kanister[8]-12
  85.         kanister[2] = kanister[2]-10
  86.         kanister[5] = kanister[5]-4
  87.         kanister[6] = kanister[6]-4
  88.         ausgabe()
  89.        
  90. def baltic(event):                           #Baltic
  91.         GPIO.output(2,False)
  92.         GPIO.output(6,False)
  93.         GPIO.output(18,False)
  94.         GPIO.output(4,False)
  95.         GPIO.output(17,False)
  96.         time.sleep(2*n)
  97.         GPIO.output(4,True)
  98.         GPIO.output(17,True)
  99.         time.sleep(2*n)
  100.         GPIO.output(18,True)
  101.         time.sleep(2*n)
  102.         GPIO.output(6,True)
  103.         time.sleep(9*n)
  104.         GPIO.output(2,True)
  105.         kanister[1] = kanister[1]-15
  106.         kanister[5] = kanister[5]-6
  107.         kanister[7] = kanister[7]-4
  108.         kanister[5] = kanister[5]-2
  109.         kanister[6] = kanister[6]-2
  110.         ausgabe()
  111.        
  112. def blackdeath(event):                      #Black Death
  113.         GPIO.output(2,False)
  114.         GPIO.output(4,False)
  115.         GPIO.output(5,False)
  116.         GPIO.output(17,False)
  117.         GPIO.output(3,False)
  118.         time.sleep(3*n)
  119.         GPIO.output(3,True)
  120.         time.sleep(3*n)
  121.         GPIO.output(4,True)
  122.         GPIO.output(5,True)
  123.         GPIO.output(17,True)
  124.         time.sleep(4*n)
  125.         GPIO.output(2,True)
  126.         kanister[1] = kanister[1]-10
  127.         kanister[2] = kanister[2]-3
  128.         kanister[3] = kanister[3]-6
  129.         kanister[4] = kanister[4]-6
  130.         kanister[6] = kanister[6]-6
  131.         ausgabe()
  132.  
  133. def eldorado(event):                        #El Dorado
  134.         GPIO.output(5,False)
  135.         GPIO.output(4,False)
  136.         time.sleep(12*n)
  137.         GPIO.output(4,True)
  138.         time.sleep(6*n)
  139.         GPIO.output(5,True)
  140.         kanister[3] = kanister[3]-6
  141.         kanister[4] = kanister[4]-6
  142.         ausgabe()
  143.  
  144. def emeralddream(event):                    #Emerald Dream
  145.         GPIO.output(17,False)
  146.         GPIO.output(6,False)
  147.         GPIO.output(2,False)
  148.         time.sleep(4*n)
  149.         GPIO.output(17,True)
  150.         time.sleep(4*n)
  151.         GPIO.output(6,True)
  152.         time.sleep(8*n)
  153.         GPIO.output(2,True)
  154.         kanister[1] = kanister[1]-16
  155.         kanister[5] = kanister[5]-8
  156.         kanister[6] = kanister[6]-4
  157.         ausgabe()
  158.        
  159. def exoticblue(event):                      #Exotic Blue
  160.         GPIO.output(17,False)
  161.         GPIO.output(19,False)
  162.         time.sleep(10*n)
  163.         GPIO.output(17,True)
  164.         time.sleep(8*n)
  165.         GPIO.output(19,True)
  166.         kanister[6] = kanister[6]-10
  167.         kanister[8] = kanister[8]-18
  168.         ausgabe()
  169.  
  170. def festini(event):                         #Festini
  171.         GPIO.output(18,False)
  172.         GPIO.output(6,False)
  173.         time.sleep(8*n)
  174.         GPIO.output(6,True)
  175.         time.sleep(12*n)
  176.         GPIO.output(18,True)
  177.         kanister[5] = kanister[5]-8
  178.         kanister[7] = kanister[7]-20
  179.         ausgabe()
  180.  
  181. def floridasunrise(event):                         #Florida Sunrise
  182.         GPIO.output(2,False)
  183.         GPIO.output(5,False)
  184.         GPIO.output(19,False)
  185.         GPIO.output(3,False)
  186.         time.sleep(4*n)
  187.         GPIO.output(3,True)
  188.         time.sleep(4*n)
  189.         GPIO.output(2,True)
  190.         GPIO.output(5,True)
  191.         GPIO.output(19,True)
  192.         kanister[1] = kanister[1]-8
  193.         kanister[4] = kanister[4]-8
  194.         kanister[8] = kanister[8]-8
  195.         kanister[2] = kanister[2]-4
  196.         ausgabe()
  197.  
  198. def greeneyes(event):                         #Green Eyes
  199.         GPIO.output(2,False)
  200.         GPIO.output(6,False)
  201.         GPIO.output(17,False)
  202.         time.sleep(5*n)
  203.         GPIO.output(6,True)
  204.         GPIO.output(17,True)
  205.         time.sleep(13*n)
  206.         GPIO.output(2,True)
  207.         kanister[1] = kanister[1]-18
  208.         kanister[5] = kanister[5]-5
  209.         kanister[6] = kanister[6]-5
  210.         ausgabe()
  211.  
  212. def greenpoisen(event):                         #Green Poisen
  213.         GPIO.output(17,False)
  214.         GPIO.output(4,False)
  215.         GPIO.output(5,False)
  216.         GPIO.output(18,False)
  217.         time.sleep(3*n)
  218.         GPIO.output(4,True)
  219.         GPIO.output(17,True)
  220.         time.sleep(3*n)
  221.         GPIO.output(5,True)
  222.         time.sleep(9*n)
  223.         GPIO.output(18,True)
  224.         kanister[6] = kanister[6]-3
  225.         kanister[5] = kanister[5]-3
  226.         kanister[6] = kanister[6]-6
  227.         kanister[7] = kanister[7]-15
  228.         ausgabe()
  229.  
  230. def gruenewiese(event):                         #Gruene Wiese
  231.         GPIO.output(17,False)
  232.         GPIO.output(2,False)
  233.         time.sleep(9*n)
  234.         GPIO.output(17,True)
  235.         time.sleep(12*n)
  236.         GPIO.output(2,True)
  237.         kanister[6] = kanister[6]-9
  238.         kanister[1] = kanister[1]-21
  239.         ausgabe()
  240.        
  241. def happyhour(event):                         #Happy Hour
  242.         GPIO.output(2,False)
  243.         GPIO.output(5,False)
  244.         GPIO.output(4,False)
  245.         time.sleep(2*n)
  246.         GPIO.output(4,True)
  247.         time.sleep(8*n)
  248.         GPIO.output(5,True)
  249.         time.sleep(5*n)
  250.         GPIO.output(2,True)
  251.         kanister[1] = kanister[1]-15
  252.         kanister[4] = kanister[4]-10
  253.         kanister[3] = kanister[3]-2
  254.         ausgabe()
  255.  
  256. def hawaiianvodka(event):                         #Hawaiian Vodka
  257.         GPIO.output(6,False)
  258.         GPIO.output(19,False)
  259.         GPIO.output(2,False)
  260.         GPIO.output(3,False)
  261.         GPIO.output(4,False)
  262.         time.sleep(4*n)
  263.         GPIO.output(4,True)
  264.         GPIO.output(3,True)
  265.         GPIO.output(2,True)
  266.         GPIO.output(19,True)
  267.         time.sleep(8*n)
  268.         GPIO.output(6,True)
  269.         kanister[1] = kanister[1]-15
  270.         kanister[4] = kanister[4]-10
  271.         kanister[3] = kanister[3]-2
  272.         kanister[3] = kanister[3]-2
  273.         kanister[3] = kanister[3]-2
  274.         ausgabe()
  275.  
  276. def knockout(event):                         #Knock Out
  277.         GPIO.output(2,False)
  278.         GPIO.output(4,False)
  279.         GPIO.output(5,False)
  280.         time.sleep(7*n)
  281.         GPIO.output(2,True)
  282.         time.sleep(1*n)
  283.         GPIO.output(4,True)
  284.         time.sleep(7*n)
  285.         GPIO.output(5,True)
  286.         kanister[1] = kanister[1]-7
  287.         kanister[3] = kanister[3]-8
  288.         kanister[4] = kanister[4]-15
  289.         ausgabe()
  290.  
  291. def mexicano(event):                         #Mexicano
  292.         GPIO.output(3,False)
  293.         GPIO.output(4,False)
  294.         GPIO.output(5,False)
  295.         GPIO.output(19,False)
  296.         time.sleep(6*n)
  297.         GPIO.output(3,True)
  298.         GPIO.output(4,True)
  299.         GPIO.output(19,True)
  300.         time.sleep(6*n)
  301.         GPIO.output(5,True)
  302.         kanister[2] = kanister[2]-6
  303.         kanister[3] = kanister[3]-6
  304.         kanister[4] = kanister[4]-12
  305.         kanister[8] = kanister[8]-6
  306.         ausgabe()
  307.        
  308. def pinkpussycat(event):                         #Pink Pussycat
  309.         GPIO.output(3,False)
  310.         GPIO.output(6,False)
  311.         GPIO.output(19,False)
  312.         time.sleep(2*n)
  313.         GPIO.output(3,True)
  314.         time.sleep(9*n)
  315.         GPIO.output(6,True)
  316.         time.sleep(5*n)
  317.         GPIO.output(19,True)
  318.         kanister[2] = kanister[2]-2
  319.         kanister[5] = kanister[5]-11
  320.         kanister[8] = kanister[8]-16
  321.         ausgabe()
  322.  
  323.        
  324. def screwdriver(event):                         #Screwdriver
  325.         GPIO.output(2,False)
  326.         GPIO.output(6,False)
  327.         time.sleep(10*n)
  328.         GPIO.output(6,True)
  329.         time.sleep(20*n)
  330.         GPIO.output(2,True)
  331.         kanister[1] = kanister[1]-20
  332.         kanister[5] = kanister[5]-10
  333.         ausgabe()
  334.        
  335. def simplered(event):                         #Simple Red
  336.         GPIO.output(2,False)
  337.         GPIO.output(3,False)
  338.         GPIO.output(6,False)
  339.         GPIO.output(18,False)
  340.         time.sleep(3*n)
  341.         GPIO.output(3,True)
  342.         time.sleep(3*n)
  343.         GPIO.output(6,True)
  344.         time.sleep(4*n)
  345.         GPIO.output(2,True)
  346.         GPIO.output(18,True)
  347.         kanister[1] = kanister[1]-10
  348.         kanister[2] = kanister[2]-3
  349.         kanister[5] = kanister[5]-6
  350.         kanister[7] = kanister[7]-10
  351.         ausgabe()
  352.        
  353. def springtimecooler(event):                         #Springtime Cooler
  354.         GPIO.output(2,False)
  355.         GPIO.output(4,False)
  356.         GPIO.output(6,False)
  357.         GPIO.output(17,False)
  358.         time.sleep(4*n)
  359.         GPIO.output(17,True)
  360.         time.sleep(2*n)
  361.         GPIO.output(4,True)
  362.         time.sleep(2*n)
  363.         GPIO.output(6,True)
  364.         time.sleep(4*n)
  365.         GPIO.output(2,True)
  366.         kanister[1] = kanister[1]-12
  367.         kanister[3] = kanister[3]-6
  368.         kanister[5] = kanister[5]-8
  369.         kanister[6] = kanister[6]-4
  370.         ausgabe()
  371.        
  372. def tequilasunrise(event):                         #Tequila Sunrise
  373.         GPIO.output(2,False)
  374.         GPIO.output(3,False)
  375.         GPIO.output(4,False)
  376.         GPIO.output(5,False)
  377.         time.sleep(2*n)
  378.         GPIO.output(4,True)
  379.         time.sleep(1*n)
  380.         GPIO.output(3,True)
  381.         time.sleep(6*n)
  382.         GPIO.output(5,True)
  383.         time.sleep(7*n)
  384.         GPIO.output(2,True)
  385.         kanister[1] = kanister[1]-16
  386.         kanister[2] = kanister[2]-3
  387.         kanister[3] = kanister[3]-2
  388.         kanister[4] = kanister[4]-9
  389.         ausgabe()
  390.    
  391.    
  392. top = Tkinter.Tk()      # Erzeugen eines Fensters
  393. top.geometry("1024x900")
  394.  
  395. w = Tkinter.Label(top,text='Choose your Cocktail')    #Header
  396. w.grid(row=0,column=3)
  397.  
  398. """
  399. def wechslefarbe ():
  400.    knopf["bg"]="#FF0000"
  401.    knopf["fg"]="#FF0000"
  402.    knopf1["bg"]="#FF0000"
  403.    knopf1["fg"]="#FF0000"
  404.    knopf2["bg"]="#FF0000"
  405.    knopf2["fg"]="#FF0000"
  406.    knopf3["bg"]="#FF0000"
  407.    knopf3["fg"]="#FF0000"
  408.    knopf4["bg"]="#FF0000"
  409.    knopf4["fg"]="#FF0000"
  410.    knopf5["bg"]="#FF0000"
  411.    knopf5["fg"]="#FF0000"
  412.    knopf6["bg"]="#FF0000"
  413.    knopf6["fg"]="#FF0000"
  414.    knopf7["bg"]="#FF0000"
  415.    knopf7["fg"]="#FF0000"
  416.    knopf8["bg"]="#FF0000"
  417.    knopf8["fg"]="#FF0000"
  418.    knopf9["bg"]="#FF0000"
  419.    knopf9["fg"]="#FF0000"
  420.    knopf10["bg"]="#FF0000"
  421.    knopf10["fg"]="#FF0000"
  422.    knopf11["bg"]="#FF0000"
  423.    knopf11["fg"]="#FF0000"
  424.    knopf12["bg"]="#FF0000"
  425.    knopf12["fg"]="#FF0000"
  426.    knopf13["bg"]="#FF0000"
  427.    knopf13["fg"]="#FF0000"
  428.    knopf14["bg"]="#FF0000"
  429.    knopf14["fg"]="#FF0000"
  430.    time.sleep(20*n)
  431.  
  432. liste= Listbox(root,height=5)
  433. liste.insert("end","All in One")
  434. liste.insert("end","Alice Deluxe")
  435. liste.insert("end","Baltic")
  436.  
  437. liste.grid(row=1,column=1)
  438. """
  439.  
  440. knopf = Tkinter.Button(top,text='All in One',height=12,width=22,command=wechslefarbe)
  441. knopf.grid(row=1,column=1)
  442. knopf.bind('<Button-1>', allinone)
  443.  
  444. knopf1 = Tkinter.Button(top,text='Alice Deluxe',height=12,width=22,command=wechslefarbe)
  445. knopf1.grid(row=1,column=2)
  446. knopf1.bind('<Button-1>', alicedeluxe)
  447.  
  448. knopf2 = Tkinter.Button(top,text='Baltic',height=12,width=22)
  449. knopf2.grid(row=1,column=3)
  450. knopf2.bind('<Button-1>', baltic)
  451.  
  452. knopf3 = Tkinter.Button(top,text='Black Death',height=12,width=22)
  453. knopf3.grid(row=1,column=4)
  454. knopf3.bind('<Button-1>', blackdeath)
  455.  
  456. knopf4 = Tkinter.Button(top,text='El Dorado',height=12,width=22)
  457. knopf4.grid(row=1,column=5)
  458. knopf4.bind('<Button-1>', eldorado)
  459.  
  460. knopf5 = Tkinter.Button(top,text='Emerald Dream',height=12,width=22)
  461. knopf5.grid(row=2,column=1)
  462. knopf5.bind('<Button-1>', emeralddream)
  463.  
  464. knopf6 = Tkinter.Button(top,text='Exotic Blue',height=12,width=22)
  465. knopf6.grid(row=2,column=2)
  466. knopf6.bind('<Button-1>', exoticblue)
  467.  
  468. knopf7 = Tkinter.Button(top,text='Festini',height=12,width=22)
  469. knopf7.grid(row=2,column=3)
  470. knopf7.bind('<Button-1>', festini)
  471.  
  472. knopf8 = Tkinter.Button(top,text='Florida Sunrise',height=12,width=22)
  473. knopf8.grid(row=2,column=4)
  474. knopf8.bind('<Button-1>', floridasunrise)
  475.  
  476. knopf9 = Tkinter.Button(top,text='Green Eyes',height=12,width=22)
  477. knopf9.grid(row=2,column=5)
  478. knopf9.bind('<Button-1>', greeneyes)
  479.  
  480. knopf10 = Tkinter.Button(top,text='Green Poisen',height=12,width=22)
  481. knopf10.grid(row=3,column=1)
  482. knopf10.bind('<Button-1>', greenpoisen)
  483.  
  484. knopf11 = Tkinter.Button(top,text='Gruene Wiese',height=12,width=22)
  485. knopf11.grid(row=3,column=2)
  486. knopf11.bind('<Button-1>', gruenewiese)
  487.  
  488. knopf12 = Tkinter.Button(top,text='Happy Hour',height=12,width=22)
  489. knopf12.grid(row=3,column=3)
  490. knopf12.bind('<Button-1>', happyhour)
  491.  
  492. knopf13 = Tkinter.Button(top,text='Hawaiian Vodka',height=12,width=22)
  493. knopf13.grid(row=3,column=4)
  494. knopf13.bind('<Button-1>', hawaiianvodka)
  495.  
  496. knopf14 = Tkinter.Button(top,text='Knock Out',height=12,width=22)
  497. knopf14.grid(row=3,column=5)
  498. knopf14.bind('<Button-1>', knockout)
  499. """
  500. knopf15 = Tkinter.Button(top,text='Mexicano')
  501. knopf15.pack()
  502. knopf15.bind('<Button-1>', mexicano)
  503.  
  504. knopf16 = Tkinter.Button(top,text='Pink Pussycat')
  505. knopf16.pack()
  506. knopf16.bind('<Button-1>', pinkpussycat)
  507.  
  508. knopf17 = Tkinter.Button(top,text='Screwdriver')
  509. knopf17.pack()
  510. knopf17.bind('<Button-1>', screwdriver)
  511.  
  512. knopf18 = Tkinter.Button(top,text='Simple Red')
  513. knopf18.pack()
  514. knopf18.bind('<Button-1>', simplered)
  515.  
  516. knopf19 = Tkinter.Button(top,text='Springtime Cooler')
  517. knopf19.pack()
  518. knopf19.bind('<Button-1>', springtimecooler)
  519.  
  520. knopf20 = Tkinter.Button(top,text='Tequila Sunrise')
  521. knopf20.pack()
  522. knopf20.bind('<Button-1>', tequilasunrise)
  523. """
  524. top.mainloop()
  525.  
Zuletzt geändert von Anonymous am Dienstag 9. Mai 2017, 09:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Re: Eigene Cocktailmaschine

Beitragvon BlackJack » Dienstag 9. Mai 2017, 10:26

@Kallinero: Da ist viel Code der eigentlich Daten sein sollte. Man schreibt nicht pro Cocktail eine Funktion die fast immer das gleiche enthält, sondern die Unterschiede, also welche Pins und die Zeiten, als Daten und *eine* Funktion die dann so ein Rezept erhält und die Pins entsprechend schaltet. Das der Programmierer bei den Zeiten und den Mengen mitdenken und rechnen muss, ist auch keine gute Idee, weil das genau so gut, oder eben besser, der Rechner übernehmen könnte.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Bei den Pins und den Kanistern werden ausschliesslich ”magische” Zahlen verwendet, was nicht wirklich nachvollziehbar und sehr fehleranfällig ist. Bei Rechnern fängt man ausserdem üblicherweise mit 0 an bei der Zählung was das Programm vereinfacht. Und wenn man eine Abbildung von fortlaufenden Zahlen die bei 0 beginnen braucht, nimmt man eine Liste und kein Wörterbuch.

Statt die Warnungen vom GPIO-Modul auszuschalten sollte man sich die Anschauen und die Ursache(n) beseitigen statt sie zu ignorieren. Meistens ist es einfach nur ein fehlendes `GPIO.cleanup()` das beim Verlassen des Programms unbedingt ausgeführt werden sollte. Dazu am besten mal ``try``/``finally`` anschauen.

Mehrzeilige Zeichenketten sind keine Kommentare.

Wenn man anfängt Namen zu nummerieren, macht man in der Regel etwas falsch und möchte bessere Namen verwenden, oder eigentlich gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste. Bei den ganzen Schaltflächen beispielsweise.

Die Aktion bei einer Schaltfläche legt man nicht mit `bind()` fest, sondern mit der `command`-Option der Schaltfläche. Sonst verhält sich dieses Anzeigeelement nicht so wie der Benutzer das erwartet.

Bei GUI-Programmierung kommt man nicht wirklich um objektorientierte Programmierung herum. Und auch die ”Funktionen” für dir Rezepte sollten nicht einfach so auf dem globalen Kanisterfüllständen operieren. Alle Werte die eine Funktion oder Methode verwendet (ausser Konstanten) sollten als Argumente herein kommen und nicht ”magisch” in der Umgebung existieren. Das macht Programme schwer nachvollziehbar und einzelne Funktionen/Methoden schwer bis fast gar nicht testbar.

Während ein Rezept gemixt wird müsstest Du alle Schaltflächen deaktivieren. Die haben dafür eine `state`-Option die man auf `Tkinter.DISABLED` oder `Tkinter.NORMAL` setzen kann. Letzteres müsste man dann nach dem mixen tun.

Das mit `time.sleep()` funktioniert so nicht mit der GUI zusammen. Da muss man entweder `time.sleep()` durch `Widget.after()` ersetzen und die Schritte in mehrere Methodenaufrufe unterteilen, oder mit dem `threading`-Modul arbeiten und beispielsweise `Queue.Queue`-Objekte zur Kommunikation mit dem GUI-Thread verwenden. Denn die GUI darf nur vom GUI-Thread aus verändert werden. Dort würde man dann mit der `Widget.after()`-Methode regelmässig schauen ob neue Daten in der Queue sind.

Ich würde als erstes mit der Geschäftslogik anfangen und die GUI-unabhängig programmieren und testen, und dann hinterher eine GUI dort draufsetzen. Die Geschäftslogik würde ich auch gleich objektorientiert implementieren, denn die Pinnummer und der Kanisterfüllstand lassen sich sinnvoll zusammenfassen, und statt magischer Nummern würde ich dort auch einen Namen für den Inhalt verwenden. Dann ist man auch nicht auf die Kanisterreihenfolge angewiesen und auch die Inhalte sind nicht fest. Man könnte also auch mehr als acht verschiedene Getränke haben wenn man bei Kanistern und Rezepten Namen verwendet und das Programm kann dann auch damit umgehen wenn die Kanister in einer beliebigen Reihenfolge eingesetzt werden und wenn für einen Cocktail nicht alle Zutaten vorhanden sind.

Mögliche Ausbaustufe davon wäre es auch zu erlauben das mehr als ein Kanister von einer Sorte eingesetzt wird, wenn man eine Sorte hat die besonders oft und viel verwendet wird. Das schränkt dann natürlich die Zahl der Rezepte ein.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Dienstag 9. Mai 2017, 11:33

Ich danke dir vielmals für deine sehr ausführliche Antwort.Habe nicht so schnell damit gerechnet. Ich hoffe ich schaffe es mit meinen kleinen Kenntnissen, mein Programm zu optimieren. Denn wenn ich es wirklich schaffe, das durchzusetzen, was du da vorschlägst, dann wäre das nach lagem endlich mal ein schönes vorzeigbares Projekt, das man sogar erweitern könnte. Besten Dank.
Ich programmier mal noch ein bisschen und halt alle auf dem Laufendem.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Dienstag 9. Mai 2017, 17:31

So,
ich habe mich nun den ganzen Tag versucht, aber mich erschließt sich der Algorithmus nicht. Ich weiss nicht wie ich durch sortieren der Wartezeiten immer noch die Zuordnung zu den Ventilen hinbekomme, damit sich die falschen Ventile nicht einfach schließen.

  1. import sys
  2. import Tkinter
  3. import RPi.GPIO as GPIO
  4. import time
  5.  
  6. main()
  7.  
  8. oSaft = 2               #Ventile zugeordnet
  9. grenadine = 3
  10. zitronensaft = 4
  11. tequila = 5
  12. wodka = 6
  13. blueCoracao = 17
  14. maracujasaft =18
  15. ananassaft = 19
  16.  
  17. GPIO.setmode(GPIO.BCM)              #gleiche Bezeichnung wie rasp
  18.  
  19. GPIO.setup(oSaft,GPIO.OUT)          #Initiualisierung der GPIOs
  20. GPIO.setup(geradine,GPIO.OUT)
  21. GPIO.setup(zitronensaft,GPIO.OUT)
  22. GPIO.setup(tequila,GPIO.OUT)
  23. GPIO.setup(wodka,GPIO.OUT)
  24. GPIO.setup(blueCoracao,GPIO.OUT)
  25. GPIO.setup(maracujasaft,GPIO.OUT)
  26. GPIO.setup(ananassaft,GPIO.OUT)
  27.  
  28. GPIO.setup(oSaft,True)              #Alle Ventile schließen
  29. GPIO.setup(geradine,True)
  30. GPIO.setup(zitronensaft,True)
  31. GPIO.setup(tequila,True)
  32. GPIO.setup(wodka,True)
  33. GPIO.setup(blueCoracao,True)
  34. GPIO.setup(maracujasaft,True)
  35. GPIO.setup(ananassaft,True)
  36.  
  37. for i in range(5)           #generieren der Wartezeit-Variablen
  38.     wartezeit{i} = 0
  39.  
  40. #Datenbank...
  41.  
  42. def sortieren()
  43.    
  44.  
  45. def mixen()
  46.     #1. Wartezeit muss nach groeße sortiert werden
  47.     #2. alle Ventile müssen geoeffnet werden
  48.     #3. kürzeste Wartezeit ... das zugeordnete Ventil muss schliessen
  49.     #4. nach und nach die anderen
  50.  
  51.     GPIO.output(a1,False)
  52.     GPIO.output(a2,False)
  53.     GPIO.output(a3,False)
  54.     GPIO.output(a4,False)
  55.     GPIO.output(a5,False)
  56.     sortieren()
  57.     time.sleep(b1)
  58.     GPIO.output(a1,False)
  59.     GPIO.output(a2,False)
  60.     GPIO.output(a3,False)
  61.     GPIO.output(a4,False)
  62.     GPIO.output(a5,False)
  63.     sortieren()
  64.     time.sleep(b2-b1)
  65.     GPIO.output(a4,False)
  66.     GPIO.output(a1,False)
  67.     GPIO.output(a2,False)
  68.     GPIO.output(a3,False)
  69.     GPIO.output(a4,False)
  70.     sortieren()
  71.     time.sleep(b3-b2)
  72.     GPIO.output(a1,False)
  73.     GPIO.output(a2,False)
  74.     GPIO.output(a3,False)
  75.     sortieren()
  76.     time.sleep(b4-b3)
  77.     GPIO.output(a1,False)
  78.     GPIO.output(a2,False)
  79.     sortieren()
  80.     time.sleep(b5-b4)
  81.     GPIO.output(a1,False)
Zuletzt geändert von Anonymous am Dienstag 9. Mai 2017, 17:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 6385
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Eigene Cocktailmaschine

Beitragvon Sirius3 » Dienstag 9. Mai 2017, 17:46

@Kallinero: versuch erst einmal, ganz allgemein zu beschreiben, wie ein Cocktail gemixt wird. Dann überleg Dir, welche Datenstruktur zur Beschreibung geeignet ist. Dann erst, wie Du diese Beschreibung in eine Auf/Zu-Sequenz übersetzen kannst. Hast Du das in natürlicher Sprache aufgeschrieben, kannst Du Dir Gedanken machen, wie man das in Python ausdrücken könnte und was Dir da noch an Kenntnissen fehlt.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Mittwoch 10. Mai 2017, 21:41

Also ich habe mir ein paar mehr Gedanken gemacht. Ich hab versucht herauszufinden wie das ganze System mit Datenbanken funktioniert(bin da aber auch nicht viel weitergekommen) und nochmal über meinen Code nachgedacht und die einzige Möglichkeit die mir einfällt ist diese. Ich habe mir viel dabei gedacht, aber weiss nicht ganz ob das ganze so funktioniert (Also nein sind wir ehrlich, ich habe es versucht und es funktioniert natürlich nicht). Vll könnt ihr mir nen Gedankenanstoß geben, warum das nicht geht.

  1. import sys
  2. import RPi.GPIO as GPIO
  3. import time
  4.  
  5. main():
  6.  
  7.     oSaft_ventil = 2                #Ventile zugeordnet
  8.     grenadine_ventil = 3
  9.     zitronensaft_ventil = 4
  10.     tequila_ventil = 5
  11.     wodka_ventil = 6
  12.     blueCoracao_ventil = 17
  13.     maracujasaft_ventil =18
  14.     ananassaft_ventil = 19
  15.  
  16.     GPIO.setmode(GPIO.BCM)              #gleiche Bezeichnung wie rasp
  17.  
  18.     GPIO.setup(oSaft_ventil,GPIO.OUT)       #Initiualisierung der GPIOs
  19.     GPIO.setup(grenadine_ventil,GPIO.OUT)
  20.     GPIO.setup(zitronensaft_ventil,GPIO.OUT)
  21.     GPIO.setup(tequila_ventil,GPIO.OUT)
  22.     GPIO.setup(wodka_ventil,GPIO.OUT)
  23.     GPIO.setup(blueCoracao_ventil,GPIO.OUT)
  24.     GPIO.setup(maracujasaft_ventil,GPIO.OUT)
  25.     GPIO.setup(ananassaft_ventil,GPIO.OUT)
  26.  
  27.     GPIO.setup(oSaft_ventil,True)           #Alle Ventile schließen
  28.     GPIO.setup(grenadine_ventil,True)
  29.     GPIO.setup(zitronensaft_ventil,True)
  30.     GPIO.setup(tequila_ventil,True)
  31.     GPIO.setup(wodka_ventil,True)
  32.     GPIO.setup(blueCoracao_ventil,True)
  33.     GPIO.setup(maracujasaft_ventil,True)
  34.     GPIO.setup(ananassaft_ventil,True)
  35.  
  36. #allgemeine Bedingung
  37.  
  38. oSaft = 0
  39. geradine = 0
  40. zitronensaft = 0
  41. tequila = 0
  42. wodka = 0
  43. blueCoracao = 0
  44. maracujasaft = 0
  45. ananassaft = 0
  46.  
  47. #Beispiel-Rezept
  48.  
  49. oSaft = 10
  50. geradine = 4
  51. wodka = 4
  52. ananassaft = 12
  53.  
  54. def mixen():
  55.     if oSaft != 0:
  56.         GPIO.output(oSaft_ventil,False)
  57.     elif geradine != 0:
  58.         GPIO.output(geradine_ventil,False)
  59.     elif zitronensaft != 0:
  60.         GPIO.output(zitronensaft_ventil,False)
  61.     elif tequila != 0:
  62.         GPIO.output(tequila_ventil,False)
  63.     elif wodka != 0:
  64.         GPIO.output(wodka_ventil,False)
  65.     elif blueCoracao != 0:
  66.         GPIO.output(blueCoracao_ventil,False)
  67.     elif maracujasaft != 0:
  68.         GPIO.output(maracujasaft_ventil,False)
  69.     else:
  70.         GPIO.output(ananassaft_ventil,False)
  71.     #2.
  72.     for i in range(25):
  73.         if oSaft == i:
  74.             GPIO.output(oSaft_ventil,True)
  75.         elif geradine == i:
  76.             GPIO.output(geradine_ventil,True)
  77.         elif zitronensaft == i:
  78.             GPIO.output(zitronensaft_ventil,True)
  79.         elif tequila == i:
  80.             GPIO.output(tequila_ventil,True)
  81.         elif wodka == i:
  82.             GPIO.output(wodka_ventil,True)
  83.         elif blueCoracao == i:
  84.             GPIO.output(blueCoracao_ventil,True)
  85.         elif maracujasaft == i:
  86.             GPIO.output(maracujasaft_ventil,True)
  87.         else:
  88.             GPIO.output(ananassaft_ventil,True)
  89.         time.sleep(1)
  90.  
  91. GPIO.cleanup()
Zuletzt geändert von Anonymous am Mittwoch 10. Mai 2017, 21:49, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Re: Eigene Cocktailmaschine

Beitragvon BlackJack » Mittwoch 10. Mai 2017, 22:44

@Kallinero: Was heisst denn „funktioniert nicht“? Gibt es Fehlermeldungen? Verhält es sich nicht so wie es sollte? Wie weicht das Verhalten von dem ab was Du erwartest? An welcher Stelle im Code passiert das?

Das ist immer noch alles Code und keine Datenstrukturen.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Mittwoch 10. Mai 2017, 23:04

Es gibt eine Fehlermeldung. Die kann ich morgen auch einmal posten. Handelt sich irgendwie um die GPIO die nicht als outputs definiert sind, obwohl ich das oben getan habe.

Zu den Datenstrukturen hab ich dann ne Frage. So wie ich das jetzt durch anlesen herausgefunden habe. Sind Datenstrukturen doch nur die Möglichkeit wie ich meine Informationen abrufe bzw. abspeichere (also gehts doch um Code) oder habe ich das falsch verstanden. Dadurch ist es doch nur eine Frage der Effektivität welche ich jetzt wähle.
BlackJack

Re: Eigene Cocktailmaschine

Beitragvon BlackJack » Donnerstag 11. Mai 2017, 00:00

@Kallinero: Der gezeigte Code definiert keine GPIOs als output. Das ist Code der das tun *würde*, wenn er denn ausgeführt *würde*.

Wobei mir gerade auffällt das selbst das nicht so ganz stimmt denn der gezeigte Code läuft gar nicht, weil er syntaktisch nicht korrekt ist. In Zeile 5 müsste gibt es einen Syntaxfehler geben, weil der Compiler mit dem Doppelpunkt hinter dem Aufruf von `main` nichts anfangen kann. Da fehlt ein ``def`` damit das eine Funktionsdefinition ist.

Eine Funktionsdefinition definiert beim ausführen aber erst einmal nur eine Funktion. Um den Code in einer Funktion auszuführen muss man die Funktion auch *aufrufen*.

`mixen()` wird zwar korrekt definiert, aber ebenfalls nirgends aufgerufen.

Die „allgemeine(n) Bedingungen”, das „Beispiel-Rezept“, und der `GPIO.cleanup()`-Aufruf stehen auf Modulebene, wo sie nichts zu suchen haben.

Datenstrukturen werden durch Code während der Laufzeit verarbeitet, sind also flexibel. Code ist dagegen etwas statisches was nicht von Code verändert wird. Zumindest solange man nicht in Sprachen programmiert die den Code auch als Datenstrukturen repräsentieren und ein Makrokonzept bieten wie Lisp oder Scheme und daran angelehnte Programmiersprachen.

Den letzten Satz habe ich nicht verstanden. Beziehungsweise ja, es ist auf Deine Art nicht wirklich möglich effektiv zu programmieren. Daten nicht als Daten zu handhaben und für jeden Datensatz wieder den grundsätzlich gleichen Code zu schreiben ist Wahnsinn. Fürchterlich redundant und fehleranfällig, insbesondere wenn es um die Fehlersuche und Änderungen geht, weil man dann nicht *einmal* den *einen* Code ändern muss, sondern immer alle ähnlichen Kopien, was wesentlich mehr Arbeit und wesentlich mehr Angriffsfläche für Fehler bietet. Man muss ja immer alle Kopien gleich bzw. äquivalent ändern, darf nichts vergessen, sich bei jeder gleichen Änderung muss man immer das gleiche Tippen, also kann man sich x-mal *ver*tippen, statt nur einmal, und das dann auch an der einen Stelle fixen, und so weiter.

Wie willst Du denn das was Du jetzt hast um ein zweites Rezept erweitern? Um ein Drittes? Das skaliert doch überhaupt nicht.

Man will hier normalerweise eine `mixen()`-Funktion die ein Rezept als Daten beim Aufruf übergeben bekommt. Dann hat man *eine* Funktion mit der man alle Rezepte mixen kann die mit den gegebenen Zutaten möglich sind.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Re: Eigene Cocktailmaschine

Beitragvon Zizibee » Donnerstag 11. Mai 2017, 09:03

@Kallinero : Lass mich mal versuchen dir die Notwendigkeit zum Trennen von Code und Daten zu erklären.

Angenommen du programmierst so weiter und dein Mixer funktioniert so gut, dass ein Freund von dir auch einen will. Allerdings findet er das Mischungsverhältnis von einem Cocktail nicht gut und würde gerne seinen Lieblingscocktail hinzu fügen. Da er selber keine Ahnung vom Programmieren hat, müsste er dir jede Änderung durchgeben, du müsstest den Quellcode anpassen und ihm schicken, worauf er ihn dann wieder aufspielt und merkt, dass die Mischung immer noch nicht ideal ist...

Befinden sich die Rezepte aber nicht im Quellcode sondern in einer separaten Datei (z.B. .CSV, .JSON, .TXT oder was auch immer), kann er diese in jedem Editor öffnen und seine Änderungen selbst vornehmen. Auch der Austausch von Rezepten zwischen mehreren Nutzern ist dann möglich.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Donnerstag 11. Mai 2017, 13:04

Ok ok ich seh es ein,
es ist viel sinnvoller das ganze in Dateien zu verpacken. Ich habe auch schon herausgefunden das das ganze nicht so schwierig ist. Nur stellt sich mir jetzt die Fragen. Soll ich jetzt eine Funktion schreiben, die in einer Datei nach dem Cocktail sucht oder lege ich für jeden Cocktail eine Datei an die gesucht wird.

Ich dank euch übrigens sehr, ihr helft mir sehr weiter!
BlackJack

Re: Eigene Cocktailmaschine

Beitragvon BlackJack » Donnerstag 11. Mai 2017, 13:33

@Kallinero: *Dateien* sind ein weiterer, davon erst einmal unabhängiger Schritt. Die Funktion/Methode die ein Getränk mixt sollte davon nichts wissen müssen ob die Daten für das Rezept aus einer Datei mit allen Rezepten, aus einer Datei mit einzelnen Rezepten, aus einer Datenbank, oder sonst wo her kommt.
Kallinero
User
Beiträge: 9
Registriert: Montag 8. Mai 2017, 14:44

Re: Eigene Cocktailmaschine

Beitragvon Kallinero » Dienstag 16. Mai 2017, 16:29

So, nach langem hin und her des programmierens, fange ich langsam an keine Fehler mehr zu finden. Also ignoriert zunächst den Cocktailfinder, das ist mein kläglicher Versuch ein Document zu durchsuchen. Ich schaffe es einfach nicht, dass meine if-elif-else-Schleife in mixen() das tut was sie tun soll. Es werden mir auch keine Fehler mehr rausgegeben. Ich hoffe ihr findet was, denn langsam werd ich irre.

  1. import sys
  2. import RPi.GPIO as GPIO
  3. import time
  4.  
  5. oSaft_ventil = 2                #Ventile zugeordnet
  6. grenadine_ventil = 3
  7. zitronensaft_ventil = 4
  8. tequila_ventil = 5
  9. wodka_ventil = 6
  10. blueCoracao_ventil = 17
  11. maracujasaft_ventil =18
  12. ananassaft_ventil = 19
  13.  
  14. def main():
  15.  
  16.     GPIO.setmode(GPIO.BCM)          #gleiche Bezeichnung wie rasp
  17.  
  18.     GPIO.setup(oSaft_ventil,GPIO.OUT)       #Initiualisierung der GPIOs
  19.     GPIO.setup(grenadine_ventil,GPIO.OUT)
  20.     GPIO.setup(zitronensaft_ventil,GPIO.OUT)
  21.     GPIO.setup(tequila_ventil,GPIO.OUT)
  22.     GPIO.setup(wodka_ventil,GPIO.OUT)
  23.     GPIO.setup(blueCoracao_ventil,GPIO.OUT)
  24.     GPIO.setup(maracujasaft_ventil,GPIO.OUT)
  25.     GPIO.setup(ananassaft_ventil,GPIO.OUT)
  26.  
  27.     GPIO.output(oSaft_ventil,True)              #Alle Ventile schließen
  28.     GPIO.output(grenadine_ventil,True)
  29.     GPIO.output(zitronensaft_ventil,True)
  30.     GPIO.output(tequila_ventil,True)
  31.     GPIO.output(wodka_ventil,True)
  32.     GPIO.output(blueCoracao_ventil,True)
  33.     GPIO.output(maracujasaft_ventil,True)
  34.     GPIO.output(ananassaft_ventil,True)
  35.  
  36.  
  37.  
  38. #Datein-Lesemethode:
  39.  
  40. def cocktailfinder():
  41.     cocktailliste = open("cocktailliste.txt")
  42.     gewaehlterCocktail = "ALice"
  43.    
  44.     for line in cocktailliste:
  45.         gefundenerCocktail = line.rstrip()
  46.            
  47.         if gefundenerCocktail == gewaehlterCocktail:
  48.             for line in range(16):
  49.                 zutat = line.rstrip()
  50.                 if zutat == "oSaft":
  51.                     oSaft = int(cocktailliste.read()[line+1])
  52.                 elif zutat == "geradine":
  53.                     geradine = int(cocktailliste.read()[line+1])
  54.                 elif zutat == "zitronensaft":
  55.                     zitronensaft = int(cocktailliste.read()[line+1])
  56.                 elif zutat == "tequila":
  57.                     tequila = int(cocktailliste.read()[line+1])
  58.                 elif zutat == "wodka":
  59.                     wodka = int(cocktailliste.read()[line+1])
  60.                 elif zutat == "blueCoracao":
  61.                     blueCoracao = int(cocktailliste.read()[line+1])
  62.                 elif zutat == "maracujasaft":
  63.                     maracujasaft =  int(cocktailliste.read()[line+1])
  64.                 else:
  65.                     ananassaft = int(cocktailliste.read()[line+1])
  66.  
  67.     print("O-Saft = %d",oSaft)
  68.     print("Geradine = %d",geradine)
  69.     print("Zitronensaft = %d",zitronensaft)
  70.     print("tequila = %d",tequila)
  71.     print("wodka= %d",wodka)
  72.     print("blueCoracao = %d",blueCoracao)
  73.     print("maracujasaft = d%",maracujasaft)
  74.     print("ananassaft = &d",ananassaft)
  75.  
  76.    
  77.     cocktailliste.close()
  78.  
  79. cocktailfinder
  80.  
  81. #Methode zum mixen der Cocktails   
  82.    
  83. def mixen():
  84.    
  85.     oSaft = 5                #Beispiel
  86.     grenadine = 0
  87.     zitronensaft = 25
  88.     tequila = 6
  89.     wodka = 0
  90.     blueCoracao = 0
  91.     maracujasaft = 0
  92.     ananassaft = 0
  93.  
  94.     #cocktailfinder(oSaft,geradine,zitronensaft,tquila,wodka,blueCaracao,maracujasaft,ananassaft)    #Übergabe des Rezepts
  95.  
  96.     if oSaft != 0:                  #Ventile öffenen
  97.         GPIO.output(oSaft_ventil,False)
  98.     elif geranadine != 0:
  99.         GPIO.output(geradine_ventil,False)
  100.     elif zitronensaft != 0:
  101.         GPIO.output(zitronensaft_ventil,False)
  102.     elif tequila != 0:
  103.         GPIO.output(tequila_ventil,False)
  104.     elif wodka != 0:
  105.         GPIO.output(wodka_ventil,False)
  106.     elif blueCoracao != 0:
  107.         GPIO.output(blueCoracao_ventil,False)
  108.     elif maracujasaft != 0:
  109.         GPIO.output(maracujasaft_ventil,False)
  110.     else:
  111.         GPIO.output(ananassaft_ventil,False)
  112.  
  113.     for i in range(25):             #Ventile schließen
  114.         if i == oSaft:
  115.             GPIO.output(oSaft_ventil,True)
  116.         elif i == grenadine:
  117.             GPIO.output(geradine_ventil,True)
  118.         elif i == zitronensaft:
  119.             GPIO.output(zitronensaft_ventil,True)
  120.         elif i == tequila:
  121.             GPIO.output(tequila_ventil,True)
  122.         elif i == wodka:
  123.             GPIO.output(wodka_ventil,True)
  124.         elif i == blueCoracao:
  125.             GPIO.output(blueCoracao_ventil,True)
  126.         elif i == maracujasaft:
  127.             GPIO.output(maracujasaft_ventil,True)
  128.         else:
  129.             GPIO.output(ananassaft_ventil,True)
  130.         time.sleep(1)
  131.  
  132.  
  133. mixen
BlackJack

Re: Eigene Cocktailmaschine

Beitragvon BlackJack » Dienstag 16. Mai 2017, 18:50

@Kallinero: http://if-schleife.de/

Du rufst keine der Funktionen auf die Du da definierst.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Re: Eigene Cocktailmaschine

Beitragvon Zizibee » Mittwoch 17. Mai 2017, 08:29

Kallinero hat geschrieben:Ich schaffe es einfach nicht, dass meine if-elif-else-Schleife in mixen() das tut was sie tun soll. Es werden mir auch keine Fehler mehr rausgegeben. Ich hoffe ihr findet was, denn langsam werd ich irre.


Was macht denn die if-elif-else Bedingung in deinem Beispiel?
Sie prüft ob oSaft != 0 ist, das stimmt. Daher wird oSaft_ventil auf False gesetzt. Da die if-Bedingung erfüllt wurde werden alle elif und das else übersprungen. Direkt danach werden alle Ventile in der for-Schleife auf True gesetzt. Ich glaube nicht, dass du das wirklich so haben wolltest...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder