Arduino Scale Model Lego Train Schedule Board

I wanted to create a running schedule board that would list the destination and the time it would arrive at the station (no correlation with any train automation). I used the Lego train station currently available to buy and incorporated the OLED into the station in two locations.


I took what I know from coding a basic 12c OLED screen 128x32 pixel which gives you four lines of text at size 1 for the Adafruit GFX. I took a basic Arduino Nano board, a breadboard, and jumper wires to connect to the 12c OLED board. You can use an Uno as well for this, but I had an extra Nano board around to use, which makes it easier to mount the board directly to the breadboard. Normal setup of 12c OLED board with these connections: VCC to 3.3v (could be 5v for some screens), GND to GND, SCL to A5, SDA to A4. Important to make sure you have included libraries of: Adafruit BusIO, GFX Library, and SSD1306 (these could differ depending on the screen you buy). The code I provide is similar to the example that Arduino provides in the programmer. The intervals I used were shorter than real time, so adjust for your own use. I decided to have the intervals of 1 min = 20 secs in real time for program.

The code I used is below:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Declaration for SSD1306 display connected using software SPI:
//#define OLED_MOSI   9
//#define OLED_CLK   10
//#define OLED_DC    11
//#define OLED_CS    12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  Serial.begin(9600);
  
  // initialize the OLED object
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
}

  // Uncomment this if you are using SPI
  //if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  //  Serial.println(F("SSD1306 allocation failed"));
  //  for(;;); // Don't proceed, loop forever
  //}

  // Clear the buffer.
void loop() {
  display.clearDisplay();

  // Display Text
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("LCTA Blue Line");
  display.setCursor(0,8);
  display.println("Stay with baggage");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(0,16);
  display.println(" Report bad behavior ");
  display.setTextColor(WHITE);
  display.setCursor(0,24);
  display.println("Our App @ lcta.gov");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(100000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("5 mins");
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("10 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("4 mins");
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("9 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setCursor(88,24);
  display.println("12 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("3 mins");
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("8 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("15 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("2 mins");
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("7 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("14 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("1 min");
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("6 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("arr");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("5 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("12 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("dep");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("Plateville");
  display.setCursor(88,16);
  display.println("5 mins");
  display.setCursor(0,24);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("12 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setCursor(88,8);
  display.println("4 mins");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,16);
  display.println("11 mins");
  display.setTextColor(WHITE);
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("18 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setCursor(88,8);
  display.println("3 mins");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("West Tile");
  display.setCursor(88,16);
  display.println("9 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("17 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setCursor(88,8);
  display.println("2 mins");
  display.setCursor(0,16);
  display.println("West Tile");
  display.setCursor(88,16);
  display.println("8 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("16 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setCursor(88,8);
  display.println("1 min");
  display.setCursor(0,16);
  display.println("West Tile");
  display.setCursor(88,16);
  display.println("7 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("14 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("arr");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("West Tile");
  display.setCursor(88,16);
  display.println("6 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Plateville");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("dep");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("West Tile");
  display.setCursor(88,16);
  display.println("6 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setCursor(88,8);
  display.println("5 mins");
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("12 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("19 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setCursor(88,8);
  display.println("4 mins");
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("11 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("18 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setCursor(88,8);
  display.println("3 mins");
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("10 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("17 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setCursor(88,8);
  display.println("2 mins");
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("9 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,24);
  display.println("16 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setCursor(88,8);
  display.println("1 min");
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("8 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setCursor(88,24);
  display.println("14 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("arrived");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("7 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("West Tile");
  display.setTextColor(BLACK, WHITE);
  display.setCursor(88,8);
  display.println("departed");
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("Lego City");
  display.setCursor(88,16);
  display.println("7 mins");
  display.setCursor(0,24);
  display.println("Duplo Heights");
  display.setCursor(88,24);
  display.println("13 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(10000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Bricktown Station");
  display.setCursor(0,8);
  display.println("Lego City");
  display.setCursor(88,8);
  display.println("6 mins");
  display.setCursor(0,16);
  display.println("Duplo Heights");
  display.setCursor(88,16);
  display.println("12 mins");
  display.setCursor(0,24);
  display.println("Lego City");
  display.setCursor(88,24);
  display.println("18 mins");
  display.display();
  display.startscrollleft(0x00, 0x00);
  delay(20000);
  display.clearDisplay();

}

2 Likes

Thanks for telling. Using schematics instead of words would be better.

Perhaps this is not the right category?
Projects Discussion and Showcase ?

I agree. Moved to Exhibition / Gallery - Arduino Forum.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.