4 LCD's an Arduino ?

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

volvodani:

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

Leider funktioniert das so nicht , wenn ich PROGMEM dazu schreibe , erscheint keine Lokbeschreibung auf dem Display
Im Programm übergebe ich die Daten an eine Variable

LCDText[0]=String(Loks[4];  // in dem Beispiel wäre das AE 8/14

//diese wiederum wird dann später ans LCD geschickt

lcd[1].print([0]);

Ich weiß nicht mehr weiter !
Gruß

Hab jetzt nochmal mit PROGMEM in einem Extra Sketch experimentiert , hier funktioniert es ,
Wenn ich das aber in meinem eigentlichen Sketch einbau ,geht's nicht !

#include <EEPROM.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#define NUM_LCD 4


LiquidCrystal lcd[NUM_LCD] = {
  LiquidCrystal(23, 24, 25, 29, 30, 31, 32),
  LiquidCrystal(23, 24, 26, 29, 30, 31, 32),
  LiquidCrystal(23, 24, 27, 29, 30, 31, 32), 
  LiquidCrystal(23, 24, 28, 29, 30, 31, 32)};

prog_char* Loks[64] PROGMEM={
  "-------","Adler","AE3/6","AE 8/14","BR01","BR03","BR03 Stroml",  "BR05","BR10","BR17","Rheingold","BR18.1","BR38","BR41","BR50","BR52 grau","BR53","BR80","BR81","BR85",
  "BR86","BR89","BR93","BR96","BR120","BR194", "BR212Trak","BR360","CargoSpri","DR212","E04","E19 blau","E19 Rot","E40","E52","E69","E70","E91","E103","E118b ",
  "E120","E151","Geisling","Heizerlok","Koef","Krokodil","Museumlok","ICE","Pendolino","Rottenkraft","Schienenbus","SVT137","Torflok","Unicef","V36","V100.20","VT11.5","V160 grau","V160 rot","V221",
  "Zeppelin","----","----","----"   };

prog_uint8_t Adressen[64] PROGMEM={
  0,78,6,24,1,3,36,5,10,17,18,17,36,41,50,0,53,79,78,8,
  66,76,73,9,12,64,22,60,70,20,4,74,19,40,52,24,70,67,33,19,
  12,51,23,46,3,22,19,2,47,3,60,0,70,17,38,10,115,47,16,21,
  24,0,0,0          };

String LCDText[5];

void setup(){
  for (int i = 0; i < NUM_LCD; i++){
    lcd[i].begin(20, 4);
    lcd[i].clear();
  }
  LCDText[0]=String(Loks[5])+"/"+String(Adressen[5]); // Übergabe an die Variable LCDText[]
  lcd[0].setCursor(2, 0);
  lcd[0].print(LCDText[0]);// Ausdruck
}
void loop(){

}