ARDUINO Bahnsteigsanzeige Prinzipschaltung für 2 Zuganzeigen

Auf Gleis 2 fährt ein
D64 nach Hamburg
Erforderliche Bauteile:
ARDUINO UNO mit einem Steckbord (auch Breadboard genannt)
OLED DISPLAY SSD1306 128x32 SPI
2 Mikrotaster, 2 x 1kOhm Widerstände, etwas Schaltdraht

Wäre es nicht schön eine kleine Anzeige auf Bahnsteigen zu haben, auf der zu Zuganzeige zu sehen ist?
Ich beschreibe hier ein Prinzip-Beispiel, um das Grundsätzliche zu erklären.  Mittels 2 Taster können 2 Zuganzeigen auf einem Display dargestellt werden. Betätigt man beide Taster gleichzeitig, so wird die Anzeige gelöscht. Individuelles Anpassen und Erweiterungen sollten dann für niemanden ein Problem sein.

Für dieses Beispiel verwenden wir ein OLED-Display (OLED = Organic Light Emetting Diod, also organisch Licht emittierende Diode). Typ: SSD1386, 128x32 SPI, mit einer Anzeigegröße von nur 0,91", damit es gegebenenfalls auch an einem H0-Bahnsteig eingebaut werden kann. Ebenso kann eine solche Anzeige auch auf dem Stelltisch, z.B. innerhalb eines Gleisbildstellwerks, verbaut werden. Siehe beispielsweise unter https://www.adafruit.com/search?q=SSD1386%2C+128x32+SPI

 

Beachte:

es wird hier ein ein OLED-Display mit der Bezeichnung "SPI" verwendet!

Es gibt dieses Display auch mit der Bezeichnung "I2C" (sprich: i Quadrat C);
welches für dieses Programm hier nicht funktionieren würde! (anders anzuschließen).

 


Abb. des Programms "Fritzing"
Die Schaltung

Der Schaltungsaufbau ist denkbar einfach und kommt mit äußerst wenigen Bauteilen aus:

- 1x SSD1386, 128x32 SPI 0,91"
- 2x Taster
- 2x 1 kOhm Widerstände
- 1x Steckbrett
- etwas Schaltdraht
- 1x ARDUINO Uno
- 1x USB-Kabel zum PC (Stromversorgung und Programmieren)

Die Software

es werden einige Libraries (=Bibliotheken) benötigt. Die IDE vom ARDUINO beinhaltet bereits die wesentlichsten, sofern nicht, können sie via Internet beschafft werden; wie beispielsweise:
- Adafruit GFX.h
- Adafruit_SSD1306.h

Weitere Informationen zum Thema Library (Bibliothek) siehe unter:
ARDUINO => Grundlagen => ARDUINO Library auf diesen Seiten.

 

Die Bedienung
Wenn der Sketch (das Programm) im ARDUINO geladen ist, startet das Programm automatisch.
Ausschalten: einfach die Stromversorgung unterbrechen. Einschalten: einfach Stromversorgung anschließen.

Display startet im Grundzustand mit der Anzeige:
Gleis 2
-----------------------

Taster TaA: Anzeige für den Personenzug P23 nach Pasing; Anzeige:
Gleis 2       P23
-----------------------
Pasing

Taster TaB: Anzeige für den D-Zug D64 nach Hamburg; Anzeige:
Gleis 2      D64
------------------------
Hamburg

Gleichzeitiges Betätigen der Taster TaA und TaB: Anzeige wird gelöscht; Anzeige:
Gleis 2
-----------------------

Beachte auch die Hinweise "Serail-Monitor" und "Hyper-Terminal" unter
ARDUINO => Grundlagen => Grundlagen der Programmierung auf diesen Seiten!


Das Programm (Sketch)

// HJB-Zuganzeige_OLED128x32SPI_UNO
// Zuganzeige (Bahnsteigsanzeige) COM 11 <= je nach PC-Verbindung unterschiedlich
// Taster Digital I/O Monitor mit OLED-Display
// nach Programmstart bitte den Serail-Monitor zur Anzeige auf dem PC starten!
// _________________________________________________________________
// DEFINITIONEN OLED-Display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Wenn SPI Software verwendet wird (ist der Standardfall):
#define OLED_MOSI   9    // Pin-Nr. gilt fuer ARDUINO UNO!
#define OLED_CLK   10    // Pin-Nr. gilt fuer ARDUINO UNO!
#define OLED_DC     11    // Pin-Nr. gilt fuer ARDUINO UNO!
#define OLED_CS     12    // Pin-Nr. gilt fuer ARDUINO UNO!
#define OLED_RESET 13 // Pin-Nr. gilt fuer ARDUINO UNO!
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


 
/* dieser Block ist auskommentiert, wenn SPI-Hardware verwendet wird:
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);

*/

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


// Definiere Taster
int A = 7; // definiert I/O-Eingang 2 als Ganzzahl fuer die Variable A
int B = 8; // definiert I/O-Eingang 3 als Ganzzahl fuer die Variable B
int TaA; // Variable zum Speichern des Eingangssignals als Ganzzahl (Taste A)
int TaB; // Variable zum Speichern des Eingangssignals als Ganzzahl (Taste B)


// Definiere Start
int Start;
// _________________________________________________________________
// SETUP-ROUTINE (wird nur einmal beim Programmstart durchlaufen)
void setup()
{
// für OLED-Display
Serial.begin(9600);

 
// Vorgabewert ist +3,3V, erforderlich!
  display.begin(SSD1306_SWITCHCAPVCC);
  // Initialisierung beendet
  // Puffer loeschen.
  display.clearDisplay();

// für Taster
    pinMode(A, INPUT); // definiert den Pin fuer Taste A als Eingang
    pinMode(B, INPUT); /
/ definiert den Pin fuer Taste B als Eingang
    Serial.begin(9600);
// definiert die serielle Schnittstelle mit der Baudrate 9600

// Anfangsvariable für Start setzen
Start=0;   
}

// _________________________________________________________________
// HAUPTPROGRAMM (Programmablauf in einer Endlosschleife)
// Schleifen-Start
void loop()
{

// für Taster
    TaA=digitalRead(A); // Uebergibt den gemessenen Wert am Digitaleingang 2 der Variablen TaA
    TaB=digitalRead(B);
// Uebergibt den gemessenen Wert am Digitaleingang 3 der Variablen TaB
   
if(Start==0)
  {  
        Serial.write(27);
        Serial.println("[01;40H");
        Serial.println("            ");
        Serial.print("            ");
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.println("Gleis 2           ");

        // display.setTextColor(BLACK, WHITE); // invertierter Text
       display.println("------------------");
       display.setTextSize(2);
       display.setTextColor(WHITE);
       display.setTextColor(BLACK, WHITE);
// invertierter Text
       display.println("         ");
       display.display();
       delay(500);
      
display.clearDisplay();
 }

  // Ende 1-maliger Durchlauf beim Start, setzt Display in den Anfangszustand
     Start=1;
     if(TaA==1 & TaB==0)
    {
      Serial.write(27);
     
Serial.println("[01;40H");
      Serial.print("Gleis 2");
// Text auf Monitor, wenn Ta A gedrueckt ist
      Serial.println("  P23");
     
Serial.print("Pasing");
      // OLED-Display
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2       P 23");

      // display.setTextColor(BLACK, WHITE); // invertierter Text
      display.println("------------------");
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setTextColor(BLACK, WHITE);
// invertierter Text
      display.println(" Pasing  ");
      display.display();
      delay(500);
      display.clearDisplay();
    }
    if(TaA==0 & TaB==1)
{
      Serial.write(27);
      Serial.println("[01;40H");
      Serial.print("Gleis 2");
// Text auf Monitor, wenn Ta A gedrueckt ist
      Serial.println("  D64");
     
Serial.print("Hamburg");
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2       D 64");
    
// display.setTextColor(BLACK, WHITE); // invertierter Text
     display.println("------------------");
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setTextColor(BLACK, WHITE);
// invertierter Text
     display.println(" Hamburg ");
     display.display();
     delay(500);
     display.clearDisplay();
    }
    if(TaA==1 & TaB==1) // loescht Anzeige auf dem Monitor
    {
     
Serial.write(27);
     
Serial.println("[01;40H");
     
Serial.println("            ");
     
Serial.print("            ");
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2           ");
    
// display.setTextColor(BLACK, WHITE); // invertierter Text
     display.println("------------------");
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setTextColor(BLACK, WHITE);
// invertierter Text
     display.println("         ");
     display.display();
     delay(500);
    
display.clearDisplay();
    }
    delay(500);
// verzoegert, bis ein neuer Wert angezeigt werden kann
    Serial.print('\r');
}

// Schleifen-Ende und Ruecksprung zum Schleifen-Start
// _________________________________________________________________
 
einige zusätzliche Erklärungen zu linken Listing



















Von mir hier grau hinterlegter Text sind Anweisungen,
welche bei dem hier verwendeten Display nicht zur Anwendung
kommen!









Bemerkung:
im links stehenden Listing sehen Sie Text in Farbe;
dies wird so in einem Programm Namens "Fritzing" dargestellt.
Auf diese Weise ist ein Listing übersichtlicher.
Das Programm Fritzing wird an anderer Stelle vorgestellt.
Bei ARDUINO IDE wird ein Listung ebenfalls farbig dargestellt,
doch nicht so detailliert, wie bei Fritzing.









Bemerkung:
da Programmierungen i. A. in englischer Sprache erfolgt,
kennen die meisten Editoren keine Umlaute; verwendet man sie
dennoch, so werden Hieroglyphen dargestellt.
Um dies zu vermeiden, habe ich hier in den Kommentarzeilen
für "Ä" = "Ae", "ä" = "ae", "ö" = "oe", usw. gesetzt;
ebenso "ß" = "ss".












Wenn Start = 0, dann wird das Display in einen Anfangszustand gesetzt ("gelöscht").



die Anzahl der Leerzeichen (".......") ist abhängig von der Anzahl der Zeichen, welche im Display weiter unten im Listing zur Anzeige kommen sollen.



















"Gleis 2"                 [kann individuell geändert werden]
Personenzug "P23" [kann individuell geändert werden]
nach "Pasing"          [kann individuell geändert werden]



[kann individuell geändert werden]





[kann individuell geändert werden]








"Gleis 2"             [kann individuell geändert werden]
D-Zug "D64"      [kann individuell geändert werden]
nach "Hamburg" [kann individuell geändert werden]



[kann individuell geändert werden]





[kann individuell geändert werden]








(".......") Leerzeichen eventuell anpassen,
wenn Text im Listing geändert wird;
"Pasing", "Hamburg"; Anzahl der Buchstaben!








(".......") Leerzeichen eventuell anpassen,
wenn Text im Listing geändert wird;
"Pasing", "Hamburg"; Anzahl der Buchstaben!







 

 

Anmerkung:
Sie können obiges Listing komplett markieren, mit Strg+C in die Zwischenablage kopieren und dann in die bereits aufgerufene IDE des ARDUINO mit Strg+V einfügen. Es wird aber demnächst noch eine Zip-Datei zum Download folgen; ebenso ein Download für die Software "Fritzing", beinhaltet dann Listing und Schaltungsaufbau (Beschreibung dazu wird unter "ARDUINO und Zubehör" folgen).



 

zurück zu ARDUINO