Lauftext für 3 20x4 Display

Moin Miteinander,leider habe ich mal wieder ein Problem.Da ich mit meinem Latrin am Ende bin und nicht weiter weiß,brauche ich mal Hilfe.Ich bin dabei einen Lauftext für 3 Displays in der Ausführung 20 x 4
zu schreiben.Aber irgendwie habe ich immer einen Wurm drin.Meine bisherigen Versuche haben nicht zum Erfolg geführt.Der Sketch läuft bisher nur auf einem Display wobei auch eine Umschaltung des Textes sowie eine Dimmung der Hintergrundbeleuchtung funktionieren.Anbei habe ich hier mal den Sketch für ein Display.
MfG
Crazydiver

#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
hd44780_I2Cexp lcd1;

#define LCD_COLS 20
#define LCD_ROWS 4
const int analogInPin = A0;
const int analogOutPin = 9;
int sensorValue = 0;
int outputValue = 0;
const int LED1 = 13;
const int LED2 = 9;
const int schalterPin = 8;

int textumschalter = 0;  // Signal Textumschaltung

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(schalterPin, INPUT);
  sensorValue = analogRead(analogInPin);
  outputValue = map(sensorValue, 970, 0, 5, 240);
  analogWrite(analogOutPin, outputValue);
  lcd1.begin(LCD_COLS, LCD_ROWS);
}

void loop() {

  
  
    textumschalter = digitalRead(schalterPin);
    if (textumschalter == LOW) {
    digitalWrite(LED1, LOW);

    const char s1[] = "      Vorsicht                         in Zusammenarbeit                       ";
    const char s2[] = "   Ausnahmekonvoi                             mit                              ";
    const char s3[] = "        Lu`s                             LK`s Speedboat                        ";
    const char s4[] = "  Spezialtransporte                          Racing                            ";
   
    for (byte j = 0; j < sizeof(s1) - LCD_COLS; j++) {
    lcd1.setCursor(0, 0);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s1[j + k]);
    }
    lcd1.setCursor(0, 1);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s2[j + k]);
    }
    lcd1.setCursor(0, 2);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s3[j + k]);
    }
    lcd1.setCursor(0, 3);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s4[j + k]);
    }
    delay(950);
    
    textumschalter = digitalRead(schalterPin);
    if (textumschalter == HIGH) {
    digitalWrite(LED1, HIGH);

     const char s5[] = "      Attention                               in                              ";
     const char s6[] = " Convoi Exceptionnel                   cooperation with                       ";
     const char s7[] = "        Lu`s                            LK`s Speedboat                        ";
     const char s8[] = "  special transports                        Racing                            ";

    for (byte j = 0; j < sizeof(s5) - LCD_COLS; j++) {
    lcd1.setCursor(0, 0);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s5[j + k]);
    }
    lcd1.setCursor(0, 1);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s6[j + k]);
    }
    lcd1.setCursor(0, 2);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s7[j + k]);
    }
    lcd1.setCursor(0, 3);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s8[j + k]);
    }
    delay(950);
     
    }}}}}

Warum fängst Du zum gleichen Thema einen neuen Thread an?

Soll auf jedem der 3 LCD ein eigener Text scrollen oder soll der Text über alle 3 LCD scrollen?
Wie soll er scrollen?

Gruß Tommy

Moin Tommy der Text soll über alle 3 Display gleich sein.

Hi

'über' und 'gleich sein' verstehe ich nicht.

Wenn alle drei Displays das Gleiche anzeigen sollen:

  • nimm drei I2C-Display von eBay oder der Quelle, Die Dir lieber ist
  • belasse alle drei Displays auf identischer Adresse
  • schicke die Daten, Die Du sehen willst
    -> alle Displays fühlen sich angesprochen und zeigen den Text an
    Nachteil: Du kannst so kein Display einzeln beschreiben.

Wenn die Laufschrift vom Linken, über das Mittlere zum rechten Display 'wandern' soll, würde ich wohl ein char-Array für mein 6004-Display bauen, dort den Text eintragen, Den ich haben will und eine Funktion schreiben, Die den Bereich ausliest, Der auf dem gerade gewähltem Display angezeigt werden soll.
... ggf. das Array links/recht um leer-Zeichen erweitern, wobei man Das auch per Funktion erledigen kann, daß entweder der Text-Banner 'im Kreis' auf die Displays gelegt wird, oder eben die Bereiche, wofür kein Text vorhanden ist, leer macht.

MfG

Postmaster die Schrift soll auf allen 3 Display gleich sein da die an 3 Seiten eines Modelles sitzen(Rechts,links und hinten.Und für den Fall das das immer noch nicht verstanden worden ist schicke ich gerne entsprechende Bilder.
MfG
Crazydiver

Hallo,

wenn du den Code ordentlich formatieren würdest, könnten nicht nur wir den besser lesen und erkennen das deine if und for eigentlich nur Unsinn machen. Was ich auch nie verstehen werde ist, warum man immer gleich mit allen komplett anfängt anstatt es erstmal mit einer einzigen Zeile zu versuchen, dann erkennt man den Mechanismus dahinter viel viel eher.

Per Indexposition einlesen und in umgekehrter Indexpostion aufs Display ausgeben. Darüber würde ich mir jetzt Gedanken machen. Für genau eine Zeile. Auch würde ich die const char array nicht Riesengroß machen, sondern auch nur 20 Zeichen lang oder so das die Zeilen links bündig passen. Für Leerzeichen hinten würde ich keinen Speicher verschwenden. Maximal noch als Zeilenpuffer nutzen den man dazwischen schieben könnte. Vielleicht ist der auch überflüssig wenn das mit dem Index Hand in Hand geht.

Im Grunde soll das so aussehen im Durchlauf. Jetzt kannste dir Gedanken machen was mit der Indexposition vom Array und was mit der Spaltenpos. auf der Displayzeile passieren muss damit sich etwas bewegt. Also wie die sich zueinander ändern.

Moin Miteinander,hier sind jetzt mal die Bilder dazu.Die ersten beiden Displayseiten laufen in Deutsch durch,danach erfolgt eine Umschaltung in die zweite Sprache für die nächsten beiden Displayseiten in Englisch.Die Bilder dazu müssen Huntergeladen werden.
MfG
Crazydiver

DSCI0712.jpg

DSCI0719.jpg

DSCI0722.jpg

Moin Miteinander,hier sind jetzt mal die Bilder dazu.Die ersten beiden Displayseiten laufen in Deutsch durch,danach erfolgt eine Umschaltung in die zweite Sprache für die nächsten beiden Displayseiten in Englisch.Die Bilder dazu müssen Huntergeladen werden.
MfG
Crazydiver

DSCI0722.jpg

DSCI0712.jpg

DSCI0719.jpg

Der erste der beiden hat leider die falsche Reihenfolge der Bilder.Der ganze Text samt Umschaltung soll später dann auf der Displays laufen in genau der Reihenfolge wie im vorletzten Post.
MfG
Crazydiver

Crazydiver:
Postmaster die Schrift soll auf allen 3 Display gleich sein da die an 3 Seiten eines Modelles sitzen(Rechts,links und hinten.Und für den Fall das das immer noch nicht verstanden worden ist schicke ich gerne entsprechende Bilder.
MfG
Crazydiver

Da hat doch postmaster schon die Lösung gepostet, oder nicht?
Wenn alle drei Displays das Gleiche anzeigen sollen:

  • nimm drei I2C-Display von eBay oder der Quelle, Die Dir lieber ist
  • belasse alle drei Displays auf identischer Adresse
  • schicke die Daten, Die Du sehen willst
    -> alle Displays fühlen sich angesprochen und zeigen den Text an
    Nachteil: Du kannst so kein Display einzeln beschreiben.

Crazydiver:
Der erste der beiden hat leider die falsche Reihenfolge der Bilder.Der ganze Text samt Umschaltung soll später dann auf der Displays laufen in genau der Reihenfolge wie im vorletzten Post

Du solltest dich mal mit der Bedienung des Forum befassen.
Du kannst die Bilder auch nachträglich in deinem Thread bearbeiten oder austauschen.
Dann brauchst du nicht immer alles doppelt posten.
Das macht es nicht unbedingt übersichtlicher.

Moin Miteinander, mittlerweilen läuft jetzt mein Lauftext über alle 3 Displays gleich .
MfG
Crazydiver

Crazydiver:
Moin Miteinander, mittlerweilen läuft jetzt mein Lauftext über alle 3 Displays gleich .

Und für alle Mitlesenden solltest du auch eine Lösung präsentieren.

Hier ist der Sketch dazu.
MfG
Crazydiver

#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
hd44780_I2Cexp lcd1;

#define LCD_COLS 20
#define LCD_ROWS 4
int t;
const int analogInPin = A0;
const int analogOutPin = 9;
int sensorValue = 0;
int outputValue = 0;
const int LED1 = 13;
const int LED2 = 9;
const int schalterPin = 8;

int textumschalter = 0;  // Signal Textumschaltung

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(schalterPin, INPUT);
  sensorValue = analogRead(analogInPin);
  outputValue = map(sensorValue, 970, 0, 5, 240);
  analogWrite(analogOutPin, outputValue);
  lcd1.begin(LCD_COLS, LCD_ROWS);
}

void loop() {

    textumschalter = digitalRead(schalterPin);
    if (textumschalter == LOW) {
    digitalWrite(LED1, LOW);

    const char s1[] = "      Vorsicht                         in Zusammenarbeit                       ";
    const char s2[] = "   Ausnahmekonvoi                             mit                              ";
    const char s3[] = "        Lu`s                             LK`s Speedboat                        ";
    const char s4[] = "  Spezialtransporte                          Racing                            ";
   
    for (byte j = 0; j < sizeof(s1) - LCD_COLS; j++) {
    lcd1.setCursor(0, 0);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s1[j + k]);
    }
    lcd1.setCursor(0, 1);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s2[j + k]);
    }
    lcd1.setCursor(0, 2);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s3[j + k]);
    }
    lcd1.setCursor(0, 3);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s4[j + k]);
    }
    delay(950);
    lcd1.print(" ");
    
    textumschalter = digitalRead(schalterPin);
    if (textumschalter == HIGH) {
    digitalWrite(LED1, HIGH);

     const char s5[] = "      Attention                               in                              ";
     const char s6[] = " Convoi Exceptionnel                   cooperation with                       ";
     const char s7[] = "        Lu`s                            LK`s Speedboat                        ";
     const char s8[] = "  special transports                        Racing                            ";

    for (byte j = 0; j < sizeof(s5) - LCD_COLS; j++) {
    lcd1.setCursor(0, 0);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s5[j + k]);
    }
    lcd1.setCursor(0, 1);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s6[j + k]);
    }
    lcd1.setCursor(0, 2);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s7[j + k]);
    }
    lcd1.setCursor(0, 3);
    for (byte k = 0; k < LCD_COLS; k++) {
    lcd1.print(s8[j + k]);
    }
    delay(950);
    lcd1.print(" "); 
    }}}}}