Projekt und Code Hilfe

  • Hallo Community,

    Ich stell mein Code für mein Projekt hier rein. Könnt ihr da mal rüber schauen und mir schreiben, ob der so okay ist oder ob ich was verändern muss. Bin blutiger Anfänger und hab den Code aus vielen einzelnen Beispielen für mich so zusammengebaut.

    Er soll Gesichtserkennung, Namen speichern, die Person wiedererkennen, ansprechen mit Namen, Speichern des Lieblingsgetränk, ein einfacher virtueller Barkeeper mit Emotionen, 2 10" Displays, Spracherkennung und Ausgabe, Vosk für offline Spracherkennung, Neopixel-Ring mit allgemeinen Effekten und speziell für den Mixvorgang, 1.Display ist der virtuelle Barkeeper, 2.Display Anzeige des Cocktails zum Mixen, gesprochene Anleitung für den Mixvorgang, Peltierelemen, BMP280 Kühlschranküberwachung auf dem 2. Display zusätzlich, Zusätzliche Zutaten einfügen.

    Zukünftig soll noch eine Glaserkennung in die Ausgabe per Lichtschranke, Leerflaschenerkennung( Wie, weiß ich noch nicht), Statistik der Cocktailausgabe, Admin Menu zum einstellen, Reinigungsprogramm für die Pumpen, evtl.. mobile APP.

    Hier der Code:

    Für eure Hilfe bin ich dankbar und schätze es sehr.

    Gruß Referent


    PS: wie kriege ich den Code in die Klammer? erledigt, danke.

    Edited 4 times, last by Referent1601 (November 5, 2024 at 9:17 PM).

  • Post by __blackjack__ (October 28, 2024 at 10:22 PM).

    The post was deleted, no further information is available.
  • Hallo,

    jetzt bitte noch mit den richtigen Einrückungen, damit man den Code lesen kann. Zumindest mir ist das etwas zu mühsam, alles ordentlich einzurücken und dann weis ich nicht ob ich das gleich mache, wie es in deinem Original ist.


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • Hallo,

    der Code kann so nicht laufen, weil an mehreren Stellen ein Objekt `GPIO` angeprochen wird, was aber nirgends definiert oder importiert wird. Da fehlt wahrscheinlich ein Import am Anfang des Codes.

    Abgesehen davon: läuft der Code denn genau so wie gesagt auf deiner Hardware, die die Cocktails mixt?

    Gruß, noisefloor

  • Es sind nicht nur die Einrückungen und `GPIO`, erst steht `neon_pixel` dann wird versucht etwas über `neopixel` aufzurufen.

    `math` wird genutzt aber nicht importiert.

    `set_neopixel_color` ist nicht definiert.

    `mixen()` wird aufgerufen, gibt's aber nicht.

    `images` , `sprechen()` usw. gibt's nicht, `ingredients` ist nur ein halbes Wörterbuch, bzw. die schließende Klammer hatte wohl etwas Verspätung.


    Also das wird wahrscheinlich keiner für dich in Ordnung bringen. Wenn du ernsthaft Hilfe haben möchtest, dann starten wir mit dem Code, der funktioniert und erweitern den dann. Irgendwas zusammen kopieren funktioniert nicht.


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • Hallo,

    danke erstmal für diese Informationen. Das hilft mir schon sehr viel. Werde weiter lesen und versuchen, es zu verbessern und ein laufenden Code zu erstellen.

    Werde nochmal von Vorne starten und wie ihr schreibt, eins nach dem anderen machen, so das es bis zum Frühjahr hoffentlich fehlerlos laufen wird.

    Also soll ich mit der Hauptfunktion anfangen, dem Mixen? Danach alles weitere eins nach dem anderen.

    Gruß Lars

  • Hallo,

    Quote

    Also soll ich mit der Hauptfunktion anfangen, dem Mixen?

    Wäre wohl sinnvoll bei einer Cocktail Mixmaschine.

    Wichtig ist halt: nicht einfach riesige Mengen Code zusammenkopieren und hoffen, dass es läuft. Im häppchenweise implementieren, testen, und wenn's läuft das nächste Häppchen implementieren.

    Gruß, noisefloor

  • Hallo,

    danke, ja, so werde ich das machen und wenn ich nicht weiterkomme, werde ich hier fragen im kompetenten Forum.

    Anfangen werde ich mit den GPIO, das diese eindeutig laufen. Dann das "Cocktailmapping" und die Mischung mit Pumpen über Relais.

    Ich möchte es gerne selber lernen und euch nur mein Ergebnis zeigen, da könnt ihr mir meine Fehler oder anderes zeigen.

    Vielen, vielen Dank an euch.

    Gruß Lars

  • Hallo ,


    bin jetzt soweit gekommen. Ist die Reihenfolge richtig??

    1. GPIO-Pins definieren und initialisieren

    2. Cocktails benennen per Cocktail-Mpping

    3. Zutaten definieren per ingredient

    4. Mixen per "def mix_cocktail(cocktail_name):"

    5. Extra Zutat zufügen per "def mix_ingredient(ingredient, amount):"


    Der Code hier :


    Ist das so ok?


    Gruß Lars

  • Referent1601 Nein das ist natürlich nicht okay wenn der Compiler schon meckert. Wie kommst Du zu dem Code wenn das ganz offensichtlich auf die Nase fällt wenn man das versucht auszuführen?

    Dann gibt es mindestens eine Funktion doppelt. Mindestens zwei Funktionen versuchen jeweils einen Namen zu verwenden der nicht definiert ist.

    Das wären alles Sachen die Dir aufgefallen wären, wenn Du das mal versucht hättest auszuführen.

    Software entwickelt man, das heisst man schreibt da nicht 160 Zeilen Quelltext runter ohne da jemals irgendetwas ausprobiert zu haben. Gerade wenn man Anfänger ist, sind die Schritte in der Regel recht klein, die man testet ob der Code bis dort hin das tut was er soll. Denn wenn er das nicht tut, macht es keinen Sinn einfach weiterzuschreiben, sondern man muss dann erst einmal schauen was man ändern muss, damit der Code das richtige macht.

    Das grundsätzliche Vorgehen ist das zu lösende Problem in Teilprobleme aufzuteilen, und die Teilprobleme in kleinere Teilprobleme und so weiter. Solange bis man bei Teilproblemen angekommen ist, die sich durch eine Funktion mit ein paar Zeilen Code lösen lassen. Die Funktion testet man dann. Und erst wenn die funktioniert, schreibt man die nächste Funktion. Die Teillösungen lassen sich dann zu grösseren Teillösungen kombinieren, solange bis am Ende das gesamte Problem gelöst ist.

    Handwerkliches zum Quelltest: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die main() heisst. Grundgerüst:

    Python
    #!/usr/bin/env python3
    
    
    def main():
        # Hier kommt das Hauptprogramm hin.
    
    
    if __name__ == "__main__":
        main()

    Das kann man jetzt als Modul importieren ohne das die main() Funktion aufgerufen wird. Zum Beispiel um mal einzelne Funktionen in einer Python-Shell auszuprobieren, oder um automatisierte Tests zu schreiben. Bei GPIO-Kram ist eine sinnvolle Faustregel dass man das importieren können muss, ohne das dabei schon irgendetwas mit den GPIOs passiert. Das sollte nur der Fall sein, wenn man das als Programm ausführt.

    Konstanten werden per Konvention in Python (und vielen anderen Programmiersprachen) KOMPLETT_GROSS geschrieben.

    Redundanz in Code und Daten sollte man vermeiden.

    Weder die PIN-Nummern noch die Cocktail-Namen sollten mehr als einmal als Wert im Quelltext stehen. Das heisst die Pinnummern der Zutaten nicht in einer Liste und dann noch mal bei der Zuordnung von Zutat zu Pinnummer schreiben, sondern sich die Nummern aus dieser Zuordnung holen. Da könnte man dann auch gleich noch Validierungscode einbauen der prüft ob nicht zufällig zwei Zutaten die gleiche Pin-Nummer haben.

    Und bei den Cocktails nicht zwei Abbildungen, einmal Cocktailnamen auf Beschreibungen und dann noch mal die gleichen Cocktailnamen auf Zutaten, sondern eine Abbildung die Cocktail-Namen auf Beschreibung und Zutaten abbilden.

    Bei Redundanz hat man sonst immer das Problem das man schon beim schreiben oder später beim ändern, Fehler macht und nicht alle Kopien gleichartig verändert.

    Die Cocktailbeschreibunge enthalten auch Wiederholungen mit leicht variablen Anteilen die besser als einzelne Datenwerte hinterlegt und bei Bedarf dann dynamsich der Text erzeugt wird.

    Abbildungen/Wörterbücher werden sinnvollerweise so benannt, dass man beim lesen sieht was da auf was abgebildet wird. Dazu verwendet man oft sinnvolle Namen für einen Schüssel und einen Wert und verbindet die durch _to_, also beispielsweise INGREDIENT_NAME_TO_PIN_NUMBER für ein Wörterbuch das Cocktail-Namen auf Pin-Nummern abbildet. Nur ingredient wie im Quelltext ist falsch, denn bei dem Namen erwartet der Leser einen Wert der eine Zutat repräsentiert.

    Die Funktionen die den Cocktail zubereiten, sollten nicht mit dem Benutzer interagieren. Das es einen Cocktail nicht gibt, sollte nicht erst die Mix-Funktion feststellen und als Text ausgeben, sondern die sollte nur mit Cocktails aufgerufen werden die es auch gibt. Das prüft man vor dem Aufruf. Ob auswählbare Rezepte Zutaten enthalten die es gar nicht gibt, sollte nicht erst beim zubereiten auffallen. Und auch nicht so behandelt werden, dass die Zutat dann einfach ausgelassen wird. Ob für die Rezepte alle Zutaten zur Verfügung stehen, sollte am Anfang des Programm geprüft werden, bevor der Benutzer einen Cocktail auswählt. Zum Beispiel in dem nicht herstellbare Cocktails vorher ausgefiltert werden. Falls das Projekt mal um Füllstandssensoren für die Zutaten erweitert wird, ist so eine Prüfung vor jeder Ausgabe der Cocktail-Auswahl fällig.

    Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht was der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

    Kommentare vor Funktionen sind in der Regel, sofern sie nicht sowieso überflüssig sind, besser Docstrings der Funktionen.

    Tradition is just peer pressure from dead people.

  • Hallo,

    @_blackjack_ ich habe da 2 Fragen.

    1. Kannst du mir ein Beispielcode zeigen, damit ich den Aufbau verstehe. Ich glaube, ich habe da noch Lernbedarf. Möchte aber auch den Code dafür komplett selber erstellen. Learning by doing..... Aber für Tipps und Anregung habe ich ein ganz großes offenes Ohr und freu mich sehr darüber.

    2. Was nutzt ihr zu programmieren. Ich nehme Visual Studio. Gibt es etwas, was wie bei Arduino IDE funktioniert mit der Fehlerbeschreibung? Oder was ist mit Visual und Addons am besten, wenn man das benutzt?

    PS: Zu lesen habe ich jetzt erstmal genug da. Es hat auch keine Eile, soll erst nächstes Jahr zum Sommeranfang fertig werden. Hardware ist auch noch nicht da, Pi 5, Display, Mikro, Kamera und DHT11 fehlen noch. Habe ich wahrscheinlich erst Anfang Januar da.

    Wie oben als ersten Post geschrieben, soll viel mit dem Raspi passieren, Füllstandssensoren sollen auch kommen.

    Hier nochmal eine Liste, was alles sein soll:

    1.Mixen von Cocktails

    2. virtueller Barkeeper auf ein Display mit Emotionen und Mund/Augenbewegung

    3. Lokale KI, die angelernt werden soll ( noch nicht sicher)

    4. Sprachausgabe des virtuellen BK.

    5 Spracherkennung

    6. Merken des Gesichts und des zugehörigen Lieblingsgetränk

    7. Erkennen und persönliches Ansprechen des Benutzers mit Namen

    8. zusätzlich Zutaten zum Cocktail zumischen

    9. 2 Display mit Erklärung zum Cocktail und Mixanleitung ( zusätzlich gesprochen vielleicht)

    10. Neonring willkürlich leuchten lassen bei Leerlauf und bei mixen von rot zu grün faden lassen.

    Füllstandsanzeige, Temperaturanzeige und Luftfeuchtigkeit im Kühlschrank auf dem 2ten Display.


    Wenn mir noch was einfällt, ergänze ich es hier.


    Viele Grüße,


    Lars

  • Referent1601 Angesichts von

    Hier nochmal eine Liste, was alles sein soll:

    ist die Aussage

    Es hat auch keine Eile, soll erst nächstes Jahr zum Sommeranfang fertig werden.

    echt sportlich.

    Insbesondere bei Deinem bisherigen Programmierkenntnissen, soweit oben sichtbar. Und das ist absolut nicht böse gemeint!

    Unterschätze nicht den Aufwand, das alles zu programmieren.

    Fange mit (sehr viel) kleineren Teilprojekten/-aufgaben an und sammle Erfahrungen. Nur so als Anregung...

  • Ja, verstehe ich. Will da aber auch jede "freie Minute" dran Arbeiten. Ist ein Herzensprojekt von mir, da ich ein absoluter Fan von KI bin. Ich hatte schon eine Cocktailmaschine auf Arduino-Basis und Bluetooth. https://www.instructables.com/Appgesteuerter…Cr-Die-Ultimat/. Leider ist der Kühlschrank draufgegangen. War bei meinen Familien und Bekanntenkreis der absolute Hit. Denn Code dafür habe ich aber nicht alleine geschrieben, hatte da viel gute Hilfe dabei. War sozusagen ein Gemeinschaftscode. Und da der Pi 5 und Python so unendlich viele Möglichkeiten bietet, wollte ich es damit mal probieren. Und je mehr ich darüber lerne, um so mehr innovatives kann ich einfügen. ich bin willig, es zu lernen. Eine kleine Starthilfe brauch ich schon, danach versuch ich es so gut es geht. Und wenn ab und zu ein Profi von euch mal drüber schaut und mir Tipps gibt, kann ich das in der Zeit schon schaffen. Der Kühlschrank wird ja auch komplett selbst gebaut in DIY. Die Zeichnung und diverse Komponenten sind schon fertig. Bauen wird im Februar starten. Bauzeit 1 Monat ca.

    Gruß ,

    Lars

  • JA, hast du recht, nehme denn BMP280 dafür. Bin die ganze Zeit auch auf der Such nach einem günstigen, leistungsfähigen Peltierelement . Habe ja für alle Verbraucher ein 500 W PC-Netzteil, da kann ich auch das Element mit betreiben.

  • 1. Kannst du mir ein Beispielcode zeigen, damit ich den Aufbau verstehe


    Was nutzt ihr zu programmieren. Ich nehme Visual Studio. Gibt es etwas, was wie bei Arduino IDE funktioniert mit der Fehlerbeschreibung? Oder was ist mit Visual und Addons am besten, wenn man das benutzt?

    Was fehlt dir denn an Fehlerbeschreibungen? Hast du deinen Code mal ausgeführt? Sinnvoll ist es, den Code im Terminal zu starten und zu testen. Die Fehlerbeschreibung von Python finde ich schon recht aussagekräftig.

    Schreibe eine Funktion, die eine Tätigkeit macht und benenne die Funktion nach dieser Tätigkeit und dann teste die. Wenn das funktioniert, dann erweitere dein Programm um die nächste Funktion, dann wieder testen und so weiter.


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • ok, verstehe es jetzt. Denke mal als ganzen Code jetzt. Als erstes die Imports, die gebraucht werden. Danach, im meinem Beispiel, die Pins definieren. Dann wird die Funktion per def erstellt. zum Schluss muss noch Main erstellt werden.

    Jetzt habe ich schon gelernt:

    import = Module importieren

    def( definition)= Funktionsbeschreibung

    main= Das Hauptprogramm

    Import ist mir schon klar, alles, was an Modulen gebraucht wird, wird importiert. ( Time, GPIO, tts, vosk usw.)

    Bei def werden die einzelnen Funktionen geschrieben ( def GPIO_Pin, def Zutaten, def Cocktail, def mixen usw.)

    Nur bei main bin ich mir noch nicht sicher, bleibt es so oder kommt da noch was rein......

    Gruß Lars

  • Referent1601 GPIO_Pin, Zutaten, und Cocktail sind keine Funktionsnamen. Der Schreibweise nach sind das Klassen, denn Funktionsnamen sind per Konvention klein_mit_unterstrichen. Aber auch gpio_pin, zutaten, und cocktail wären keine sinnvollen Funktionsnamen, denn das sind Namen die ”Dinge” beschreiben. Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen. Also mixen() wäre ein Funktionsname. zutaten und cocktail könnten sinnvolle Namen von Argumenten für so eine Funktion sein.

    Zu den Namenskonventionen, und noch einiges andere, gibt es PEP 8 – Style Guide for Python Code.

    Falls noch nicht geschehen sollte man mal das Grundlagentutorial aus der Python-Dokumentation durchgearbeitet haben.

    Objektorientierung ist auch ein Thema das ich bei dem bisherigen Code noch nicht sehe, was aber Sinn macht. Und wenn es nur erst einmal nur Datenklassen sind, denn Klassen sind in Python der Verbunddatentyp.

    Ich denke es macht nicht so wirklich viel Sinn GPIO-Code zu schreiben ohne GPIOs zu haben, an die man mindestens mal Taster und LEDs hängen kann, zum testen. Ausser man schaut sich mal Unit-Tests an und kann die Hardware sinnvoll durch ”Attrappen” (Mock-Objekte) ersetzen. gpiozero hat da beispielsweise Unterstützung für. Als Testrahmenwerk ist pytest verbreitet.

    Tradition is just peer pressure from dead people.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!