Train station departure display screen project

I am working on a Train Station departure screen project, also called the CTA screens. So far I have a working analog version, when you can manually place the inside in the display messages 2-6, but this should eventually become digital and even linked to the sensor, but I want to do some small ones first and ten first I want the following

I want to remove the Analog clock from station display and replace it with a digital clock if possible. Is this possible without completely turning the sketch upside down?

the current sketch shows 6 different departure times, these now work analogously and manually.

and how he should become

`#include <RTClib.h> // Real Time Clock library
RTC_DS1307 RTC;     // Creates a real time clock with the name RTC
#define MSG1_PIN 2
#define MSG2_PIN 3
#define MSG3_PIN 4
#define MSG4_PIN 5
#define MSG5_PIN 6
#define MSG6_PIN 7
#define TMIN     5 // departure time of next train, minimum of random time
#define TMAX    13 // departure time of next train, maximum of random time

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

// setup the OLED display]
Adafruit_SSD1306 oled(4);
byte bg = WHITE, fg = BLACK; // background- and foreground colors
byte hour, minute, second; 
byte msgnr, msgnr_old, msgflag, msghour, msgminute;
float angle;

// Define the RTC

void calc_msg_time() {
  msgminute = msgminute + random(TMIN, TMAX);
  if (msgminute > 59) {
    msghour = (msghour + 1) % 24;
    msgminute = msgminute - 60;
  }
}

void print_msg_time() {
  oled.setTextColor(fg);
  oled.setTextSize(1);
  oled.setCursor(40,2);
  if(msghour < 10) oled.print(" ");
  oled.print(msghour);
  oled.print(":");
  if(msgminute < 10) oled.print("0");
  oled.print(msgminute);
}

void setup() {
  pinMode(MSG1_PIN, INPUT_PULLUP);
  pinMode(MSG2_PIN, INPUT_PULLUP);
  pinMode(MSG3_PIN, INPUT_PULLUP);
  pinMode(MSG4_PIN, INPUT_PULLUP);
  pinMode(MSG5_PIN, INPUT_PULLUP);
  pinMode(MSG6_PIN, INPUT_PULLUP);
  randomSeed(analogRead(A0));
  Serial.begin(9600); // IS THIS NEEDED ????
  Wire.begin();
  RTC.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C

// To set the clock, uncomment one of the RTC.adjust() lines
//  RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // set to PC time
//  RTC.adjust(DateTime(2019,8,22,13,42,0)); // yyyy, mm, dd, hh, mm, ss
}

void loop() {
// RTC
  DateTime now = RTC.now();
  hour   = now.hour();
  minute = now.minute();
  second = now.second();

// clear oled  
  oled.clearDisplay();
  oled.fillRect(0,0,127,31,bg);

// clock ticks
  for(int z=0; z < 360;z= z + 30){
    angle = (float)z / 57.3;
    int x2=(16+(sin(angle)*15));
    int y2=(15-(cos(angle)*15));
    int x3=(16+(sin(angle)*(12)));
    int y3=(15-(cos(angle)*(12)));
    oled.drawLine(x2,y2,x3,y3,fg);
  }

// clock second
  angle=((float)second * 6 / 57.3); // degrees to radians  
  int x3=(16+(sin(angle)*(14)));
  int y3=(15-(cos(angle)*(14)));
  oled.drawLine(16,15,x3,y3,fg);

// clock minute
  angle=((float)minute * 6 / 57.3); // degrees to radians  
  x3=(16+(sin(angle)*(12)));
  y3=(15-(cos(angle)*(12)));
  oled.drawLine(16,15,x3,y3,fg);

// clock hour
  angle=((float)hour * 30 + (float)minute / 2) / 57.3; //degrees to radians  
  x3=(16+(sin(angle)*(10)));
  y3=(15-(cos(angle)*(10)));
  oled.drawLine(16,15,x3,y3,fg);

// time and messages
  if(!digitalRead(MSG1_PIN)) msgnr = 1;
  if(!digitalRead(MSG2_PIN)) msgnr = 2;
  if(!digitalRead(MSG3_PIN)) msgnr = 3;
  if(!digitalRead(MSG4_PIN)) msgnr = 4;
  if(!digitalRead(MSG5_PIN)) msgnr = 5;
  if(!digitalRead(MSG6_PIN)) msgnr = 6;

  if(msgnr != msgnr_old) {
    calc_msg_time();
    msgnr_old = msgnr;
  }
  print_msg_time();

  switch (msgnr) {
    case 1:
      oled.setCursor(72,2);  oled.print("Sprinter");    // max 10 characters
      oled.setCursor(40,12); oled.print("Gronignen");    // max 14 characters
      oled.setCursor(40,22); oled.print("via Assen"); // max 20 characters
    break;

    case 2:
      oled.setCursor(72,2);  oled.print("IC Direct");
      oled.setCursor(40,12); oled.print("Den Haag");
      oled.setCursor(40,22); oled.print("via Lelystad");
    break;

    case 3:
      oled.setCursor(72,2);  oled.print("Intercity");
      oled.setCursor(40,12); oled.print("Amsterdam CS");
      oled.setCursor(40,22); oled.print("via Lelystad");
    break;

      case 4:
      oled.setCursor(72,2);  oled.print("Sneltrein");
      oled.setCursor(40,12); oled.print("Maastricht");    
      oled.setCursor(40,22); oled.print("via Arnhem");
    break;

    case 5:
      oled.setCursor(72,2);  oled.print("Nightjet");
      oled.setCursor(40,12); oled.print("Zagreb");
      oled.setCursor(40,22); oled.print("via Munchen");
    break;

    case 6:
      oled.setCursor(72,2);  oled.print("IC Benelux");
      oled.setCursor(40,12); oled.print("Brussel");  
      oled.setCursor(40,22); oled.print("via Rotterdam");
    break;
  }
// refresh screen
  oled.display();
}`

I can't see a sketch

(Turning sketches upside-down is rarely necessary, and confuses the compiler)

Please post your current sketch.

From what I see you already have a digital clock, it is converted to analog for your display. Spend some time searching the internet, there is a lot out there. The best you will probably get here is a few guesses, you need to post the code and possibly a schematic.

Please don’t double post even across languages

Which thread do you want to keep open ?

#include <RTClib.h> // Real Time Clock library
RTC_DS1307 RTC;     // Creates a real time clock with the name RTC
#define MSG1_PIN 2
#define MSG2_PIN 3
#define MSG3_PIN 4
#define MSG4_PIN 5
#define MSG5_PIN 6
#define MSG6_PIN 7
#define TMIN     5 // departure time of next train, minimum of random time
#define TMAX    13 // departure time of next train, maximum of random time

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

// setup the OLED display]
Adafruit_SSD1306 oled(4);
byte bg = WHITE, fg = BLACK; // background- and foreground colors
byte hour, minute, second; 
byte msgnr, msgnr_old, msgflag, msghour, msgminute;
float angle;

// Define the RTC

void calc_msg_time() {
  msgminute = msgminute + random(TMIN, TMAX);
  if (msgminute > 59) {
    msghour = (msghour + 1) % 24;
    msgminute = msgminute - 60;
  }
}

void print_msg_time() {
  oled.setTextColor(fg);
  oled.setTextSize(1);
  oled.setCursor(40,2);
  if(msghour < 10) oled.print(" ");
  oled.print(msghour);
  oled.print(":");
  if(msgminute < 10) oled.print("0");
  oled.print(msgminute);
}

void setup() {
  pinMode(MSG1_PIN, INPUT_PULLUP);
  pinMode(MSG2_PIN, INPUT_PULLUP);
  pinMode(MSG3_PIN, INPUT_PULLUP);
  pinMode(MSG4_PIN, INPUT_PULLUP);
  pinMode(MSG5_PIN, INPUT_PULLUP);
  pinMode(MSG6_PIN, INPUT_PULLUP);
  randomSeed(analogRead(A0));
  Serial.begin(9600); // IS THIS NEEDED ????
  Wire.begin();
  RTC.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C

// To set the clock, uncomment one of the RTC.adjust() lines
//  RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // set to PC time
//  RTC.adjust(DateTime(2019,8,22,13,42,0)); // yyyy, mm, dd, hh, mm, ss
}

void loop() {
// RTC
  DateTime now = RTC.now();
  hour   = now.hour();
  minute = now.minute();
  second = now.second();

// clear oled  
  oled.clearDisplay();
  oled.fillRect(0,0,127,31,bg);

// clock ticks
  for(int z=0; z < 360;z= z + 30){
    angle = (float)z / 57.3;
    int x2=(16+(sin(angle)*15));
    int y2=(15-(cos(angle)*15));
    int x3=(16+(sin(angle)*(12)));
    int y3=(15-(cos(angle)*(12)));
    oled.drawLine(x2,y2,x3,y3,fg);
  }

// clock second
  angle=((float)second * 6 / 57.3); // degrees to radians  
  int x3=(16+(sin(angle)*(14)));
  int y3=(15-(cos(angle)*(14)));
  oled.drawLine(16,15,x3,y3,fg);

// clock minute
  angle=((float)minute * 6 / 57.3); // degrees to radians  
  x3=(16+(sin(angle)*(12)));
  y3=(15-(cos(angle)*(12)));
  oled.drawLine(16,15,x3,y3,fg);

// clock hour
  angle=((float)hour * 30 + (float)minute / 2) / 57.3; //degrees to radians  
  x3=(16+(sin(angle)*(10)));
  y3=(15-(cos(angle)*(10)));
  oled.drawLine(16,15,x3,y3,fg);

// time and messages
  if(!digitalRead(MSG1_PIN)) msgnr = 1;
  if(!digitalRead(MSG2_PIN)) msgnr = 2;
  if(!digitalRead(MSG3_PIN)) msgnr = 3;
  if(!digitalRead(MSG4_PIN)) msgnr = 4;
  if(!digitalRead(MSG5_PIN)) msgnr = 5;
  if(!digitalRead(MSG6_PIN)) msgnr = 6;

  if(msgnr != msgnr_old) {
    calc_msg_time();
    msgnr_old = msgnr;
  }
  print_msg_time();

  switch (msgnr) {
    case 1:
      oled.setCursor(72,2);  oled.print("Sprinter");    // max 10 characters
      oled.setCursor(40,12); oled.print("Gronignen");    // max 14 characters
      oled.setCursor(40,22); oled.print("via Assen"); // max 20 characters
    break;

    case 2:
      oled.setCursor(72,2);  oled.print("IC Direct");
      oled.setCursor(40,12); oled.print("Den Haag");
      oled.setCursor(40,22); oled.print("via Lelystad");
    break;

    case 3:
      oled.setCursor(72,2);  oled.print("Intercity");
      oled.setCursor(40,12); oled.print("Amsterdam CS");
      oled.setCursor(40,22); oled.print("via Lelystad");
    break;

      case 4:
      oled.setCursor(72,2);  oled.print("Sneltrein");
      oled.setCursor(40,12); oled.print("Maastricht");    
      oled.setCursor(40,22); oled.print("via Arnhem");
    break;

    case 5:
      oled.setCursor(72,2);  oled.print("Nightjet");
      oled.setCursor(40,12); oled.print("Zagreb");
      oled.setCursor(40,22); oled.print("via Munchen");
    break;

    case 6:
      oled.setCursor(72,2);  oled.print("IC Benelux");
      oled.setCursor(40,12); oled.print("Brussel");  
      oled.setCursor(40,22); oled.print("via Rotterdam");
    break;
  }
// refresh screen
  oled.display();
}

I see a lot of repeated code - that usually means you could factor your code.
The clock code has nothing at all to do with the destination board, and could (and should, IMO) be in a separate function.
It seems crazy to redraw the entire clock every cycle.

oh ok, so the code of the clock can basically get out? the intention is that messiges digitally changed, so that he shows the next messiges by himself instead of manually changing the pins

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