LCD 16x1

Hallo Leute!
Habe heute mal wieder ne Frage, vielleicht kann jemand helfen?
Habe ein 16x1 Display!
Leider wird beim nachfolgenden *.ino nur die ersten 8 Zeichen angesteuert.

/*

LCD Anschluss:

  • LCD RS an Arduino Pin 12
  • LCD Enable an Arduino Pin 11
  • LCD D4 an Arduino Pin 5
  • LCD D5 an Arduino Pin 4
  • LCD D6 an Arduino Pin 3
  • LCD D7 an Arduino Pin 2
  • LCD R/W an Arduino Ground
  • 10K Widerstand von Arduino:

Quelle:
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
modified 14.12 2016
INO Sketch modified
by Skino

This example code is in the public domain.

*/

// include the library code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(8, 2);
Serial.begin(9600);
}

void loop() {

if (Serial.available()) {

delay(100);

lcd.clear();

while (Serial.available() > 0) {

lcd.write(Serial.read());
lcd.setCursor(0, 1);

}
}
}

Danke für Eure Hilfe!
Gruss Peter

Dann musst du die weiteren Zeichen in die zweite Zeile schreiben.

Das 16x1 ist ein 8x2, bei dem die beiden Zeilen hintereinander sind.
Du musst also die Stellen 8...15 mit einem setcursor(0,1) auf 2.Zeile Position 0 einleiten.

Gruß Tommy

Hier findest du weitere Infos: http://forum.arduino.cc/index.php?topic=440954.msg3035881#msg3035881

Hallo!
Ja den Link kenn ich ja ;-))
Das Problem ist, das dies ja kein Statische Text ist sondern nen String!
Kann man nen String teilen?
So nach dem Motto:
Ermittle Länge des Strings=> dann teile die Länge => schreibe 1. Hälfte vom String an die Position
(8 - Länge erste hälfte Sting) => dann Cursor (0,2) und => 2. Hälfte vom String.

Ich weiss sehr einfach gedacht, aber vielleicht ne "Denkidee".

Gruss Peter

Das einfachste ist Zeichen für Zeichen über den String zu iterieren. Dann jeweils nur ein Zeichen zu schreiben und mitzuzählen.

Kleines Test Programm mit dem Seriellen Monitor:

void setup() 
{
  Serial.begin(9600);

  printString("0123");
  printString("0123456789");
  printString("0123456789abcdef");
  printString("0123456789abcdef....");
}

void loop() 
{

}

void printString(const char* str)
{
  byte index = 0;
  
  Serial.print("Z1: ");
  while (index < 8 && str[index] != '\0')
    Serial.print(str[index++]);

  Serial.print(" - Z2: ");
  while (index < 16 && str[index]!= '\0')
    Serial.print(str[index++]);

  Serial.println();
}

println() darfst du auf dem LCD natürlich nicht machen und das am Ende ist nur für die Darstellung im Monitor.

Naja, das ist ja doch ein anderes Problem, wenn du eh schon alles kennst. :wink:

Also irgendwie scheine ich mich derzeit etwas komisch auszudrücken?
Was ich meinste ist, das ich den Link schon kenne (hab ich ja selbst angestoßen).
Aber das bezieht sich ja auf einen statischen Text!
Jetzt geht es aber um einen String!

Gruss Peter

Habe oben mal ein kleines Test-Programm hinein editiert.

Aber das bezieht sich ja auf einen statischen Text!
Jetzt geht es aber um einen String!

Statischer Text ist ein String! Das geht aber genauso mit variablen char Arrays. Wenn du die Arduino String Klasse meinst: verzichte am besten darauf und lerne mit C Strings umzugehen. Damit kann man wesentlich mehr machen.

Ansonsten wenn es unbedingt die String Klasse sein muss:
1.) Übergebe Strings an Funktionen immer als Referenz und nicht als Wert: void func(String& str)
2.) oder verwende die c_str() Methode um an an das interne char Array zu kommen

Aber am besten ist es man verwendet C Strings und schreibst seine Funktionen so dass sie einen const char* als Parameter haben. Dann kann man sowohl String Literale als auch char Arrays übergeben. Und zur Not auch String Objekte wenn man c_str() verwendet.