LCD richtig Beschreiben

Hi, ich hab ein LCD 2004 mit der I2C Library (von Liquid Crystal) an meinen Nano abgeschlossen. Ich würde gerne, dass der Text, wenn er zu lang ist für die erste Zeile, in der 2. Zeile weitergeht. Wie mach ich das?

Das Stück, was zu lang ist, in eine 2. Zeichenkette kopieren und die erste mit '\0' abschließen.

Zeige doch mal den Code, den Du bereits hast.

Gruß Tommy

1 Like

Hallo,
ich weiß jetzt nicht ob es da einen Trick gibt , und das je nach verwendeter Lib automatisch passiert, denke aber ehr nicht.
Du kannst die Länge des Textes abfragen , wenn er zu lang ist musst Du den Text teilen. Allerdings am letzten Leerzeichen von der zulässigen Länge.
Dazu kannst Du dir z.B die String Funktionen ansehen.

Nachtrag
wenn es konstanter Text ist , also keine Variable , dann weist Du es doch vorher und kannst Ihn auf zwei Zeilen aufteilen.

in Deinem Beispiel Text verkürzen , sonst pass er auch in zwei Zeilen nicht rein

SD Karte konnte 
nicht gefunden
werden 

SD Katte nicht
gefunden
1 Like

Hi Tommy,
was genau macht \0? ist das wie break?

Hier ist der Code:

#include <SoftPathElectronics.h>

CustomKeyboard keyboard;

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

LiquidCrystal_I2C lcd(0x27,20,4);

#include <SD.h>
#include <SPI.h>

const uint8_t chipSelect = 9;

// Variablen
int player_nx;
int player_n = 0;

void setup() {
  
  // Setup Keyboard
  Serial.begin(115200);

    String key = "3 12 6 1 1022 315 186 511 241 158 340 195 136 255 164 120 0 0 0 0";
    keyboard.setupKey(key);

  // Setup LCD
  lcd.init();
  lcd.backlight();

  // Setup SD
  if (!SD.begin(chipSelect)) {
    lcd.print("SD Karte konnte nicht gefunden werden");
    return; 
  }

Ja das stimmt, nur lese ich den Text aus Textdateien einer SD Karte, und da weiß ich nicht wie ich 1000 individuelle Texte beeinflussen kann, sodass das funktionier

Bei den kleinen AVR ist es ungünstig, mit der Klasse String zu arbeiten, da damit der Speicher fragmentiert wird. Besser ist es mit Char-Arrays (so genanten C-Strings) zu arbeiten. Diese müssen mit einer binären 0, als Zeichen '\0' abgeschlossen sein.

Ich habe dazu mal ein Tutorial geschrieben.

Gruß Tommy

Na ja dann hast Du es ja letztlich mit eine variablem Text zu tun den DU ausgeben willst.
Der Text kann ja immer nur maximal zwei Zeilen haben. D.h. Du kannst Ihn schon auf der SD Karte mit einem Trennzeichen versehen.
wie willst Du denn auf den Text der SD Karte zugreifen ?
z.B über die Zeilennummer ?
Dann liest Du die Zeile in eine String Objekt , oder besser in ein C String ein und trennst Ihn an der Stelle mit dem Trennzeichen. Das Trennzeichen kann z.B ein Semikolon sein

SD Karte nicht ; gefunden

Dann kannst Du nach dem ; suchen und trennen. Den ersten Teil gibst Du in der ersten Zeile aus den Rest hinter dem ; in der zweiten Zeile mit LCD.setCurser ()

1 Like

Da fehlt die Hälfte vom Sketch - den Rest würde ich gerne haben, sonst macht das keinen Sinn

Aber ich hab Dir das für die Anzeige des einzelnen Textes mal gebaut:

void setup()
{
  // Setup Keyboard
  Serial.begin(115200);
  // Setup LCD
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(F("SD Karte wurde"));
  lcd.setCursor(0, 1);
  // Setup SD
  if (!SD.begin(chipSelect))
  {
    lcd.print(F("nicht "));
  }
  lcd.print(F("gefunden!"));
}
1 Like

Beschreibe mal besser das ganze Umfeld und was du eigentlich erreichen willst.
Auch ein Link auf die Library die du da einbindest wäre gut.

für einen "automatischen" Zeilenumbruch könntest du die interne write Funktion adapieren und einen Linefeed einbauen.

/*
    Automatic linefeed for LCD
    https://forum.arduino.cc/t/lcd-richtig-beschreiben/1361992/8

    2025-03-09 by noiasca

    todo: clear/wrap around at last row
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

constexpr uint8_t cols = 16;
constexpr uint8_t rows = 2; 

class MyLCD : public LiquidCrystal_I2C {
    uint8_t actCol = 0;
    uint8_t actRow = 0;
    const uint8_t cols;
    const uint8_t rows;
  public:
    MyLCD(uint8_t addr, uint8_t cols, uint8_t rows) : LiquidCrystal_I2C(addr, cols, rows), cols(cols), rows(rows) {};

    size_t write(uint8_t value) override {
      size_t result = LiquidCrystal_I2C::write(value);
      actCol += result;
      if (actCol >= cols) {
        actCol = 0;
        actRow++;
        setCursor(actCol, actRow);
      }
      return result;
    }

    void clear() {
      LiquidCrystal_I2C::clear();
      actCol = 0;
      actRow = 0;
    }

    void setCursor(uint8_t c, uint8_t r) {
      LiquidCrystal_I2C::setCursor(c, r);
      actCol = c;
      actRow = r;
    }
};

//MyLCD lcd(0x27, cols, rows);
MyLCD lcd(0x3F, cols, rows);

void setup() {
  Wire.begin();
  lcd.init();                      // initialize the lcd

  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("0123456789abcdefghijklm");
}


void loop() {
  delay(1000);
  lcd.clear();
  lcd.print("0123456789ABCDEFGHIJKLM"); lcd.print(millis() / 1000);
  
  delay (1000);
  lcd.setCursor(4, 0);  // should work also if you don't start at col 0
  lcd.print("A longer text should break"); lcd.print(millis() / 1000);
}
//
1 Like

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