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
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
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 ()
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!"));
}
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);
}
//
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
