Menü mit 20x4 LCD funktioniert nicht richtig

So:

case 1:
      lcd.clear();
      lcd.print(">Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(" Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(" Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(" Men\xF5Item4");
      break;

und bei den anderen cases rückst halt das > zeichen um eine Zeile runter.
Und ja, das geht schöner auch, aber fürs Grundverständnis soll es reichen.

Danke und Entschuldigung! :grin:

Werd das mit dem Pfeil versuchen erstmal selber zu lösen. Werde mich wieder dazu mit dem kompletten Code melden, dann haben auch noch andere was davon.

Die LCD Display Module sind nicht immer so organisiert wie man es erwartet.
Ich habe ein physisches 1x16, das in der Ansteuerung ein 2x8 ist. Für das 9. Zeichen mußte man es an die erste Stelle der 2.Zeile schreiben.

Ein 4x20 kann ruhig ein 2x40 sein wobei die erste Zeile in der ersten und 3. angezeigt wird.
Schreib mal 40 Zeichen in die erste Zeile zb "abcdefghijklmnopqrstuvwxyz01234567890ABCD"
Wo wird das dargestellt?

Grüße Uwe

1 Like

Hallo Uwe,

das sieht bei mir so aus: (Cursor steht auf (0,0) )
Zeile 1: abcdefghijklmnopqrst
Zeile 2: D
Zeile 3: uvwxyz01234567890ABC
Zeile 4: LEER

Der Fertige Code sieht nun so aus:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;
unsigned long tZ = 0;

void setup() 
{
  lcd.init();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  updateMenu();
}

void loop() 
  {
  if (!digitalRead(downButton)){
    menu++;
    updateMenu();
    delay(100);
    while (!digitalRead(downButton));
  }
  
  if (!digitalRead(upButton)){
    menu--;
    updateMenu();
    delay(100);
    while(!digitalRead(upButton));
  }
  if (!digitalRead(selectButton)){
    executeAction();
    updateMenu();
    delay(100);
    while (!digitalRead(selectButton));
  }
}

void updateMenu() {
  switch (menu) {
      case 0:
      menu = 1;
      break;
case 1:
      lcd.clear();
      lcd.print(">Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(" Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(" Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(" Men\xF5Item4");
      break;
      case 2:
      lcd.clear();
      lcd.print(" Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(">Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(" Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(" Men\xF5Item4");
      break;
      case 3:
      lcd.clear();
      lcd.print(" Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(" Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(">Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(" Men\xF5Item4");
      break;
      case 4:
      lcd.clear();
      lcd.print(" Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(" Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(" Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(">Men\xF5Item4");
      break;
    case 5:
      menu = 4;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;
      
      case 2:
      action2();
      break;

      case 3:
      action3();
      break;

      case 4:
      action4();
      break;
  }
}


void action1() 

{
  lcd.clear();
  lcd.print(">Executing #1");
  delay(1500);
}

void action2() 
{
  lcd.clear();
  lcd.print(">Executing #2");
  delay(1500);
}

void action3() 
{
  lcd.clear();
  lcd.print(">Executing #3");
  delay(1500);
}

void action4() 
{
  lcd.clear();
  lcd.print(">Executing #4");
  delay(1500);
}

Ist es prinzipiel möglich das kompakter zu machen? das wird ja bei mehr Menüpunkten ja echt groß und klotzig!

z.B. so:

void updateMenu() {
      lcd.clear();
      lcd.print(" Men\xF5Item1");
      lcd.setCursor(0,1);
      lcd.print(" Men\xF5Item2");
      lcd.setCursor(0,2);
      lcd.print(" Men\xF5Item3");
      lcd.setCursor(0,3);
      lcd.print(" Men\xF5Item4");
  
      if (menu <1) menu = 1;
      if (menu >4) menu = 4;

      lcd.setCursor(0,menu-1);lcd.write('>');
}

Man könnte auch den Wertebereich von menu auf 0 .. 3 statt 1 .. 4 begrenzen, wenn das nicht woanders stört...

Dann ist ja klar auf welche Cursorpositionen Du was schreiben mußt damit es in der gewollten Zeile ankommt.

LCD.setcursor(0,0);
LCD.setcursor(0,1);
LCD.setcursor(20,0);
LCD.setcursor(20,1);

Zeile 1: 0,0 bis 19,0
Zeile 2: 0,1 bis 19,1
Zeile 3: 20,0 bis 39,0
Zeile 4: 20,1 bis 39,1

Grüße Uwe

Bin wieder Arduino aktiv und werde mich in Kürze weider zu dem Thema melden! :grinning:

Hi Michael,
das funktioniert 1a!
Wenn ich jetzt mehr als 4 Einträge brauche dann mach ich immer einen neuen void updateMenu1, void updateMenu2 auf mit jeweils 4 Einträgen auf. Geht bestimmt besser oder?

Je nach Bibliothek die was ich hatte erlaubte nur
0,0
0,1
0,2
0,3
und war auch eine "LiquidCrystal_I2C.h"

Grüße
Bernhard