Go Down

Topic: 4 LCD's an Arduino ? (Read 2484 times) previous topic - next topic

benny123

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ß

MaFu

Sollte so funktionieren:
Code: [Select]
#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()
{
}
_______
Manfred

benny123

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

MaFu

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
_______
Manfred

benny123

#4
Mar 12, 2013, 05:45 pm Last Edit: Mar 12, 2013, 05:51 pm by benny123 Reason: 1
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 .

Eisebaer

hi,

alle achtung, schöne arbeit...

gruß stefan

benny123

#6
Mar 12, 2013, 06:08 pm Last Edit: Mar 12, 2013, 06:50 pm by benny123 Reason: 1
Vielen Dank !
An dieser Stelle nochmal ein Dank an "janvonnebenan" aus dem Rocrail Forum , der das Märklin Protokoll umgesetzt hat !
Gruß

MaFu

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

benny123

#8
Mar 12, 2013, 07:45 pm Last Edit: Mar 12, 2013, 07:48 pm by benny123 Reason: 1
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ß


mkl0815

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:
http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mja4d6cf19b9113d221e26e0a19eb4148c

benny123

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

mkl0815

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

//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)
Code: [Select]

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.

sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

benny123

#13
Mar 13, 2013, 08:07 am Last Edit: Mar 13, 2013, 11:31 am by benny123 Reason: 1

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

//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)
Code: [Select]

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 :)
Hier nochmal ein neues Bild , mit Beschriftung !


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. ;)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Go Up