Forum: Mikrocontroller und Digitale Elektronik Drehgeber LCD-Menü strukturieren


von Christian O. (hightec)


Lesenswert?

Einen wunderschönen guten Abend und frohes neues Jahr.
Nach meiner letzten bastellei zu Weihnachten (Die Lampe mit IR-Sensor, 
vlt errinnert sich wer) bin ich schon wieder am nächsten Projekt dran.

Und zu diesem neuen Projekt gehört nun auch ein LCD mit entsprechendem 
Menü.
Meine Frage bezieht sich nun weniger auf die technische Lösung 
(Auswertung des Drehgeber hab ich zwar noch nicht so 100%ig drauf, das 
schaffe ich allerings auch so), sondern hat eher einen strukturellen 
Hintergrund.

Der Gedanke:

Ich möchte ein typisches Menü auf dem LCD bereitstellen in dem ich zum 
einen Einstellungen vornehmen sowie konkrete Steuerungen auslösen kann.
Nun überlege ich schon einige Zeit wie ich mir dieses Menü 
programmtechnisch am einfachsten strukturiere.

Der erste Gedanke ist in etwa so:
1
int main (void){
2
  //- Initialisierungen
3
  //- Starbildschirm aufbauen 
4
  //- usw.
5
  
6
  ------------
7
  // Ab hier die Schleife in der auf Benutzereingaben gewartet wird
8
  // Der Drehgeber liefert mir bei Bewegung ja 1 oder - 1
9
  // Nun würde ich eine Variable initiieren die bei Bewegung des Drehgeber
10
  // inkrementiert oder dekrementiert wird und per Switch-Case jeweilig
11
  // den Pfeil an die richtige Stelle setzen.
12
  
13
  int menuep = 0;
14
  
15
  if (Drehegebr erkannt){
16
    menuep = menuep + drehgeberwert;
17
  }
18
19
  // Natürlich wird die Variable noch so bearbeitet dass sie nur die   
20
  // Zustände der Möglichen Menüpunkte annehmen kann bzw. nicht negativ
21
  // wird.
22
23
 switch(menuep)
24
{
25
  case 1:
26
  {
27
    //Setze Pfeil vor Menüpunkt 1
28
29
    //Betrete Menüschleife für Untermenü...
30
31
    break;
32
  }
33
  case 2:
34
  {
35
    //Setze Pfeil vor Menüpunkt 2
36
37
    //Betrete Menüschleife für Untermenü...
38
39
    break;
40
   }
41
  case 3:
42
  {
43
    //Setze Pfeil vor Menüpunkt 3
44
45
    //Betrete Menüschleife für Untermenü...
46
47
    break;
48
  }
49
  ...
50
  
51
}
52
53
  
54
}

Bitte achtet bei diesem Brainstorming nicht auf die Prgrammtechnische 
Korrektheit, klar fehlt da noch einiges. Ich versuche nur die Struktur 
deutlich zu machen die ich momentan im Kopf habe.

Nun ergibt sich bei der Struktur allerdings ein Problem welches zur 
Folge hat dass das Programm mit wachsender Anzahl der Menüpunkte immer 
unübersichtlicher wird...

Und zwar haben meine Menüpunkte auch wieder untermenüs und 
UNTERuntermenüs usw...
Was bedeuten würde, dass ich hinter jedem Menüpunkt wieder eine Variable 
und eine Switch-Case-Anwendung verbergen muss. Und dies erscheint mir 
doch eine sehr schlechte und chaotische Lösung zu sein. Allerdings hat 
mich heute nicht grade die Muse geküsst ( Mal abgesehen von meiner Frau 
die mir dabei nicht helfen kann :-D ) und ich habe keine gute Idee zu 
einer einfacherern und übersichtlichen Strukturierung.

Und an der Stelle möchte ich mich nun an euch wenden.

Hat schonmal jemand so ein Menü aufgebaut und wie seid ihr dabei 
vorgegangen bzw. wie habt ihr das ganze möglichst einfach strukturiert?

Lange Rede gar kein Sinn.

Ich bedanke mich schonmal im Vorraus und hoffe auf eine rege 
Unterhaltung ;-)

Gruß

Christian

von qwertzuiopü+ (Gast)


Lesenswert?

Erstmal: Du solltest das Untermenü erst betreten, wenn eine 
entsprechende Taste zum Bestätigen gedrückt wurde, nicht schon beim 
Auswählen.

Drehgeberauswertung geht am einfachsten per Interrupt, aber nur wenn du 
eine hardwaremäßige Entprellung hast. Einfach auf Flankenwechsel von A 
triggern und B abfragen. Sofwaremäßige Entprellung wird dann halt 
komplexer.

ICH würde die Menüs objekorientiert programmieren. Das lohnt sich aber 
nur bei einem entsprechend großen µC und natürlich C++ Kenntnissen.

von Christian O. (hightec)


Lesenswert?

qwertzuiopü+ schrieb:
> Erstmal: Du solltest das Untermenü erst betreten, wenn eine
> entsprechende Taste zum Bestätigen gedrückt wurde, nicht schon beim
> Auswählen.
>
> Drehgeberauswertung geht am einfachsten per Interrupt, aber nur wenn du
> eine hardwaremäßige Entprellung hast. Einfach auf Flankenwechsel von A
> triggern und B abfragen. Sofwaremäßige Entprellung wird dann halt
> komplexer.

Soweit alles klar, wie gesagt nicht die technik ist mein Problem sondern 
nur die strukturierung ;-)

qwertzuiopü+ schrieb:
> ICH würde die Menüs objekorientiert programmieren. Das lohnt sich aber
> nur bei einem entsprechend großen µC und natürlich C++ Kenntnissen.

Ob OOP auf einem Atmega32 wirklich sinnvoll ist weiss ich nicht, 
entzieht sich, wie du wahrscheinlich schon vermutet hast auch noch 
meiner Kenntnis.

Aber schonmal danke für den Tipp

von Karl H. (kbuchegg)


Lesenswert?

Christian O. schrieb:

>  switch(menuep)
> {
>   case 1:
>   {
>     //Setze Pfeil vor Menüpunkt 1
>
>     //Betrete Menüschleife für Untermenü...
>
>     break;
>   }
>   case 2:
>   {
>     //Setze Pfeil vor Menüpunkt 2
>
>     //Betrete Menüschleife für Untermenü...
>
>     break;
>    }
>   case 3:
>   {
>     //Setze Pfeil vor Menüpunkt 3
>
>     //Betrete Menüschleife für Untermenü...
>
>     break;
>   }
>   ...

schon mal was von Strukturen und Arrays gehört?

Menücode gibt es nun wirklich auch hier im Forum wie Sand am Meer. 
Alleine von mir wird es wohl mindestens 8 bis 10 unterschiedliche 
Varianten geben.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> schon mal was von Strukturen und Arrays gehört?

Ach ja. Funktionspointer sind auch noch sinnvoll.

von Marian (phiarc) Benutzerseite


Lesenswert?

Beitrag "Re: Menüs mit Funktionszeigern"

Bewährte Technik. So oder so ähnlich macht das fast jeder für nicht zuuu 
komplexe Menüs.

von Christian O. (hightec)


Lesenswert?

Marian B. schrieb:
> Beitrag "Re: Menüs mit Funktionszeigern"
>
> Bewährte Technik. So oder so ähnlich macht das fast jeder für nicht zuuu
> komplexe Menüs.

Oh perfekt vielen Dank... wieder etwas womit ich mich beschäftigen kann. 
Manchmal seh ich den Wald vor lauter Bäumen nicht ;-D

von Christian O. (hightec)


Lesenswert?

Ok eine kleine Sache hätte ich da noch.

Ich habe mich jetzt in die Funktionszeiger eingelesen und ein wenig 
herumprobiert und finde diese Möglichkeit klasse.

Allerdings stocher ich noch im dunkeln mit dem Einsatz des 
Drehgeberwertes.

Auch wenn ich mein Menü jetzt übersichtlicher strukturieren kann, kann 
ich ja immernoch nicht vermeiden, dass ich in jedem neuen Untermenü eine 
neue Variable und eine neue Schleife anlegen muss die auf die Eingabe 
des Drehgebers wartet und ich den entsprechenden Funktionszeiger nach 
dem Variabelwert aufrufe um evtl in das nächste Untermenü zu gelangen.

Gibts es da eine elegantere Lösung die ich wieder übersehen habe? Und 
wenn ja welche?

Gruß

Christian

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Christian O. schrieb:
> Gibts es da eine elegantere Lösung die ich wieder übersehen habe? Und
> wenn ja welche?

Kommt echt auf deine Bedienphilosophie an, da hat jeder seine eigenen 
Vorstellungen.
Hier mal meine - Der Druckknopf des Drehgebers schaltet durch die 
Menüpunkte und mit dem Drehen verändere ich den angezeigten Wert. Ein 
laaaanger Druck auf den Drehgeberknopf speichert die Werte in irgendwas 
nichtflüchtiges, z.B. ein EEPROM, wenn man so etwas braucht.
Damit reduziert sich der Aufwand auf das Durchschalten einer 
Parameternummer, die mittels z.B. switch-case die entsprechende Variable 
verändert. Man kann aber auch die Parameternummer auf ein struct 
verweisen lassen, indem Titel und z.B. obere und untere Limits, sowie 
die Variable selber festgelegt sind.
Das alles geht mit einer Kombination von PeDas Drehgeber- und 
Buttonroutinen recht einfach, da PeDa auch schon Routinen für laaaanges 
Drücken von Buttons vorgesehen hat.

: Bearbeitet durch User
von klausb (Gast)


Lesenswert?

In dem Programm 644test.c habe ich eine, für mich, einfache Drehgeber 
und Menuesteuerung realisiert.
Beitrag "Spielerei mit Bipolar-, Unipolar- und DC Motor sowie LM298 und Drehgeber mit ATMEGA644P"
Wie hier schon oft geschrieben, man kann es so oder auch ganz anders 
machen.
Viele Wege führen nach ....

von SuseLunix (Gast)


Lesenswert?

Hallo Christian,

ich hatte schon 2 Techniker Projekte "betreut", bei denen die Schüler 
zuerst selbst ein LC Display mit Menüs programmiert haben. Als es dann 
über 2 Menüs raus ging wurde es immer unübersichtlicher und schließlich 
haben wir es dann auf ein MVC Konzept umgestellt.
http://de.wikipedia.org/wiki/Model_View_Controller

Im Prinzip ist das ganz einfach:

Du schreibst 2 getrennte Module. Sehr gut geht das sogar, wenn 2 Leute 
das getrennt programmieren.
Und zwischen den beiden Modulen wird die Information über einige wenige 
Variablen ausgetauscht. (Model)

Zum Beispiel 3 Variablen:
HAUPTMENU
UNTERMENU
BLINKEN

Modul 1 (Controller) steuert alles. Er erfasst den Drehencoder und zählt 
die Variable HAUPTMENU hoch und runten. Entsprechend die Variable 
UNTERMENU und setzte vielleicht die Variable BLINKEN

Modul 2 (View) läuft ganz unabhängig parallel dazu, schaut, auf was denn 
die 3 Variablen gerade stehen und zeichnet entsprechend den Inhalt des 
LCDs

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.