1602 LCD GUI

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo,

    ich bin gerade an einem Projekt und würde gerne eine liste mit Auswahlmöglichkeiten auf meinem 1602 LCD Display darstellen und diese mit knöpfen auswählen.

    Mit einer Liste schaffe ich das, aber bei einer verschachtelten Hierarchie (also mehrere Auswahlmöglichkeiten hintereinander) komme ich an meine Grenzen. Ich habe mehrere Tage daran getüftelt und komme auf keine Lösung, die auch variable Erweiterungen zulässt (z.B. Wlan-Netzwerke in der Umgebung). Online habe ich auch nichts dazu gefunden.

    Ich habe schon einiges Probiert, daruner: verschachtelte Listen, Bäume, und hardcoded mit if elses und manuellem zuweisen der listen, ...


    Habt ihr irgendwelche guten Ansätze?

    Gibt es eine Library die ich hierfür nutzen könnte oder einen speziellen Suchbegriff über den ich noch nicht gestolpert bin?


    Danke im Vorraus

  • Hallo,


    um welche Programmiersprache geht es denn? Wie sieht der aktuelle Stand aus und was soll das Programm genau können?


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧

  • Ich würd einfach ne Liste von Tupeln anlegen mit den Menüpunkten und einem Index, der die Position im (hierarchischen) Menü angibt. Für ein Menü mit vier Hierarchiestufen zum Beispiel so:


    1     Menüpunkt 1

    11    Menüpunkt 1.1

    12    Menüpunkt 1.2

    2     Menüpunkt 2

    21    Menüpunkt 2.1

    22    Menüpunkt 2.2

    221   Menüpunkt 2.2.1

    222   Menüpunkt 2.2.2

    23    Menüpunkt 2.3

    3     Menüpunkt 3


    Anhand der Zahlen kannst du die Menüpunkte auswählen, die jeweils angezeigt werden müssen, wenn du in einem bestimmten Untermenü bist. Wenn du zum Beispiel im Menü 2.2 bist, müssen alle Menüpunkte von 221 bis 229 angezeigt werden. die kannst du leicht in der Liste finden.
    Am Anfang werden die Menüpunkte 1-9 angezeigt (soweit vorhanden). Wenn du 2 auswählst, werden 21 bis 29 angezeigt, wählst du dort die 2, werden 221 bis 229 angezeigt. Springst du zurück, fällt wieder eine Ziffer weg und zu zeigst wieder 21 bis 29 an...

    Natürlich musst du als erste Zeile immer noch einen Menüeintrag "Zurück (zur vorherigen Ebene)" einbauen, den musst du aber nicht in der Liste definieren, sondern kannst ihn ins Programm fest einbauen.


    Ich hab sowas schon mal programmiert - das funktioniert ziemlich gut und es ist einfach, Menüpunkte zu ändern. Über die aktuelle Indexzahl weißt du auch immer, in welchem Menüpunkt du gerade bist oder zuletzt gewesen bist.


    So hast du 9 Einträge pro Menüebene. Wenn du die 0 dazu nimmst, kannst du sogar 10 machen - ist nur etwas verwirrend dann, weil 0 der erste, 1 der zweite, ... ist.
    Wenn du mehr als 9 oder 10 Einträge hast, kannst du auch zweistellig arbeiten, also 020202 statt 222, dann hast du 99 Einträge und springst immer zwei Stellen in der Indexzahl und listest dann zum Beispiel die Menüpunkte 020201 bis 020299 auf. (Die führende Null ist natürlich nur zur Veranschaulichung - gerechnet wird z. B. mit 20202.)

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited 6 times, last by Gnom ().

  • um welche Programmiersprache geht es denn?

    Wie sieht der aktuelle Stand aus und was soll das Programm genau können?

    Ich programmiere in Python.

    Der aktuelle Stand ist nichts... ich habe einiges versucht, bin aber auf keine Lösung gekommen.

    Das Programm soll mit Hilfe von Tastern in einem Menü navigieren und das auf nem LCD Display ausgeben.

  • Ich würd einfach ne Liste von Tupeln anlegen mit den Menüpunkten und einem Index, der die Position im (hierarchischen) Menü angibt.


    Wenn du mehr als 9 oder 10 Einträge hast, kannst du auch zweistellig arbeiten, also 020202 statt 222, dann hast du 99 Einträge und springst immer zwei Stellen in der Indexzahl und listest dann zum Beispiel die Menüpunkte 020201 bis 020299 auf. (Die führende Null ist natürlich nur zur Veranschaulichung - gerechnet wird z. B. mit 20202.)

    Danke, das klingt wirklich vielversprechend. Ich hatte einen ähnlichen Ansatz, nur mit den Überschriften und das ist bisschen verwirrend.

    ich denke ich realisiere das mit den Zehnerstellen um mehrere Einträge machen zu können (20202).

  • Wenn du gerne experimentierst und tiefer ins Programmieren einsteigen willst, kannst du versuchen, das rekursiv zu programmieren. Das bietet sich bei dieser Aufgabe geradezu an. Man kann es aber auch gut und wahrscheinlich sogar einfacher und verständlicher ohne Rekursion lösen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Wenn du gerne experimentierst und tiefer ins Programmieren einsteigen willst, kannst du versuchen, das rekursiv zu programmieren. Das bietet sich bei dieser Aufgabe geradezu an. Man kann es aber auch gut und wahrscheinlich sogar einfacher und verständlicher ohne Rekursion lösen.

    ich bin eigentlich schon bisschen über die Grundlagen hinaus, aber nur aus Interesse, weil ich mich mit Rekursion manchmal bisschen schwer tue, wie würde das aussehen?

  • Na so grob gesagt, du baust eine Funktion, die mit dem Parameter 0 aufgerufen wird und die Menüpunkte der obersten Ebene anzeigt. Mit der Liste unter #3 wären das die Menüpunkte 1-10 (soweit vorhanden), also 0*10 +1 bist 0*10+9. Bei Auswahl eines Punktes ruft dfie Funktion sich selbst mit der Nummer des Menüpunktes auf (z.B. 2). Die Funktion ruft jetzt 2*10+1 bis 2*10+9 auf (soweit vorhanden). Wird wieder eine ausgewählt, z. B. 23, dann ruft die Funtion wieder sich selbst auf... usw. Wird zurück ausgewählt, springt das Programm mit dem Rückgabewert des ursprünglich übergebenen Parameters in die vorige Ebene zurück und die dortige Auswahl wird wieder angezeigt. Gibt es keine Unterpunkte mehr, so wurde eine Funktion oder sowas ausgewählt. Die Funktion gibt den ausgewählten Punkt als Rückgabwert zurück. Alle vorher aufgerufenen Funktionen benden sich ebenfalls und geben den Wert weiter. Ganz unten in der Funktionskette kommt dann der Rückgabewert, also der gewählte Befehl an.
    Man kann das vielleicht auch mit verschachtelte Listen machen, die sind aber ziemlich unübersichtlich. Es geht sehr viel einfacher mit einer Liste wie schon unter #3 beschrieben.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Das sind wirklich alles klasse antworten und die Sind wahnsinnig Hilfreich!


    Mich macht nur die Datenstruktur dazu fertig:

    ich dachte an einen verschachtelten Tupel, ungefähr so...

    Code
    interface = ('Hauptmenü', )

    das ist der oberste Zugangspunkt.


    Code
    interface[0]

    das stellt dann die erste Überschrift dar.


    Code
    wlan = ('wlan', netzwerk1, netzwerk2)
    netzwerk1 = (essid, signalstärke, ...)
    netzwerk2 = () // genau s


    wenn man das zusammenfügt

    Code
    interface = ('Hauptmenü', wlan, ...)

    dann ist jeder menüpunkt darunter teil des interface Tupels


    Zumindest war das mein Gedanke, weil ich so gemütlich den ersten Eintrag als 'Hauptfenster' markieren kann und dann nur noch die ersten Einträge der folgenden Tupels ausgeben muss.


    An diesem Punkt bin ich festgefahren in einer scheinbar einfachen Aufgabe.

    Ich weiß wirklich nicht mehr weiter, vor allem, weil ich da ja noch navigieren muss...

    Was sind eure Gedanken dazu?

  • Hallo,


    mir fehlen ehrlich gesagt immer noch Informationen oder ich bin zu doof die Problemstellung aus den gegebenen Infos genau zu erkennen.

    Du hast so ein Display und dazu physikalische Taster angeschlossen, ich vermute mal drei? Einmal für vorwärts, einmal zurück und einmal zum bestätigen?


    Du startest dein System, was wird (oder soll) auf dem Display dann stehen? Ich kann mir auf so einem kleinen Display ein Menü mit weiteren Unterpunkten nicht so recht vorstellen. Vielleicht kannst du beschreiben, wie du dir die Bedienung vorstellst und was dabei auf dem Display passieren soll.


    Kann auch sein, ich habe eine ganz falsche Vorstellung von deinem Vorhaben. Deswegen kann ich mal grundsätzlich antworten im Bezug auf deinen letzten Post.

    Vielleicht solltest du ein Dictonary verwenden:


    Code
    interface = {'Hauptmenue': ['wlan', 'netzwerk'], 'Anderes': 'Noch was'}
    print(interface)
    print(interface.keys())
    print(interface['Hauptmenue'])
    print(interface['Hauptmenue'][0])
    
    for menu in interface:
        print(menu)


    Code
    {'Hauptmenue': ['wlan', 'netzwerk'], 'Anderes': 'Noch was'}
    dict_keys(['Hauptmenue', 'Anderes'])
    ['wlan', 'netzwerk']
    wlan
    Hauptmenue
    Anderes

    https://docs.python.org/3/c-api/dict.html


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧