Side 1 af 3

Destinationsskilt på banegård

: 25 jun 2018, 23:56
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

Re: Destinationsskilt på banegård

: 26 jun 2018, 10:53
af jhcn
WAUW!

Det ser godt ud!!

Re: Destinationsskilt på banegård

: 26 jun 2018, 11:27
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

Re: Destinationsskilt på banegård

: 26 jun 2018, 15:26
af bygger01
Hvis julemanden er H0, så er skiltets skærm ca. 10x25 mm + div. kanterne

Er det rigtig ?

Re: Destinationsskilt på banegård

: 26 jun 2018, 18:46
af moppe
Den aktive del af skærmen er 28x7mm og består af 128x32 billedpixels.


Klaus

Re: Destinationsskilt på banegård

: 01 jul 2018, 23:55
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

Re: Destinationsskilt på banegård

: 01 aug 2018, 11:49
af sarby
Hej Klaus.

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

MVH
John

Re: Destinationsskilt på banegård

: 06 aug 2018, 22:27
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

Re: Destinationsskilt på banegård

: 07 aug 2018, 08:33
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

Re: Destinationsskilt på banegård

: 07 aug 2018, 09:27
af Skott
Har du fået valgt den rigtige COM-port i Arduino IDE'en?