Forum: Mikrocontroller und Digitale Elektronik Implementierung von Menüs auf alphanumerischen Displays


von Third E. (third-eye)


Lesenswert?

Hallo,

ich habe immer wieder mal Anwendungen, bei denen ich ein 
HD44780-kompatibles Display an einem AVR betreibe. Es sollen mehrere 
Seiten (nur eine Ebene) dargestellt werden. Es sollen Messwerte 
angezeigt werden und manche Werte (Parameter) sollen editierbar sein. 
Ich habe da schon mal was "zu Fuß" erstellt. Am Ende war es aber dann 
doch eher umständlich (switch-case je nachdem welche Seite dargestellt 
wurde, welche Werte "fest" sind, welche editierbar sind usw.)
Es gibt die Tasten "Auf" und "Ab" und eine für Edit/Bestätigen. Mit Auf 
und Ab wird zeilenweise gesprungen, ggf. auf die nächste Seite.
Wie würdet ihr das machen?
Gibt es vielleicht eine Library dafür?
Gibt es irgendwo Architektur-Vorschläge?

Danke.
Third Eye

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Lerne Programmieren. Denke dir passenden Datenstrukturen aus. 
Implementiere diese.

von Michael B. (laberkopp)


Lesenswert?

Third E. schrieb:
> Wie würdet ihr das machen

Das
https://www.ebay.de/itm/387340096847 nutzt einen einzigen Knopf dafür, 
lang und kurz drücken und abwarten, geht auch.

Diese Ding hat 3 Tasten und erlaubt Eingabe von Schritten ganzer 
Ablaufsequenzen https://www.ebay.de/itm/115340606301

Entscheidend bei der Programmierung ist immer ein 'dont mode me in' also 
nur 1 Stelle im Programm an der die Tasten abgefragt werden, nur eine 
state machine um sie auszuwerten, man muss halt per Variablen wissen was 
gerade dargestellt wird.

Simple Menüs haben nur 1 Ebene, mit 'vorwärts' blättert man also alle 
durch, nach dem letzten kommt der erste. Komplexere Menüs sind 
hierarchisch, man muss in Ebenen eintauchen und wieder raus, das ergibt 
auch fast von selbst einen Weg bis zum Wert und dessen 
Einstellmöglichkeit Ziffer für Ziffer.

Fertig kenne ich flexiblen code nicht.

von Johnny B. (johnnyb)


Lesenswert?

Third E. schrieb:
> Gibt es irgendwo Architektur-Vorschläge?

Ich denke nicht, dass es da eine ultimative Lösung gibt. Ich habe da 
schon die wildesten Implementationen gesehen mit Funktionspointern und 
was weiss ich was; aber je ausgeklügelter, desto weniger wartbar wird 
das Ganze, wenn plötzlich Anforderungen kommen, an welche nicht gedacht 
wurde oder die einfach nicht ins Konzept passen.
Meiner Meinung nach also die Implementation möglichst einfach und 
flexibel halten, mit switch/case für jede Ansicht, das ist völlig ok. 
Schlussendlich ist es den Anwendern egal wie elegant es implementiert 
ist oder nicht, es muss einfach gut funktionieren.

von Gregor J. (Firma: Jasinski) (gregor_jasinski)


Lesenswert?

Third E. schrieb:
> Ich habe da schon mal was "zu Fuß" erstellt. Am Ende war es aber dann
> doch eher umständlich (switch-case je nachdem welche Seite dargestellt
> wurde, welche Werte "fest" sind, welche editierbar sind usw.)

Bei unter 10 Bildschirmen ist eine Switch-Abfrage für die Darstellung 
eines bestimmten Bildschirms völlig OK – das nutze ich z.B. bei 
Bildschirmen mit dem MAX7219. Man muss nicht alles unnötig kompliziert 
machen, wenn es einfach geht und von der Performance her unproblematisch 
ist; und bei 99% der Fälle mit einfachen Bildschirmmenüs spielt die 
Performance überhaupt keine Rolle. Eine universelle Lösung für alles 
wird man eh nicht machen können und nach so einer Schablone krampfhaft 
zu suchen sollte man am besten auch nicht, denn es ändert sich immer 
etwas von Fall zu Fall. Eine gewisse Programm-Schablone für das nächste 
eigene Projekt kann man daraus später aber fast immer ableiten – wichtig 
ist nur, dass man sich in dem eigenen 'Programm-Chaos' nach kurzer 
Einlesephase zurechtfindet, also das ganze Geschriebene nach und nach 
gut strukturiert und kommentiert, um am Ende ein brauchbares Muster 
daraus ableiten zu können. Auf fremde Programme verzichte ich 
grundsätzlich immer, da ich das Geschriebene immer zu 100% verstehen 
möchte und das bei fremder Software oft nicht so einfach ist, zu 
durchschauen, was das Programm macht. Oft ist es auch so, dass die 
genaue Einarbeitung in den fremden Code in der Regel deutlich mehr Zeit 
erfordert als es selbst zu schreiben. Gewisse Techniken und Tricks 
abschauen kann man sich aber immer – verboten ist es nicht und etwas 
lernen kann man dabei manchmal auch noch, im Netz gibt es aber auch viel 
dummes Zeug, insofern sollte man beim Abschauen immer Vorsicht walten 
lassen und Skepsis an den Tag legen.

von M. K. (kichi)


Lesenswert?

Keine Ahnung ob das produktiv brauchbar ist, als erste Anregung aber 
sicher nicht verkehrt:
https://www.mikrocontroller.net/articles/Men%C3%BC
https://www.mikrocontroller.net/articles/YaMen%C3%BC

von Frank O. (frank_o)


Lesenswert?

Wenn es das fertig zu kaufen gibt und der Preis gerechtfertig ist und im 
bezahlbaren Bereich liegt, ist es besser was zu kaufen. Da bin ich ganz 
bei Michael. Lebenszeit ist sehr kostbar.
Dann kann man auch Code "klauen" und anpassen. Im Grunde ist das ja 
schon bei einer Bibliothek schon so.
Aber manchmal muss man halt auch selbst tippen was das Zeug hält.
Meist mit der Erkenntnis, dass man schon wieder viel zu viel vergessen 
hat.
Und dann, wenn man fertig ist, gelobt man, dass man doch wieder vieles 
selbst programmieren will und schon ist da wieder ein Code der fast 
passt ...

von Timo N. (tnn85)


Lesenswert?

Ich stand auch vor dem Problem und hatte mir folgende Arduino Library 
mal angeschaut, aber habe es nicht weiterverfolgt, da Projekt pausiert:
https://github.com/neu-rah/ArduinoMenu

Ich meine es müssten HD44780 Displays unterstützt werden.

von Cyblord -. (cyblord)


Lesenswert?

Timo N. schrieb:
> Ich stand auch vor dem Problem und hatte mir folgende Arduino Library
> mal angeschaut, aber habe es nicht weiterverfolgt, da Projekt pausiert:
> https://github.com/neu-rah/ArduinoMenu
>
> Ich meine es müssten HD44780 Displays unterstützt werden.

Warum fällt es euch Arduinos so schwer einfach mal was selbst zu 
entwickeln?

: Bearbeitet durch User
von Timo N. (tnn85)


Lesenswert?

Cyblord -. schrieb:
> Warum fällt es euch Arduinos so schwer einfach mal was selbst zu
> entwickeln?

Euch Arduinos?
Es fällt mir nur schwer, weil es Zeit kostet. Das ist alles.

Es gibt so einen Spruch: Man muss das Rad nicht neu erfinden.

Warum fällt es dir so schwer den PC, auf dem du das geschrieben hast 
selbst zu entwickeln? Die Platinen selbst zu designen und herzustellen, 
das Betriebssystem selbst zu schreiben, usw usw.

Entwicklung hat immer schon auf Basis anderer, vorheriger Entwicklung 
stattgefunden.
Wer meint etwas, was schon vorhanden ist selbst machen zu müssen,
der hat:

a) zu viel Zeit oder
b) will nur etwas lernen oder
c) ist mit dem Vorhandenen nicht zufrieden.

Wenn b und c ausscheiden, weil es im gegebenen Fall nicht zutrifft, dem 
ist nicht zu helfen.

von Christoph E. (stoppi)


Lesenswert?

@Cyblord: Das mit den Arduinos ist wohl eine rhetorische Frage oder?

Naja, weil es liegt meiner Meinung nach auf der Hand. Arduino-Lösungen 
sind äußerst bequem und führen einen zumeist ohne große Anstrengung und 
Aufwand zum Ziel. Den viel steinigeren Weg, den die Leute in der 
Vergangenheit auf sich genommen haben, will heutzutage fast keiner mehr 
gehen. Das soll aber überhaupt kein Vorwurf sein. Denn man muss sich 
dann immer selbst die Frage stellen, wäre ich in der heutigen Zeit nicht 
auch so?
Die Zeit ist extrem schnelllebig geworden. Mich wundert es ja 
eigentlich, dass heute von Studenten noch verlangt wird, ganze Bücher zu 
lernen, wie es bei mir der Fall war. Oder ist dies eh bereits anders?

Und den Groll der alten Generation auf die Arduinos kann ich auch 
nachvollziehen. Denn da gibt es nun eine Generation, die öfters eben 
nicht den harten Weg geht wie sie selbst und scheinbar nicht mehr so 
bereit ist, sich über lange Zeit anzustrengen und einem Ziel zu folgen. 
Da spielt mMn auch etwas Neid mit und man will ihnen den nun leichter 
erzielten Erfolg nicht so wirklich gönnen.

Ich persönlich bin zum Beispiel mit Sicherheit alles andere als ein 
guter Programmierer und greife ebenfalls eigentlich fast immer auf einen 
Arduino zurück. Ich versuche aber wenigstens einigermaßen kreativ die 
Fertiglösungen zu kombinieren/adaptieren bzw. Zu etwas neuem zu 
vereinen.

von Achim H. (pluto25)


Lesenswert?

Timo N. schrieb:
> c) ist mit dem Vorhandenen nicht zufrieden.
Gilt das nicht mittlerweile für fast alles ;-)
@third-eye Dazu gibt es unzählige Lösungen, die Frage ist welche würde 
Dir gefallen?

von Cyblord -. (cyblord)


Lesenswert?

Timo N. schrieb:
> Euch Arduinos?
> Es fällt mir nur schwer, weil es Zeit kostet. Das ist alles.
>
> Es gibt so einen Spruch: Man muss das Rad nicht neu erfinden.

Ja nur geht es hier ja genau da drum dass der TE eben nicht mal schnell 
was fertiges findet.
Und dann liegt es auf der Hand das selbst zu machen. Und nicht 4 Monate 
in Foren rumzufragen.
Entwickler sollten entwickeln. Zumindest wenn es nötig wird.

Christoph E. schrieb:
> Und den Groll der alten Generation auf die Arduinos kann ich auch
> nachvollziehen. Denn da gibt es nun eine Generation, die öfters eben
> nicht den harten Weg geht wie sie selbst und scheinbar nicht mehr so
> bereit ist, sich über lange Zeit anzustrengen und einem Ziel zu folgen.
> Da spielt mMn auch etwas Neid mit und man will ihnen den nun leichter
> erzielten Erfolg nicht so wirklich gönnen.

Diese Prämisse ist völliger Unsinn. Vor allem hier kommt der TE ja nicht 
mal zum Ziel. ICH kann mir einfach eine Multi-Level Menülib schreiben 
wenn ich das brauche.
Der TE offensichtlich nicht.

Kaum ein Arduino-Kasper kann ja, trotz vermeintlicher Einfachheit, 
irgendwas sinnvolles damit tun, was über die Example Programm 
Komplexität rausgeht.
Neid auf was? Ich hatte nie Mühle oder Qual irgendwas zu entwickeln und 
moderne Microcontroller machen uns allen das Leben sehr leicht.
Wenn ich SELBST entwickeln und VERSTEHEN schrecklich finden würde, wäre 
ich Gärtner geworden. Oder Schlitzeklopfer aufm Bau.

Bei Arduinos dominiert bei mir eher Mitleid. Weil die Nutzer selbst so 
wenig können und das merken die dann auch sehr bald. Und trotz der 
vermeintlichen Einfachheit klappt es einfach nie wirklich und 
Fehlersuche geht dann auch nicht, weil kein Wissen. Das muss 
frustrierend sein.

Und der TE hat immer noch kein Menü. Nicht weil er nicht will, weil er 
weiß er kann gar nicht selbst. Er hat nur eine Chance: Jemand muss es 
gemacht haben und ihm geben. Mehr bleibt ihm nicht.

: Bearbeitet durch User
Beitrag #7833942 wurde vom Autor gelöscht.
von Andreas B. (bitverdreher)


Lesenswert?

Christoph E. schrieb:
> Die Zeit ist extrem schnelllebig geworden. Mich wundert es ja
> eigentlich, dass heute von Studenten noch verlangt wird, ganze Bücher zu
> lernen, wie es bei mir der Fall war. Oder ist dies eh bereits anders?

Keine Ahnung. Wenn aber den Studenten heutzutage keine Grundlagen mehr 
abverlangt werden, dann frage ich mich, wer denn zukuenftig mal all die 
tollen Werkzeuge erstellen soll, die diese Spezialisten spaeter mal 
verwenden wollen.

Christoph E. schrieb:
> Da spielt mMn auch etwas Neid mit und man will ihnen den nun leichter
> erzielten Erfolg nicht so wirklich gönnen.

Hmm, also mein Erfolgserlebnis bekomme ich dadurch dass ich etwas 
eigenes erschaffen habe. Irgendetwas zu kopieren mag zwar auch zum Ziel 
fueheren, aber stolz bin ich auf so etwas nicht.
Ich koennte ja auch neidisch auf alle Reichen sein, die sich so einen 
Kram einfach kaufen, anstatt es selbst zu bauen.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Andreas B. schrieb:
> Hmm, also mein Erfolgserlebnis bekomme ich dadurch dass ich etwas
> eigenes erschaffen habe. Irgendetwas zu kopieren mag zwar auch zum Ziel
> fueheren, aber stolz bin ich auf so etwas nicht.

Hmm, also mein Erfolgserlebnis bekomme ich dadurch, dass ich für eine 
gegebene Aufgabe eine gute Lösung gefunden habe.
Je schneller und aufwandsärmer desto besser. Das Rad neu zu erfinden mag 
zwar irgendwann auch zum Ziel führen, aber stolz bin ich auf so etwas 
nicht.

von Andreas B. (bitverdreher)


Lesenswert?

Tja, da sieht man, daß sich die Menschen halt unterscheiden.
Stolz bin ich nur auf selbst geleistetes. Und irgend etwas 
zusammenzustöpseln, gehört halt nicht dazu. Klar kommt man damit (oft) 
schneller zu Ziel, aber die Frage bleibt bei einem Hobby: Was ist 
wichtiger: der Weg oder das Ziel?
Und auch wenn es beruflich ist: Zusammenstöpseln und abgehakt, ok. Aber 
stolz darauf zu sein?

von Crazy Harry (crazy_h)


Lesenswert?

@Cyblord: Full Ack .... was noch dazu kommt, nicht nur die Programme, 
ääähh Sketches 😁, sind zusammen geschustert, auch die Schaltung selber, 
denn ohne Shields geht garnichts. Was evtl. geht, ist eine Platine 
malen, die alle Shields und den Arduino zusammenbacken.

von Karl K. (leluno)


Lesenswert?

ich hab so etwas mal gemacht:
Beitrag "Menu zur Einstellung RTC per Fernbedienung"

Man muss ja öfters irgendwelche Einstellungen auf dem uc vornehmen. Geht 
einfacher mit einer seriellen Verbindung zum pc.

von Klaus (feelfree)


Lesenswert?

Andreas B. schrieb:
> Stolz bin ich nur auf selbst geleistetes

Und ab wann ist es "selbst geleistet"?

Transistoren selbst entworfen oder fertig gekauft?
Integrierte Schaltkreise selbst entworfen oder fertig gekauft?
Mikrocontroller selbst entworfen oder fertig gekauft?
Assembler zur Hilfe genommen oder direkt in Hex geschrieben?
Hochsprache zur Hilfe genommen oder direkt in Assembler geschrieben?
Fertige Library (zB C Standard Library) genommen oder printf zu Fuß 
programmiert?

Diese Fragen waren alle rhetorisch. Und jetzt frage dich mal, warum du 
ausgerechnet hier aufhörst und nicht eine weitere fertige Schicht dazu 
nimmst, so es sie gibt.

von Andreas B. (bitverdreher)


Lesenswert?

Klaus schrieb:
> Und ab wann ist es "selbst geleistet"?
Wenn man irgendwelche Leistungen dafuer erbracht hat. Und dazu gehoert 
eben nicht kopieren oder in Foren nach fertigen Loesungen zu fragen.

Klaus schrieb:
> Diese Fragen waren alle rhetorisch. Und jetzt frage dich mal, warum du
> ausgerechnet hier aufhörst und nicht eine weitere fertige Schicht dazu
> nimmst, so es sie gibt.

Weil man Transistoren nicht einfach so selber baut. Ebenso IC's. das hat 
eben nichts mit Brain zu tun, sondern mit dem Equipment das man dazu 
braucht.
SW hingegen ist auch fuer jemanden, der sich nicht alles leisten kann, 
erstellbar.
In Assembler schreibe ich im uebrigen auch, wenn es notwendig ist 
(kleine Controller).

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Andreas B. schrieb:
> Wenn man irgendwelche Leistungen dafuer erbracht hat. Und dazu gehoert
> eben nicht kopieren oder in Foren nach fertigen Loesungen zu fragen.

Doch, das gehört eben sehr wohl dazu. Jemand, der durch suchen, anpassen 
und zusammenfügen von exisitierenden Teillösungen etwas Neues erschafft, 
das seinen Anforderungen genügt, hat etwas geleistet.

Beispiel:
Wenn es eine Funktion zur Ausgabe von zur Laufzeit berechneten Strings 
gibt, dann nutze ich die. Und du vermutlich auch. Das Beispiel printf 
habe ich oben schon genannt.
Wenn es eine Funktion zur Ausgabe eines Menüs und Auswählen eines 
Menüpunktes gibt, dann nutze ich die. Du nicht, warum auch immer.

: Bearbeitet durch User
von Thorsten M. (pappkamerad)


Lesenswert?

Ontopic:

Johnny B. schrieb:
> Ich habe da
> schon die wildesten Implementationen gesehen mit Funktionspointern und
> was weiss ich was; aber je ausgeklügelter, desto weniger wartbar wird
> das Ganze, wenn plötzlich Anforderungen kommen, an welche nicht gedacht
> wurde oder die einfach nicht ins Konzept passen.

Abstraktion ist immer wichtig. Ich würde (und habe in einem ähnlichen 
Fall schon) Funktionspointer verwendet, um Handler für den Tastendruck 
und langen Tastendruck zuzuweisen. So wird das ganze eventbasiert und 
man braucht weder Switch-Orgien noch Zustandsautomaten. Der Vorteil 
dabei ist, dass man jeden Tastendruckhandler getrennt implementiert und 
bei neuen Einträgen nicht in den Swicth-Listen rumfuhrwerken muss und 
potentiell an unvorhergesehenen Stellen Fehler einbaut. Ich hab es dann 
auch so gemacht, dass beim Sprung im Menü über eine Funktion alle 
Tasten-Handler übergeben werden, die nichtbenötigten eben mit einem 
Null-Pointer, um sicher zu sein, dass man nicht noch Handler aus vorigen 
Menüebenen mitschleppt.

von Andreas B. (bitverdreher)


Lesenswert?

Klaus schrieb:
> Wenn es eine Funktion zur Ausgabe eines Menüs und Auswählen eines
> Menüpunktes gibt, dann nutze ich die. Du nicht, warum auch immer.

wenn sie bei mir auf dem Schreibtisch liegt oder schnell gefunden ist, 
dann ja. Ansonsten schreibe ich sie eben selbst. Und wenn ich das nicht 
kann, lerne ich es.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Wenn es eine Funktion zur Ausgabe eines Menüs und Auswählen eines
> Menüpunktes gibt, dann nutze ich die. Du nicht, warum auch immer.

Hast du die Lib schon hier verlinkt? der TE sucht ja zufällig eine. 
Immer her damit.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Klaus schrieb:
>> Wenn es eine Funktion zur Ausgabe eines Menüs und Auswählen eines
>> Menüpunktes gibt, dann nutze ich die. Du nicht, warum auch immer.
>
> Hast du die Lib schon hier verlinkt? der TE sucht ja zufällig eine.
> Immer her damit.

Konditionalsätze sinnerfassend zu verarbeiten gelingt nicht jedem.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord -. schrieb:
>> Klaus schrieb:
>>> Wenn es eine Funktion zur Ausgabe eines Menüs und Auswählen eines
>>> Menüpunktes gibt, dann nutze ich die. Du nicht, warum auch immer.
>>
>> Hast du die Lib schon hier verlinkt? der TE sucht ja zufällig eine.
>> Immer her damit.
>
> Konditionalsätze sinnerfassend zu verarbeiten gelingt nicht jedem.

Der Punkt ist doch gerade dass er eben keine passende lib findet. 
Deshalb einfach selbst machen. Da zieht halt das Deppen-Argument vom 
"Rad neu erfinden" nicht. Du bringst es trotzdem. Warum auch immer.

Aber wie soll er? Wenn man keine Erfahrung im selber entwickeln hat, 
geht das eben auch nicht. Darum ist diese ganze Arduino-Sache eine 
Sackgasse. Man baut kein Wissen auf um da raus zu kommen und mehr 
möglich machen zu können als fertige libs hergeben.

Man kann nicht 20 Jahre den Aufzug nehmen und dann eines Tages, wenn der 
kaputt ist, das Kletterzeug rausholen und raufklettern. Geht nicht.

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

https://www.arduinolibraries.info/categories/display

oder auf der Site nach 'Menu' suchen. Da gibt es reichlich.

https://github.com/VasilKalchev/LiquidMenu
https://github.com/Jomelo/LCDMenuLib
https://github.com/Jomelo/LCDMenuLib2

sieht alles gut aus.

Es gibt halt Leute für die ist die µC Programmierung nicht Lebenszweck 
sondern Mittel zum Zweck. Nicht jeder hat die Ideen alles generisch mit 
Funktionszeigern zu realisieren, da ist die Arroganz derjenigen die hier 
viel Zeit in C/C++/Asm Programmierung stecken völlig überflüssig.

von Cyblord -. (cyblord)


Lesenswert?

J. S. schrieb:
> Es gibt halt Leute für die ist die µC Programmierung nicht Lebenszweck
> sondern Mittel zum Zweck. Nicht jeder hat die Ideen alles generisch mit
> Funktionszeigern zu realisieren, da ist die Arroganz derjenigen die hier
> viel Zeit in C/C++/Asm Programmierung stecken völlig überflüssig.

Es würde sich um Arroganz handeln WENN man ohne Ahnung und Wissen 
komplexe Probleme lösen könnte. Aber der TE kann es nicht, sonst würde 
er hier nicht schreiben.
Deshalb handelt es sich um Erfahrung. Vielleicht wissen diejenigen die 
viel Zeit in C/C++/Asm Programmierung stecken darüber ein paar Dinge 
einfach besser. Vielleicht haben die Recht? Wer weiß!

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Thorsten M. schrieb:
> Ich würde (und habe in einem ähnlichen Fall schon) Funktionspointer
> verwendet, um Handler für den Tastendruck und langen Tastendruck
> zuzuweisen. So wird das ganze eventbasiert und man braucht weder
> Switch-Orgien noch Zustandsautomaten. Der Vorteil dabei ist, dass man
> jeden Tastendruckhandler getrennt implementiert und bei neuen Einträgen
> nicht in den Swicth-Listen rumfuhrwerken muss und potentiell an
> unvorhergesehenen Stellen Fehler einbaut.

Klingt wie der direkte Weg in die Hölle überkomplexer Software.

Nehmen wir nur 4 Tasten, up down left right. Nehmen wir simple 
Zahleneingabe 0000 bis 9999.
Dann macht up +1, down -1 und right nächste Stelle von 1-4, wobei es 
nach Stelle 4 den Wert speichert und left steht mal für Abbruch, nicht 1 
Stelle zurück.

Da du keine Zustände 'wir sind auf Ziffer 2' speichern willst brauchen 
wir 13 Tastenhandler.
1
upondigit1 digit[0]++;
2
downondigit1 digit[0]--;
3
rightondigit1 newhandler(upondigit2,downondigit2,rightondigit2,leftcancel);
4
upondigit2 digit[1]++;
5
downondigit12 digit[1]--;
6
rightondigit12 newhandler(upondigit3,downondigit3,rightondigit3,leftcancel);
7
upondigit3 digit[2]++;
8
downondigit3 digit[2]--;
9
rightondigit3 newhandler(upondigit2,downondigit2,rightondigit2,leftcancel);
10
upondigit13 digit[3]++;
11
downondigit3 digit[3]--;
12
rightondigit3 value1=atoi(digit); newhandler(uponmenuvalue1,downonmenuvslze1,rightonmenuvalue1,NULL);
13
leftcancel
und natürlich den ganzen code der das Display und den Cursor updated.

Natürlich hast du eine state maschine, natürlich hast du einen Zustand, 
bloss nicht als einfach zugängliche Zahlen aktuellestelle=2 
aktuellervalue=1 sondern kreuz und quer versteckt in Funktionspointern.

Es ist so viel einfacher, ein case zu einem switch hinzuzufügen.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Da zieht halt das Deppen-Argument vom
> "Rad neu erfinden" nicht.

Oben ist eine Lib verlinkt, die ich nicht kenne und deren Eignung ich 
nicht einschätzen kann. Wenn ich aber vor der Aufgabe stünde würde ich 
die Lib auf Eignung prüfen und ggf. verwenden.

Cyblords lassen sich dagegen lieber von Hasswörtern triggern und hauen 
ein pauschales

Cyblord -. schrieb:
> Warum fällt es euch Arduinos so schwer einfach mal was selbst zu
> entwickeln?

raus.

Kann man machen. Ist halt deppert.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblords lassen sich dagegen lieber von Hasswörtern triggern und hauen
> ein pauschales
>
> Cyblord -. schrieb:
>> Warum fällt es euch Arduinos so schwer einfach mal was selbst zu
>> entwickeln?

Daran ist nichts falsch. Darüber meckern immer nur die Versager die es 
nicht können. Die anderen machen einfach.
Das mit dem selber entwickeln war ein Gratis-Tipp. Annehmen oder es 
lassen. So wie mit dem Hund und dem Knochen.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Michael B. schrieb:
> Es ist so viel einfacher, ein case zu einem switch hinzuzufügen.

Allerdings kannst du mit Funktionspointern eben eine komplett in sich 
abgeschlossene Lib machen die ein Nutzer nicht anpassen muss. Die du 
sogar kompiliert ausliefern kannst.

Dein Code ist im User Code verwoben und kann nicht mehr davon 
abgekapselt werden.

Und mit einer abgeschlossene lib kannst du ein Problem wirklich nur 
EINMAL lösen und immer wieder für verschiedene Projekte verwenden. Das 
ist der große Vorteil von Funktionspointern.

Allerdings muss kein Anfänger erst mal ein Problem mit Funktionspointern 
lösen es würde reichen erst mal ein halbwegs gutes Modul zu schreiben 
mit halbwegs guten Schnittstellen. Da wäre erst mal Aufgabe und Erfolg 
genug. Keine Frage.

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Cyblord -. schrieb:
> Dein Code ist im User Code verwoben und kann nicht mehr davon
> abgekapselt werden.

Mein code IST der user-code und tut was, nämlich genau das was getan 
werden muss, ohne overhead der nichts tut sondern nur 'abkapselt' (aka 
den Überblick behindert).

Du weisst übrigens gar nicht wie mein code wäre. Aber du heisst auch 
nicht Torsten.

von Cyblord -. (cyblord)


Lesenswert?

Michael B. schrieb:
> Cyblord -. schrieb:
>> Dein Code ist im User Code verwoben und kann nicht mehr davon
>> abgekapselt werden.
>
> Mein code IST der user-code und tut was, nämlich genau das was getan
> werden muss, ohne overhead der nichts tut sondern nur 'abkapselt' (aka
> den Überblick behindert).

Ja das ist auch ok.
Aber damit löst man eben das problem jedes mal wieder neu. Irgendwann 
will man evt. mal ein lib. Und dann geht das so nicht mehr.

> Du weisst übrigens gar nicht wie mein code wäre. Aber du heisst auch
> nicht Torsten.

Ich habe nur den Code kommentiert den du gepostet hast.

Abstraktion ist die eine Lösung um Komplexität in den Griff zu bekommen. 
"Überblick" bedeutet bei dir nur, dass man immer jedes Detail des Code 
im Blick haben MUSS.
Eine gute Abstraktion sorgt dafür dass man nur wohldefinierte 
Schnittstellen im Blick haben muss, der Rest dahinter aber dann einfach 
funktioniert.

Wer denkt, das wäre kompliziert hat Abstraktion nicht verstanden. Weil 
es das eine Tool ist, um überhaupt Komplexität zu meistern.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Darüber meckern immer nur die Versager die es
> nicht können.

Du bist ein arrogantes Arschloch. Aber das wusstest Du ja schon.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord -. schrieb:
>> Darüber meckern immer nur die Versager die es
>> nicht können.
>
> Du bist ein arrogantes Arschloch. Aber das wusstest Du ja schon.

Du hättest die Chance gehabt dich jetzt mal sachlich am Thema zu 
beteiligen. Aber du wählst immer den weg der persönlichen Beleidigung.

von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Aber du wählst immer den weg der persönlichen Beleidigung

Der beleidigt nur den, der es verdient.
Du dagegen pauschal unpersönlich jene, von denen Du glaubst, dass Du 
ihnen überlegen bist. Also quasi alle.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord -. schrieb:
>> Aber du wählst immer den weg der persönlichen Beleidigung
>
> Der beleidigt nur den, der es verdient.
> Du dagegen pauschal unpersönlich jene, von denen Du glaubst, dass Du
> ihnen überlegen bist. Also quasi alle.

Schade dass du dem Thread keine Chance gibst in die Sachlichkeit 
abzudriften. Dein Hass ist zu stark. Vielleicht liegt es daran dass ich 
meine Meinung sachlich begründen kann und das auch tue.

Hast du deine on topic Beiträge in diesem Thread mal gezählt? Es sind 
exakt 0.

Wie wär es wenn du deinen Hass per PN weiter kultivierst und hier eine 
sachliche Diskussion einkehren lässt? Deal?

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Wie wär es wenn du deinen Hass per PN weiter kultivierst und hier eine
> sachliche Diskussion einkehren lässt? Deal?

In dem Augenblick, wo Du deine Arroganz und deinen Hass auf alles und 
jeden der das Wort Arduino in den Mund nimmt, ablegst:

> Lerne Programmieren.

> Warum fällt es euch Arduinos so schwer einfach mal was selbst zu
> entwickeln?

> Kaum ein Arduino-Kasper

> Bei Arduinos dominiert bei mir eher Mitleid.
> Weil die Nutzer selbst so wenig können

> Darüber meckern immer nur die Versager die es
> nicht können.

lege ich meine Verachtung für dich ab. Deal.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> lege ich meine Verachtung für dich ab. Deal.

Du darfst deine Verachtung behalten aber du schädigst mit deinem 
Verhalten hier den gesamten Thread.
Lerne deine persönlichen Animositäten in anderem Rahmen auszutragen wo 
es passender ist.
Du hast immer noch keinen einzigen sachlichen On Topic Beitrag in diesem 
Thread geleistet. Fange doch mal damit an!

Ich zumindest werde deine Ausbrüche hier nicht mehr kommentieren und 
nicht mehr darauf eingehen.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Ich würde alle Parameter in einem Array organisieren, wo man dann mit 
up/down den aktiven Parameter auswählt. Das hilft dann auch bei einem 
einheitlichen Layout. Man nimmt sich also zuerst mal Papier und Stift 
und malt sich damit alle Darstellungsvarianten auf.
Die Einträge in dem Array enthalten nur die Unterschiede, z.B.:
Parameteradresse, Name, Format, Einheit, Min, Max, Gain, Offset.
Man hat dann nur noch eine einzige Funktion zu schreiben und zu testen, 
die damit das Darstellen bzw. Einstellen steuert.

Mit switch/case hat man nicht nur Unmengen an Schreibarbeit, es können 
sich auch leicht Fehler einschleichen (Texte stehen an falscher Stelle, 
überschreiben andere Anzeigen, lassen Reste stehen usw.).

von Cyblord -. (cyblord)


Lesenswert?

Third E. schrieb:
> Gibt es irgendwo Architektur-Vorschläge?

Aus meiner Sicht gibt es zwei ganz grobe Vorgehensweisen, eine 
lightweight mit viel mehr Implementierung pro Seite und die andere eher 
komplizierter aber besser.

Gemeinsam:
- Eine Seite wird durch eine Struktur repräsentiert.
- Alle Seiten werden einfach in einem statischen Array gehalten. Keine 
dynamaischen verlinkten Listen.

1.)
Eine Seitenstruktur enthält im Prinzip nur einen Handler für die Seite, 
z.B. in Form eines Funktionszeigers. Dieser erwartet eine Funktion 
welche den gesamten String für die Seite zurückgibt. Evt. Seitenindex 
als Parameter.
An allgemeiner Implementierung bleibt dann nur das durchlaufen mittels 
Up/Down und bei jeder Seite wird nur deren Handler aufgerufen und dessen 
Rückgabestring stumpf angezeigt.
D.h. alle Parameter Einstellgeschichten müssen trotzdem einzeln 
implementiert werden.

oder:

2.)
Eine Seitenstruktur enthält:
- Info ob die Seite einen Einstellwert enthält oder nur was anzeigt.
- Zeiger auf den Einstellwert, wenn die Seite einen solchen Enthält.
- Handler (Funktionszeiger) auf eine Funktion welche den Text liefert. 
Als Parameter evt. der aktuelle Einstellwert. Dann kann diese Funktion 
auch die Anzeige und Formatierung übernehmen.

Es muss in diesem Fall nur einmal die ganze Logik zum Einstellen des 
Wertes implementiert werden. Vorausgesetzt der Wert hat immer den 
gleichen Datentyp.
Sonst wirds komplizierter.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Third E. schrieb:
> Es gibt die Tasten "Auf" und "Ab" und eine für Edit/Bestätigen.

Dann muß man sich einen Ablauf ausdenken, um die einzelnen Digits einer 
Zahl setzen zu können.
Z.B. mit langem Druck von "Edit" wechselt man in den Setzmodus und das 
erste Digit blinkt. "Edit" kurz drücken schaltet ein Digit weiter. 
Langes "Edit" speichert dann den neuen Wert. "Auf" und "Ab" zusammen 
verwirft die Eingabe, der vorherige Wert bleibt erhalten.

von Cyblord -. (cyblord)


Lesenswert?

Ich denke Peda hat einen wichtigen Punkt angesprochen:

Vor der Implementierung kommt die Planung: Was GENAU soll möglich sein. 
Was ist nicht nötig. Das ist auch bald schon der schwierigste Teil.
Und sowas trainiert man eben auch durch das Selbermachen.

: Bearbeitet durch User
von Frank O. (frank_o)


Lesenswert?

Cyblord -. schrieb:
> Aber wie soll er? Wenn man keine Erfahrung im selber entwickeln hat,
> geht das eben auch nicht. Darum ist diese ganze Arduino-Sache eine
> Sackgasse.

Na ja ...
Wer behauptet denn, dass man dabei bleiben muss?
Ich hätte den ganzen Scheiß in die Ecke geschmissen, vor allem nach dem 
ersten Assembler Buch, das so grottenschlecht für meinen Geschmack war, 
dass ich nichts daraus gelernt hätte.
Vor allem in der wenigen Freizeit.
Und die ganzen Libs, die es für Arduino gibt, die haben sich auch nicht 
selbst geschrieben.
Ich war ziemlich raus die letzten 12 Jahre und als ich nun den 
Bremsentester bauen wollte, war ich erstaunt wie sehr das alles 
gewachsen ist.
Ich glaube du stehst mit deiner Meinung (die sich wohl kaum in den 
Jahren geändert hat) ziemlich alleine da.
Alleine was da mittlerweile an Hardware unterstützt wird.
Dein Alleinstellungsmerkmal, dass du zu einer kleinen Elite gehörst, die 
so was kann, die ist schon lange vorbei. Zum Glück!
Was wäre Steve Wozniak ohne Steve Jobs gewesen.  Durch Arduino können 
vielleicht Entwicklungen ihren Anfang finden, die so nie entstanden 
wären.
Und dem Controller siehst du es von außen nicht an, ob du oder ein 
Arduino Jünger den programmiert hat. Nicht einmal, dass er vielleicht 
das meiste zusammen kopiert hat. Wenn alles so funktioniert,  wie es 
soll, ist doch alles gut.
Und kommst du jetzt mit dem Speicherhunger, die Hersteller werden dann 
auch den bedienen.
Siehe es endlich ein, du gehörst zu einer aussterbenden Art.

von Cyblord -. (cyblord)


Lesenswert?

Frank O. schrieb:
> Wer behauptet denn, dass man dabei bleiben muss?

Das ist ja grade die Krux an einer Sackgasse. Man kommt nicht mehr raus.

von Thorsten M. (pappkamerad)


Lesenswert?

Michael B. schrieb:
> Klingt wie der direkte Weg in die Hölle überkomplexer Software.
>
> Nehmen wir nur 4 Tasten, up down left right. Nehmen wir simple
> Zahleneingabe 0000 bis 9999.
> Dann macht up +1, down -1 und right nächste Stelle von 1-4, wobei es
> nach Stelle 4 den Wert speichert und left steht mal für Abbruch, nicht 1
> Stelle zurück.
>
> Da du keine Zustände 'wir sind auf Ziffer 2' speichern willst brauchen
> wir 13 Tastenhandler.
> [...]
Das hast du falsch verstanden, natürlich speichert man Zustände. Und 
natürlich ist es sinnvoll die ganze Zahleneingabe wie eine 
Darstellungsseite zu behandeln. Selbst Parameterlisten wird man 
zusammenfassen und über ein Array o.ä. abbilden. Für die 
Parameterauswahl hat man dann einen eigenen Satz Tastenhandler und für 
die Wertauswahl einen getrennten. Jetzt hat man noch andere Menüpunkte, 
bspw. Parameter mit boolschem Wert, die werden dann getrennt 
implementiert mit ihren Handlern. Packt man das in Switch-Case-Listen, 
ist die Chance groß bei einer kleinen Änderung sich bestehende 
Menüpunkte zu zerschießen.

Ich würde behaupten, wer den einfachen Ansatz mit einer zentralen 
hartcodierten Tastenabfrage wählt, wird so Dinge wie einen langen 
Tastendruck nicht vorsehen (Ausnahmen bestätigen die Regel), weil der 
Code dann schnell so unübersichtlich wird, dass eine funktionierende 
Implementierung schwieriger wird wie eine saubere Abstraktion. Und wenn 
man letztere schon nicht leisten kann..

> Natürlich hast du eine state maschine, natürlich hast du einen Zustand,
> bloss nicht als einfach zugängliche Zahlen aktuellestelle=2
> aktuellervalue=1 sondern kreuz und quer versteckt in Funktionspointern.

Die Zahlen helfen halt keinem, eine kleine Änderung, ein Eintrag 
herausnehmen, und man muss neu durchnummeriern. Erschwerend kommt hinzu, 
dass Menüs in der Regel baumförmig verzweigt sind.

Neben den ganzen Parametereinstellunge gibt es bspw. noch einen 
Handbetrieb, die Tastenbedienung darin ist komplett anders und man tut 
gut daran, diesen Code nicht mit den Parametereinstellungen zu mischen.

> Es ist so viel einfacher, ein case zu einem switch hinzuzufügen.
Und dabei sich alles zu zerschießen.

von Michael B. (laberkopp)


Lesenswert?

Thorsten M. schrieb:
> Das hast du falsch verstanden, natürlich speichert man Zustände

Hmm

Thorsten M. schrieb:
> und man braucht weder Switch-Orgien noch Zustandsautomaten

sehr wohl hätten Zustandsautomaten Zustände.

Du speicherst also SOWOHL in der Belegung von Funktionspointern ALS AUCH 
in Zustandsvariablen den aktuellen Zustand der Menübedienung

Also ein zerteilter Zustandsautomat, ein bisschen hier, ein bisschen 
dort, ohne klare Aufteilung, ihne klares Konzept.

Klingt wie eine Einladung:

Thorsten M. schrieb:
> Und dabei sich alles zu zerschießen.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Cyblord -. schrieb:
> Das ist ja grade die Krux an einer Sackgasse. Man kommt nicht mehr raus.

Wer kennt sie nicht, die Millionen Autofahrer, die einmal in eine 
Sackgasse gefahren und dann elendig verhungert sind.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Cyblord -. schrieb:
>> Das ist ja grade die Krux an einer Sackgasse. Man kommt nicht mehr raus.
>
> Wer kennt sie nicht, die Millionen Autofahrer, die einmal in eine
> Sackgasse gefahren und dann elendig verhungert sind.

Wolltest du nicht an einem sachlichen Beitrag arbeiten? Wie weit bist du 
damit?

von Andras H. (andras_h)


Angehängte Dateien:

Lesenswert?

Habe das vor Jahren geschrieben. Weiss gar nicht mehr wie es genau 
funktioniert, aber ist nicht komplex.
Prinzipiell muss man den scheiß konfigurieren. Beispiel war damals für 
eine PID heater. Leider habe ich das Projekt nicht mehr im Repo gefunden 
:(

Sonst im header file findet man einige Funktionen mit den man im Menu 
selbs t hin und her springen kann. Wenn du ein Taster hast, oder mehrere 
dann kannst du die Funktionen bei bestimmten tastendruck aufrufen.

Sonst der Menu wird nicht auf den Display erscheinen, sondern du musst
extern void printLinkedList(const LinkedList * const item, uint8 
lineStart); //Callout
die Funktion selber implementieren. Hier kannst du entscheiden wie dein 
Menu aussehen soll, was wo hin und so.

Sonst scheint der Zeug noch irgendwie mein task.h brauchen.


Viel spass beim basteln! Keine Ahnung ob das Zeug noch tut, war vor 
mehreren Jahren.

von Frank O. (frank_o)


Lesenswert?

Cyblord -. schrieb:
> Man kommt nicht mehr raus.

Liegt doch an einem selbst.
Entweder versucht man ein Problem zu umgehen (könnte man in diesem Fall 
des TOs) oder man muss sich durchbeißen und muss sich dem Problem 
stellen und dann den harten Weg gehen. Ab da hast du recht, da muss man 
was tun.
Aber auch da, wenn du mit Arduino angefangen hast, hast du automatisch 
schon einige Sachen gelernt und dann geht dir z.B. auch C besser von der 
Hand.

Ich finde einfach immer Klasse, wenn man sich das leicht machen kann und 
die Lebenszeit ist begrenzt (das weiß ich nur zu genau).
Mein Ziel ist und das sollte es immer sein, etwas zu bauen, was das 
Leben leichter macht oder sonst einen Zweck erfüllt. Der Mikrocontroller 
ist doch nur ein Stück Hardware auf dem Weg dahin. Das soll doch kein 
Selbstzweck sein. Gut, ich gebe zu, dass ich mich damals gefreut habe, 
wie ich mich kaum über anderes gefreut habe, als die Led blinkte. 
Genauso freue ich mich heute noch, wenn das Display heute beispielsweise 
anzeigt "Der Tank ist voll!" und die Pumpe abgeschaltet wird. Aber es 
geht dann immer noch und in erster Linie um den vollen Tank und die 
Automatik dahinter. Wenn ich das fertig kaufen kann, der Preis im Rahmen 
ist, kaufe ich es fertig. Ist das mit Arduino einfacher und schneller 
erledigt, mache ich das damit.
Cyblord, mal eine Frage an dich: Nimmst du fertige Wandler für ein paar 
Euro oder baust du die alle noch selbst?
Matze schrieb vor einiger Zeit, dass er die nur noch fertig nimmt, weil 
er die gar nicht so günstig bauen kann. Damals, als Arduino Fanboy und 
ich die Hardware proklamierten, die man dann in sein Projekt einbauen 
kann, denn es handelte sich immer noch um eine Atmega328, war von vielen 
der Aufschrei groß. Mal ganz offen, wer baut denn den Scheiß noch selbst 
zusammen, wenn der Platz nicht das Problem ist?

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Frank O. schrieb:
> Cyblord, mal eine Frage an dich: Nimmst du fertige Wandler für ein paar
> Euro oder baust du die alle noch selbst?

Deppenfrage. Schon tausendmal durchgekaut.

Arduino ohne Wissen führt meist nicht zum Ziel. Hat mit Fertig kaufen 
vs. Selber machen schlicht nichts zu tun.
Arduino ist NICHT die schnellere Lösung. Das scheint nur so, weil 
triviale Beispiele ohne Aufwand funktionieren. Echte komplexe 
Anwendungsfälle gehen damit nicht, damit wird man nicht schneller 
sondern die meisten bekommen es dann schlicht nicht hin.

Aber auch die Bitte an dich: Mach einen Thread auf wenn du über Arduino 
diskutieren willst.
Bleib doch hier bitte beim Thema.

: Bearbeitet durch User
von Weingut P. (weinbauer)


Lesenswert?

Beginne bei State-Machine

von Frank O. (frank_o)


Lesenswert?

Echte komplexe Anwendungsfälle, wenn du da bist und das als Hobbyist, 
dann kannst du das mit den benötigten Materialien oder du erarbeitest es 
dir an diesen Projekt.
Aber in einem Punkt hast du definitiv recht. Irgendwann kommt der Punkt, 
an dem du mit zusammen kopieren nicht mehr weiter kommst und echte 
Arbeit leisten musst. Doch beim Hobby hat man entweder die Zeit und Muße 
dazu oder man passt das Projekt an sein eigenes Können an.
Die meisten werden es wohl in die Ecke werfen.
Aber selbst das ist legitim.  Ist ihr Geld, ihre Zeit und ihre 
Entscheidung.

: Bearbeitet durch User
von Hans-jürgen H. (hjherbert) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hier ein Beispiel der Firmware eines Netzteils, das mit einem Drehgeber 
bedient werden kann.

von Georg L. (energetix)


Lesenswert?

Hallo,
hier eine Möglichkeit schnell an Ergebnisse zu kommen.
Man kann sich kostenlos bei openai anmelden.
Das Ergebnis bekommt man in Sekunden.
Dazu ist es erforderlich möglichst genau die Vorgaben zu benennen.
zB " Displaytyp, Entwicklungstool (Arduino, Microchip Studio usw.),
Menügröße (2 oder mehr Menüpunkte) usw.
Bei openai kann man soweit ich weiß 5 x pro Tag eine Anfrage stellen.

"Hallo kannst du mir bei meinem Programm helfen?
 Vorgabe: Display ..., Prgrammiertool, andere Anforderungen ...
 Dann per Drag and Drop in openai eingeben.
 Ein paar sek warten und man bekommt ein Ergebnis.

Den Lösungsvorschlag ausprobieren. wenn Fehler auftauchen kann
man openai wieder für eine Lösung fragen. usw.

Mir hat diese Vorgehensweise schon sehr geholfen und man kann dadurch
viel dazulernen.
Wenn die kostenlosen Versuche aufgebraucht sind kann man mit deepseek
weitermachen.
Ich hoffe diese Info hilft
Viel Spass

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wie wäre es damit?
https://github.com/Jomelo/LCDMenuLib2

von Klaus (feelfree)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.