LCD 20x4 vertikal scrollen

Hallo,
mein Name ist Hubert und ich bin neu hier.
Ich habe lange gesucht, um mein Problem zu lösen, leider ohne Erfolg.
Beschreibung:
Ich habe mir mit einem ESP32 und einem Arduino Nano eine Wetterstation gebaut. Ich erhalte von der Station insgesamt 7 Messwerte. Diese Werte will ich nun auf meinem LCD 20x4 (am ESP32) anzeigen. Dies soll über eine vertikale Scroll-Funktion erfolgen, also die Zeilen sollen nach oben scrollen.
Sind alle 7 Messwerte durchgescrollt, dann sollen 2 Leerzeilen angezeigt werden und alles soll von vorne beginnen. Die Scroll-Funktion soll 2x wiederholt werden

Ich würde mich für eine Lösung sehr freuen.

Gruß Hubert

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Du hältst die Werte in einem Array und führst einen Index mit, der auf die erste anzuzeigende Zeile zeigt. Von der aus gibst Du 4 Zeilen aus. Dann erhöhst Du den Indexzeiger. Wenn Du über die 8 (7 Werte + 2 Leerzeilen, gezählt ab 0) kommst, geht es bei 0 weiter.

Gruß Tommy

Sorry, ich dachte ich bin im deutschen Teil.

So als erste Idee:

/*


   https://forum.arduino.cc/t/lcd-20x4-vertikal-scrollen/1061284
*/

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);


struct Data {
  char tag[8];
  int value;
};

Data  data[] {
  {"A", 0},
  {"B", 1},
  {"C", 2},
  {"D", 3},
  {"E", 4},
  {"F", 5},
  {"G", 6},
};

constexpr size_t sizeOfData = sizeof(data) / sizeof(data[0]);

// update the display by time
void lcdUpdate(uint32_t currentMillis = millis())
{
  static size_t start = 0;                    // current start postion
  static uint32_t previousMillis = - 1000;    // time management
  if (currentMillis - previousMillis > 1000)
  {
    previousMillis = currentMillis;
    lcd.clear();
    lcd.setCursor(0, 0);
    size_t end = start + 3;                   // 4 row display
    if (end >= sizeOfData) end = sizeOfData -1;
    uint8_t row = 0;
    for (size_t i = start; i <= end; i++)
    {
      Serial.println(data[i].value);
      lcd.setCursor(0, row);
      lcd.print(data[i].tag);
      lcd.print(F(": "));
      lcd.print(data[i].value);
      row++;
    }
    Serial.println();
    start = start + 1;
    if (start >= sizeOfData) start = 0;
  }
}


void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  lcd.print(F("scrolling"));
}

void loop() {
  lcdUpdate();
}
3 Likes

Und dann ?

@noiasca: Die Vorgabe mit den 2 Leerzeilen hätte ich so interpretiert, dass wenn Zeile 7 "G..." ganz oben ist, unten wieder Zeile 1 "A..." , mit 2 Leerzeilen dazwischen, erscheint.
Danach Leer - Leer - "A..." - "B..."
Dann Leer - "A..." - "B..." - "C..."
Dann von vorn.

Aber deins ist auch schön.

"so als erste Idee" != "da hast einen fertigen Sketch"

:wink:

bei mir sinds halt 3 Leerzeilen (insider).

2 Likes

Hallo noiasca,
hab vielen Dank für deinen Sketch. Ich wollte ihn auch gleich ausprobieren, bekomme aber 2 Fehlermeldungen. Siehe wie folgt:

D:\Projekte\Test\LcdScroll\LcdScroll.ino:9:37: error: invalid conversion from 'int' to 't_backlightPol' [-fpermissive]
LiquidCrystal_I2C lcd(0x27, 20, 4);

D:\Projekte\Test\LcdScroll\LcdScroll.ino:57:13: error: within this context
lcd.init();

exit status 1

Compilation error: invalid conversion from 'int' to 't_backlightPol' [-fpermissive]

du hast irgend eine andere Library.
nimm den Constructor von deiner Library und beim lcd.init() vieleicht ein lcd.begin().

1 Like

Super, der Sketch wird ohne Fehler kompiliert.
Hab nochmals vielen Dank

Gruß Hubert

x

wenn du der Meinung bist das wars, könntest du dich bei Helfern mit einem Herzchen bedanken und einen Beitrag als Lösung markieren.

Sonst halt nachfragen.

1 Like

Sorry, habe alles nachgeholt.
Gruß
Hubert

Hallo,
leider habe ich nun doch noch eine Frage. Wie kann ich zur Laufzeit die Angabe z.B. {"B", 1} hier das B mit einem Wert z.B. 12.5 °C überschreiben/zuweisen
Gruß
Hubert

du überschreibst einfach die jeweilige Member Variable value

data[1].value = 12;   //aufpassen, c++ beginnt mit 0 beim Zählen von Index.

wenn das alles floats sein sollen, dann müsstest du in der Struktur auch den Variablentyp auf float ändern.

1 Like

Darf ich nochmal fragen, warum Du da -1000 rechnest? Damit es gleich wahr ist beim ersten Durchlauf?
Aber es ist doch unsigned… wie kann das im Minus sein?

Danke dir :grinning:

genau das ist der grund. Damits einfach schon beim ersten Durchlauf "abgelaufen" ist.

für die Variable sind das nur bits.

wenn 4294967295 das Maximum sind, läuft mit +1 die Variable über auf 0.
wenn du 0 hast, und 1000 abziehst hast halt 4294966295 drinnen stehen.

1 Like

Ahhh klar! Jetzt! Danke dir :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.