4 LCD's an Arduino ?

Hallo , ich betreibe vier LCD's an einem Arduino mit folgendem Code , das funktioniert soweit ganz gut.

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd1(12, 8, 5, 4, 3, 2);
LiquidCrystal lcd2(12, 9, 5, 4, 3, 2);
LiquidCrystal lcd3(12, 10, 5, 4, 3, 2);
LiquidCrystal lcd4(12, 11, 5, 4, 3, 2);

void setup() {
// set up the LCD's number of rows and columns:
lcd1.begin(16, 2);
lcd2.begin(16, 2);
lcd3.begin(16, 2);
lcd4.begin(16, 2);

// Print a message to the LCD.
lcd1.setCursor(0, 1);
lcd1.print("1");
lcd2.setCursor(0, 1);
lcd2.print("2");
lcd3.setCursor(0, 1);
lcd3.print("3");
lcd4.setCursor(0, 1);
lcd4.print("4");
}

void loop() {

}

um aber den Code möglichst klein zuhalten , ist meine Frage , ob man die LCD's-Bezeichnung in einem Array packen kann ? So stelle ich mir den Code dann vor:

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins

for (int i=1; i <= 4; i++){
LiquidCrystal lcd*(12,7+i, 5, 4, 3, 2);*
}
void setup() {
// set up the LCD's number of rows and columns:
for (int i=1; i <= 4; i++){
lcd*.begin(16, 2);*
}
// Print a message to the LCD.
for (int i=1; i <= 4; i++){
lcd*.setCursor(0, 1);*
lcd*.print(i);*
}
void loop() {
}
Ich hoffe , mit meiner laienhaften Erklärung kommt einer klar und hat eine Lösung für mich !
Gruß

Sollte so funktionieren:

#include <LiquidCrystal.h>

#define NUM_LCD 4

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd[NUM_LCD] = {LiquidCrystal(12,  8, 5, 4, 3, 2), 
                              LiquidCrystal(12,  9, 5, 4, 3, 2),
                              LiquidCrystal(12, 10, 5, 4, 3, 2), 
                              LiquidCrystal(12, 11, 5, 4, 3, 2)};

void setup()
{
  // set up the LCD's number of rows and columns
  for (int i = 0; i < NUM_LCD; i++)
    lcd[i].begin(16, 2);
    
  // Print a message to the LCD
  for (int i = 0; i < NUM_LCD; i++)
  {
    char num[5];
    itoa(i + 1, num, 10);
    lcd[i].setCursor(0, 1);
    lcd[i].print(num);
  }
}

void loop()
{
}

Hallo Manfred , vielen Dank , funktioniert perfekt !
Gruß Rainer

Na das ist doch schön.

Jetzt würde mich aber doch noch interessieren, für welche Anwendung Du vier Displays am Arduino benötigst? XD

Hallo , ich hab mir ein Pult für eine Eisenbahn-Steuerung gebaut.
Das ursprüngliche Projekt "Maerklino" habe ich im rocrail Forum gefunden,
da habe ich mir ein paar Handregler mit Display's drum herum konstruiert.
Vorher hatte ich den Code für die Display's viermal geschrieben , dank Deiner Hilfe ,
muss ich jetzt alles was mit den Display's zusammen hängt nur noch einmal schreiben.
Ersparnis jetzt schon knapp 2kBytes gegenüber der vorherigen Version .

hi,

alle achtung, schöne arbeit...

gruß stefan

Vielen Dank !
An dieser Stelle nochmal ein Dank an "janvonnebenan" aus dem Rocrail Forum , der das Märklin Protokoll umgesetzt hat !
Gruß

Wau, find ich super. Gefällt mit gut, sieht aus wie gekauft.

Vielen Dank ,ich stehe aber da noch vor einem Problem ,
im Sketch ist eine Liste mit Loks und deren zugehörigen Adressen ( über die die jeweilige Lok angesprochen wird )
sieht wie folgt aus

String Lok[80];
int Adresse[80];

void setup(){
Lok[1]="BR50"; // nicht alphabetisch sortiert
Adresse[1]=50;
Lok[2]="BR38";
Adresse[2]=38;
Lok[3]="ICE";
Adresse[3]=17;
Lok[4]="BR52";
Adresse[4]=52;
Lok[5]="E19";
Adresse[5]=19; //usw
}

Die Liste kann ich in dem Display einblenden ( jeweils 4 Loks ) und durchblättern !

Jetzt meine Frage :
Wie kann der Arduino eine alphabetische Reihenfolge der Loks erstellen?
Gruß

Naja, wenn die Loks im Programm fest codiert sind (wie in Deinem setup() Beispiel) würde ich sie dort einmal von Hand sortieren.
Sollten die Namen irgendwo dynamisch herkommen, brauchst Du eine Sortierfunktion die Anhand der Loknamen sortiert.
Das ist zwar möglich, aber nicht ganz trivial, da Du beim "Vertauschen" von zwei Loks beim Sortieren auch den anderen Parameter (Adresse) mit tauschen musst.
Zusätzlich brauchst Du eine Vergleichsfunktion für C-Strings.
Ansonsten schau Dir mal folgendes an:

Hallo , mittlerweile habe ich ca. 70 Loks , die auch einigermassen sortiert sind , kommt aber noch eine dazu ,
die mittendrin hängt , is es doch mühselig , alles wieder anzupassen . Ich schau mir mal deinen Link an , Vielen Dank

Na aber das ist doch einfach.
Wenn Du die Arrays anders definierst, sollte das gehen:

//3 Loks
const char* LOK[3] = {"BR38","BR50","BR52"};
const int Adresse[3] = {38,50,52};

statt dessen dann 4 Loks (hier als Beispiel mal die 42 einsortiert)

const char* LOK[4] = {"BR38","BR42","BR50","BR52"};
const int Adresse[4] = {38,42,50,52};

Damit brauchst Du keine Indizes hochzählen. Wenn der Speicher knapp wird, kannst Du die Arrays auch im Flash-Speicher ablegen, dann dümpeln die eh unveränderlichen Daten nicht im knappen RAM rum.

Erst mal vorab: Tolles Teil! 8)

Persönlich bin ich auch kein großer Freund von Sortieralgorithmen auf dem Arduino. Wie wäre es, das Ordnen nach wie vor per Hand zu machen und die Liste in einer Textdatei auf einer SD-Karte abzulegen? Dann könnte man die Daten leicht am PC editieren und zum Start des Mikrocontrollers geordnet in ein Array einlesen.

mkl0815:
Na aber das ist doch einfach.
Wenn Du die Arrays anders definierst, sollte das gehen:

//3 Loks

const char* LOK[3] = {"BR38","BR50","BR52"};
const int Adresse[3] = {38,50,52};



statt dessen dann 4 Loks (hier als Beispiel mal die 42 einsortiert)


const char* LOK[4] = {"BR38","BR42","BR50","BR52"};
const int Adresse[4] = {38,42,50,52};



Damit brauchst Du keine Indizes hochzählen. Wenn der Speicher knapp wird, kannst Du die Arrays auch im Flash-Speicher ablegen, dann dümpeln die eh unveränderlichen Daten nicht im knappen RAM rum.

Hallo , ich denke , hier der Vorschlag ist am einfachsten umzusetzen, Vielen Dank

Der Spaß hat jetzt keine 100,- Euro gekostet , lediglich einen Haufen Zeit :slight_smile:
Hier nochmal ein neues Bild , mit Beschriftung !

Ich finde das Steuerpult klasse, hätte aber die Ausschnitte für die Displays nur so groß gemacht wie die sichtbare Displayfläche. Sahnehäubchen wäre dann die unsichtbare Befestigung der LCDs. :wink:

sth77:
Ich finde das Steuerpult klasse, hätte aber die Ausschnitte für die Displays nur so groß gemacht wie die sichtbare Displayfläche. Sahnehäubchen wäre dann die unsichtbare Befestigung der LCDs. :wink:

Da gebe ich dir recht, nur habe ich den Ausschnitt mit Säge und Feile raus gearbeitet und so fällt es nicht auf , das nicht alles so 100 prozentig gerade ist :slight_smile:

mkl0815:
Damit brauchst Du keine Indizes hochzählen. Wenn der Speicher knapp wird, kannst Du die Arrays auch im Flash-Speicher ablegen, dann dümpeln die eh unveränderlichen Daten nicht im knappen RAM rum.

Hallo , wie bekomme ich die Arrays in den Flashspeicher , ich suche mir nämlich grade einen Ast !

Dank im voraus !

Schau mal hier ist das ausgeführt
Progmem ist das zauberwort

Gruß
Der Dani

Vielen Dank !
Es funktioniert,aber nur um sicher zugehen sicher zugehen ,ist das so richtig

prog_char* Loks[61] ={"-------","Adler","AE3/6","AE 8/14"........};
prog_uint16_t Adressen[61] ={0,78,6,24,1,3,36,5,10,17.........};

prog_char* Loks[61] PROGMEM ={"-------","Adler","AE3/6","AE 8/14"........};
prog_uint16_t Adressen[61] PROGMEM ={0,78,6,24,1,3,36,5,10,17.........};

Ich glaube es ist so Richtig.
Gruß
Der Dani