Destinationsskilt på banegård

Her kan du debattere og stille spørgsmål til alt om elektronik og digitaldrift på modeljernbanen. Skal du have hjælp til en dekoder eller driller signalet? Stil dit spørsmål her.
moppe
Lokomotivfører
Indlæg: 4480
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Destinationsskilt på banegård

Indlæg af moppe »

Jeg har gang i et "hyggeforsøg".

På tysk hedder det en "zugzielanzeiger" og hænger ved næsten enhver moderne perron.

Den kan se sådan her ud:
Billede

Jeg har nogle små OLED display, godt nok i sort og ikke blå, som styres af en Arduino.

Her første prøve, sammen med en H0 julemand, for at illudere størrelsen
Billede

Dernæst to billeder der viser nuværende udviklingsstatus
Billede
Billede

Lige nu defineres spornummer i en variabel og der er et "Array" med 6 forskellige togafgange, komplet med tid, vogninformationer, nummer på togløb, mellemstationer, slutdestination og eventuel rulletekst (forsinkelse, eller andre informationer).
Der skiftes mellem de 6 destinationer hver 30. sekund.

På sigt skal to displays monteres på "min" modelbane i Hadsten.

Klaus
jhcn
Lokomotivfører
Indlæg: 287
Tilmeldt: 31 aug 2011, 09:16
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin C
Geografisk sted: Lystrup, nord for Århus

Re: Destinationsskilt på banegård

Indlæg af jhcn »

WAUW!

Det ser godt ud!!
Henrik

Kører digitalt med en CS2, 3-skinne, mest epoke IV-V, helst dansk + lidt tysk. Mangler plads - og penge - til en opstillet bane...
moppe
Lokomotivfører
Indlæg: 4480
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Re: Destinationsskilt på banegård

Indlæg af moppe »

Ja, lad mig sige det sådan: Det er jeg okay tilfreds med.

Efter billederne er taget, har jeg tilført kontrastkontrol, så lyset kan dæmpes og jeg har roteret hele teksten, så den "brede mekaniske kant" nu er over display og ikke under.

Når display monteres under perrontag, kan jeg bedre skjule den brede del under taget.


Klaus
bygger01
Lokomotivfører
Indlæg: 1530
Tilmeldt: 10 aug 2011, 07:57
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin K
Geografisk sted: Herning

Re: Destinationsskilt på banegård

Indlæg af bygger01 »

Hvis julemanden er H0, så er skiltets skærm ca. 10x25 mm + div. kanterne

Er det rigtig ?

Jørgen Steff. fra Herning
H0 / AC / Digital med CS3+ / K skinner / ca. Epoke III / og ikke kun DK ( p. gr. af dampen ).

moppe
Lokomotivfører
Indlæg: 4480
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Re: Destinationsskilt på banegård

Indlæg af moppe »

Den aktive del af skærmen er 28x7mm og består af 128x32 billedpixels.


Klaus
Swampthing
Stationsbetjent
Indlæg: 25
Tilmeldt: 23 jun 2018, 22:02
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin C + K
Geografisk sted: Bagsværd

Re: Destinationsskilt på banegård

Indlæg af Swampthing »

wow, - det er klasse, der er jo ikke et øje tørt :o
Jeg glæder mig til at se det endelige resultat
sarby
Lokomotivfører
Indlæg: 245
Tilmeldt: 03 jan 2017, 16:52
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin C

Re: Destinationsskilt på banegård

Indlæg af sarby »

Hej Klaus.

Gider du sende dit diagram over samling af skiltet, samt koden?

MVH
John
moppe
Lokomotivfører
Indlæg: 4480
Tilmeldt: 30 jul 2011, 12:22
Digital: Ja
Scale: H0 - 2-rail
Geografisk sted: Hammel
Kontakt:

Re: Destinationsskilt på banegård

Indlæg af moppe »

Hej John

Selvfølgelig vil jeg det.... :-)


Diagrammet er ret simpelt, så det kommer her i tekst:
Display - Arduino UNO
GND - GND
VCC - 3.3V
SCL - A5
SDA - A4

Nuværende "generation" af koden er version 13

Kode: Vælg alt

// Zugzielanzeiger für Bahnsteige, KDM Version 13
// 
//In Stummiforum (https://stummiforum.de/viewtopic.php?f=21&t=131472) hat Tobias siener Sketch teilt.
//
//Ich hab mehrere änderungen hingeführt und hier ist meiner version "Zugzielanzeiger für den Bahnsteig mit Arduino"
//
//Noten:
//
//
//Umlaute ersetzten laut folgender Chiffre:
//ä = \xF4
//ö = \xF5
//ü = \xFC
//ß = \xDF
//Ä = \xC4
//Ö = \xD6
//Ü = \xDC
//Würzburg ist daher W\xFCrzburg
//Verspätung ist daher Versp\xF4tung



#include <U8glib.h>

U8GLIB_SSD1306_128X32_2X u8g(U8G_I2C_OPT_NONE);

int count = 0;
unsigned long previousMillis = 0;     // Speichern letzte zeit der anziege hat sich geändert
const long interval = 31500;          // interval zwischen änderungen (milliseconds)
int varianten = 7;                    // anzahl varianten


char gleis[5];

char uhrzeit[][6]{ // [6] ist anzahl ziffern
  "09:34",
  "10:04",
  "12:53",
  "15:21",
  "17:02",
  "18:30",
  "21:45"
};
char zugnummer[][8]{// [8] ist anzahl charakteren
  "RB 1521",
  "RB 3237",
  "EC 172", 
  "ICE 592",
  "IC 602",
  "RE 7",
  "ICE 651",
 };
char ziel[][17]{// [17] ist anzahl charakteren
  "Aschaffenburg",
  "Plattling",
  "Hamburg - Altona", 
  "Berlin Ostbf",
  "Puttgarden",
  "Kiel / Flensburg",
  "Leipzig Hbf",
 };
char zuglauf1[][21]{ //[21] ist anzahl charakteren
  "Grossauheim - Kahl,",
  "Freising - Moosburg",
  "Berlin Hbf - ", 
  "Fulda - Kassel -",
  "Wuppertal - Dortmund",
  "Elmshorn - ",
  "Fulda - Eisenach"
  };
char zuglauf2[][21]{ //[21] ist anzahl charakteren
  "- Grosskrotzenburg",
  "- Landshut",
  "Hamburg Hbf", 
  "Braunschweig Hbf",
  "Bremen - Hamburg",
  "Ne\xFCmunster",
  ""
  };
char wagenstand[][9]{//[9] ist anzahl charakteren
  "",
  "",
  "-222211", 
  "11111",
  " 22111",
  "   2121",
  "111211"
 };
 char lauftext[][85]{ //[85] ist anzahl charakteren, mindstens 20 leerzeichnen um die lauftext zu haben
  "", 
  "",
  "                    Versp\xF4tung ca 10 Min", 
  "",
  "",
  "                    Zugteilung in Ne\xFCmunster - Vorne zugteil fahrt bis Flensburg    ",
  ""
  };




const unsigned int lauftextlength = 21;
int offset = 0;
int subset = 0;
char ausgabe[lauftextlength];

char incomingByte = 0;
unsigned int incomingBytePosition = 0;

enum ReceiveState
{
  ReceiveState_Idle,
  ReceiveState_Hash,
  ReceiveState_Lauftext,
  ReceiveState_Gleis,
  ReceiveState_Wagenstand,
  ReceiveState_Zuglauf1,
  ReceiveState_Zuglauf2,
  ReceiveState_Ziel,
  ReceiveState_Uhrzeit,
  ReceiveState_Zugnummer
};

ReceiveState currentState = ReceiveState_Idle;

enum GleisSeite
{
  GleisSeite_Links,
  GleisSeite_Rechts
};

GleisSeite gleisSeite = GleisSeite_Rechts; // definiert der layout der zugzielanzieger





void draw()
{
  u8g.setColorIndex(1);
  static int zugdatenSaplte = 0;
  if(gleisSeite == GleisSeite_Links)
  {
    zugdatenSaplte = 100;
  }
  else if(gleisSeite == GleisSeite_Rechts)
  {
    zugdatenSaplte = 0;
  }

  u8g.setFont(u8g_font_5x8); // 5x8
  u8g.drawStr(zugdatenSaplte, u8g.getFontAscent(), uhrzeit[count]);

  u8g.setFont(u8g_font_4x6); // 4x6
  u8g.drawStr(zugdatenSaplte, 7 + u8g.getFontAscent(), zugnummer[count]);

  if(strlen(wagenstand[count]) > 0)
  {
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_4x6); // 4x6
    u8g.drawStr(zugdatenSaplte, 15 + u8g.getFontAscent(), "ABCDEFG");
    u8g.drawBox(zugdatenSaplte, 21 + u8g.getFontAscent() - 5, strlen(wagenstand[count]) * 4, 6);
    u8g.setColorIndex(0);
    u8g.drawStr(zugdatenSaplte, 21 + u8g.getFontAscent(), wagenstand[count]); 
    u8g.setColorIndex(1);
  }

  static int zuglaufSpalte = 30;
  if(gleisSeite == GleisSeite_Links)
  {
    zuglaufSpalte = 20;
  }
  else if(gleisSeite == GleisSeite_Rechts)
  {
    zuglaufSpalte = 30;
  }

  //Verspätungsbox
  if(lauftext[count][20] != '\0')
  {
    u8g.setColorIndex(1);
    u8g.drawBox(zuglaufSpalte, 0, 78, 6);
    u8g.setColorIndex(0);
    u8g.setFont(u8g_font_4x6); // 4x6
    int remaining = strlen(lauftext[count]) - offset;
    if(remaining > (lauftextlength - 1))
    {
      remaining = lauftextlength - 1;
    }
    memcpy(ausgabe, &lauftext[count][offset], remaining);
    ausgabe[remaining] = '\0';
    u8g.drawStr(zuglaufSpalte-subset, 6, ausgabe);
    u8g.setColorIndex(1);
  }

  u8g.drawStr(zuglaufSpalte, 12, zuglauf1[count]);
  
  u8g.drawStr(zuglaufSpalte, 19, zuglauf2[count]);
  
  u8g.setFont(u8g_font_tpss);
  u8g.drawStr(zuglaufSpalte, 34 + u8g.getFontDescent(), ziel[count]);

  u8g.setFont(u8g_font_6x13B);
  if(gleisSeite == GleisSeite_Links)
  {
  u8g.drawStr(0, 13, gleis);
  }
  else if(gleisSeite == GleisSeite_Rechts)
  {
  u8g.drawStr(128 - (6 * strlen(gleis)), 13, gleis);
    
  }
  
}





void initializeStrings()
{
  String("9").toCharArray(gleis, 5); // Gleisnummer eigeben
}





void setup()
{
  initializeStrings();
   
  u8g.begin();
  u8g.setContrast(150);     // Kontrast eingeben
  u8g.setRot180();          // anzeige 180 grad rotieren.
}



void loop() {

unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) { 
      previousMillis = currentMillis;                // Speichern letzte zeit der anziege hat sich geändert
     count = (count+1);
     }
  if (count>(varianten-1)){
     count = 0;
     }
//  delay(1500);
  
  else{
  u8g.firstPage(); 
  do {
    
    draw();
    
  } while( u8g.nextPage() );
  
  subset += 1;
  if(subset > 3)
  {
    offset += 1;
    subset = 0;
  }
  
  if(offset > strlen(lauftext[count]))
  {
    offset = 0;
  }
}
  

}

Klaus
sarby
Lokomotivfører
Indlæg: 245
Tilmeldt: 03 jan 2017, 16:52
Digital: Ja
Scale: H0 - 3-rail
Skinnesystem: Märklin C

Re: Destinationsskilt på banegård

Indlæg af sarby »

Hej Klavs.

Tak for din kode, men desværre er der fejl i koden!

Jeg får følgende fejl:
exit status 1
Error compiling for board Arduino/Genuino Uno.

MVH
John
Skott
Lokomotivfører
Indlæg: 307
Tilmeldt: 18 jan 2013, 18:09
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: peco code 75

Re: Destinationsskilt på banegård

Indlæg af Skott »

Har du fået valgt den rigtige COM-port i Arduino IDE'en?
Besvar