Menü erstellen und per Poti den Namen eingeben

Hallo zusammen,

Ich bin noch ziemlich neu hier, und auch im Bereich Arduino...
ich versuche mir grade ein eigenes Menü auf einem 16x2 Display zu bauen.
Ein Brotbildschirm habe ich bereits erstellt. Über ein Poti kann ich auch verschiedene Seiten aufrufen, also ich kann damit scrollen.

Jetzt möchte ich einen Namen eingeben, dies möchte ich mit einem Poti realisieren, der die ganzen Buchstaben von a-Z scrollt...Ist der gewünschte Buchstabe erreicht, muss man einen Taster betätigen, dann springt der Cursor zur nächsten Stelle.

Habt ihr eine Idee wie ich das realisieren kann?
26Groß und 26 KleinBuchstaben zu mapen, also 52 auf einen Poti mit 270° Drehung ist glaube ich nicht so sinnvoll. Oder sollte ich es lieber über taster realisieren?

Und wenn eins von beiden realisierbar ist, wie sollte ich am besten vorgehen.

Danke

Hier habe ich sowas mal allgemein gezeigt:
http://forum.arduino.cc/index.php?topic=302884.msg2107999#msg2107999

Der Test-Code in dem Link wird aber über den Serial Monitor gesteuert.

Ein Inkrementalgeber/Drehencoder wäre hier super. Denn kann unendlich drehen und die gibt es auch mit eingebautem Taster.

Danke für den Link.

Es ist anscheind nicht ganz so simple so etwas umzusetzen.

Ich kann ja mal kurz von vorne anfangen was ich vor habe.
Und zwar habe ich 2 Servos die eine Platte in x und y Richtung bewegen. Ich denke um ins Detail zu gehen, dauert es zu lange. Diese Servus steuere ich mit 2 Potis. Ich möchte eine Menüführung über das Display machen. Die soll ungefähr so aussehen.

  1. Bootlogo
    2.Menü
  • Spiel starten
  • Bestenliste
  • Musterlösung
  • Einstellungen
    Die 4 Punkte sollen auf jeweils einer Zeile ausgegeben werden. Sprich ich muss mit einem Poti oder einer Anordnung von Tastern (Steuerkreuz) durch das Menü scrollen können.
    Da ich schon 2 Potis habe, würden mir auch die 4 Taster ausreichen. (Vorerst, da ich zumindest diese Hardware zu hause habe)
    Wenn ich das Spiel starten wähl, soll ein Signalton erklingen und eine Zeitmessung soll gestartet werden. Bis das Spiel über einen Sensor o.ä beendet wird. Diese Zeit soll dann gespeichert werden. Es können maximal 10 Zeiten gespeichert werden. Diese sich dann in Aufsteigender Reihenfolge in dem Menüpunkt Bestenliste wieder finden. Die Bestenliste soll wie folgt aussehen:
  • 02:22:333 (2Minuten, 22Sekunden,333ms)
  • Name (von dem jenigen)

So in etwa stelle ich mir das vor. Allerdings habe ich auch noch ein paar Probleme wie ichfit Arrays Strings Char umgehe...
Ich kann gerne mal meinen Code für mein Bootlogo anhängen. Da habe ich es auch versucht elegant zu lösen, allerdings geht das bestimmt einfacher. Ich habe mich auch in der Variante char*[] probiert. Wenn ich in die [] eine 2 rein schreibe, nimmt sich dieser den 2 string raus. Das hat auch alles geklappt. Allerdings wollte ich die Länge von diesem Array auslesen bzw. von dem string. Das hat nur in dieser Form geklappt wie ich es im Code habe. Daher musste ich leider 4 char anlegen, welche dann da unterschiedlich eingestellt werden können. Besser hätte mir ein Array * gefallen, wo ich dann die länge jeder einzelnen Position auslesen kann. Aber egal jetzt.

Als nächstes möchte ich, die Menüstruktur darstellen. Das ist soweit auch kein Problem.
Jetzt möchte ich erst einmal versuchen einen Namen Einzugeben. Das hätte ich dann gerne als eigenständige Funktion. Damit ich nach einer Bestzeit immer die Funktion aufrufen kann.
So jetzt habt ihr einen ungefähren Plan davon, was mir so vorschwebt :slight_smile:

include <LiquidCrystal.h>

// initialize library with the numbers of the interface pins:
//               (RS, Enable, DB4, DB5, DB6, DB7)
LiquidCrystal lcd(8,  9,      10,   11,  12,  13);

//Andere Initalisierungen die für das Programm erforderlich sind
int Zeilen[2];
char Spalten[2];
char ersteller[] = "xxxxxx";
char spielname[] = "....rinth....";
char versionsnummer[] = "V1.0";
char start[] = "let's go";
int mitte_display = 8;


const int sensorMin = 0;          // sensor minimum, discovered through experiment
const int sensorMax = 1023;    // sensor maximum, discovered through experiment
int poti;
int seite;


void startbildschirm()
{
  //Hier steht der Startbildschirm des Menüs. Wird immer einmal angezeigt, wenn der Arduino
  //gestartet wird(booten)
  //Texte werden Mittig ins Display gesetzt
  lcd.setCursor(mitte_display-((sizeof(ersteller)-1)/2),0);
  lcd.print(ersteller);
  lcd.setCursor(mitte_display-((sizeof(spielname)-1)/2),1);
  lcd.print(spielname);
  delay(900);
  lcd.clear();
  lcd.setCursor(mitte_display-((sizeof(versionsnummer)-1)/2),0);
  lcd.print(versionsnummer);
  lcd.setCursor(mitte_display-((sizeof(start)-1)/2),1);
  lcd.print(start);
  delay(300);
}

void setup() {
  //Initialisierung des Displays
  //16 Spalten
  //2 Zeilen
  lcd.begin (16,2); 
  Serial.begin(9600);
  //Funktion für das in die Mitte setzen der Texte beim Booten
  startbildschirm();
  //}
}

void loop() {

    // map the sensor range to a range of four options:
  seite = map(poti, sensorMin, sensorMax, 0,5 );



}

Im Loop steht bisher noch nichts drin. Außer das kurze mapen...War ursprünglich mal für 5 Seiten scrollen mit einem Poti vorgesehen...Also kann es erst mal ignoriert werden

Ein komplettes LCD Menü erstellen ist was ganz anderes. Das kann etwas schwieriger werden.

Das Eingeben eines Textes alleine ist jedoch nicht sooo kompliziert. Jedenfalls die Grundlagen. Je nachdem wie man das genau will habe es manche kleinen Details etwas in sich.
Aber an sich hat man einen String für den Zeichensatz und der aktuelle Buchstabe ist der Index in diesem Array. Dann hat man noch den aktuellen Index im Ziel-String. Diese Indices werden inkrementiert und dekrementiert. Ich habe nur gleich an etwas Komfort gedacht, wie dass wenn man zurück auf einen Buchstaben geht den man schon mal gesetzt hat es auch mit diesem Buchstaben weiter geht und nicht von vorne.

Aber es ist eben keine einzelne Funktion die man mal schnell aufruft. Wie mit dem restlichen Menü auch. Du musst dir wie bei einem Zustandsautomaten eher merken in welchem Menü-Zustand du gerade bist und dann entsprechend andere Dinge tun.

Das hat nur in dieser Form geklappt wie ich es im Code habe. Daher musste ich leider 4 char anlegen, welche dann da unterschiedlich eingestellt werden können. Besser hätte mir ein Array * gefallen, wo ich dann die länge jeder einzelnen Position auslesen kann. Aber egal jetzt.

Wenn du ein Array aus C Strings hast....
also sowas:

char* text[] = { "Zeile1", "Zeile2" };

...kannst du nicht sizeof(text[0]) machen. Du hast hier ein Array aus Zeigern. Und sizeof() eines Zeigers ist immer 2 auf dem AVR. Um die Länge es C Strings zu berechnen gibt es strlen() (string length). Da wird dann auch der Terminator nicht mitgezählt.

Vielen Dank für den Hinweis. Genau den Wert habe ich auch immer bekommen. Also 2.
Ja ich muss das rad definitiv nicht neu erfinden. Ich suche noch einer passenden Lib oder ähnliches. Was ich dann nach meinen Bedürfnissen anpassen kann.

Ja der Hinweis war echt klasse. Wenn ich mal mehr zeit habe, werde ich das sehr wahrschlichen dann auch mit dem Encoder bauen. Aber erstmal brauche ich eine Funktion. Der Schliff und die Optimierung kommen dann später. Zumal ich für diese Project auch langsam etwas Zeitdruck habe. Die Hardware mit den Servos steht. Und die Möglichkeit die Servos über einen Webserver von meinem iPhone zu steuern auch. Das war so der Hauptgedanke darin. Jetzt möchte ich es eben noch um ein Menü erweitern. Das wäre mir halt noch ganz wichtig.
Wenn ich das mit dem Namen eingeben nicht hinbekomme, dann mache ich eben "nur" einen Zeitstempel ohne Namen...

Zum Menü habe ich grade folgendes gefunden:
http://forum.arduino.cc/index.php?topic=135828.0

Was sagst Du/Ihr dazu?

Danke

Wenn du ein fertiges LCD Menü willst (was bei deinen Kenntnissen keine schlechte Idee ist), dann das:
http://forum.arduino.cc/index.php?topic=73816.0

Danke...
Dieses Theras habe ich auch schon gefunden. Nur weiß ich erstens nicht, ob ich ihn für mein 16x2 Display nutzen kann.
Zweitens weiß ich damit noch nichts anzufangen, was muss ich denn nun tun?
Einfach in ein Programm die Lib einfügen? Oder muss, sollte ich so ein Bsp. Programm abändern?

Das habe ich noch nicht so recht verstanden.

Danke

Es ist extra für das 16x2 geschaffen worden! 20x4 funzt auch.
Was willst du denn tun?
Lade ein Beispiel, lies den ersten Thread und mach was auch immer.
Encoder funzt damit auch, lies dir die gefühlte tausend Seiten durch.

Serenifly:
Wenn du ein fertiges LCD Menü willst (was bei deinen Kenntnissen keine schlechte Idee ist), dann das:
Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen - Deutsch - Arduino Forum

Das Menü ist super, kann ich nur empfehlen. Ich setzte es selber in einigen Projekten ein.

Aber für absolute Anfänger ist das erstmal nichts.

Leider hat der Autor die aktuelle Version noch nicht fertig dokumentiert. Dadurch wird es für manchen Anwender schwierig.
Aber mit ausreichend Arduino-Erfahrungen wird das schon gehen.

Danke für den Tipp,
ich habe das erste Beispiel jetzt mal eingebunden.

Noch verstehe ich nicht alles, aber zumindest kann ich was auf meinem Display sehen;-) Schade nur, dass alles auf Englisch ist...

Ich habe mal ein PAP erstellt, was ich mit meinem Menü machen möchte.
Eventuell kann mir ja einer aus Erfahrung sagen, was für ein Beispiel das richtige dafür wäre.

Danke im voraus

Habe das Bild vergessen :slight_smile: