#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define RED_LED 0
#define YELLOW_LED 2
#define DOUBLE_YELLOW_LED 4
#define GREEN_LED 16
int red_signal = 0;
int yellow_signal = 2;
int double_yellow_signal = 4;
int green_signal = 16;
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
boolean stop_train() {
// Receive command from surver
boolean stop_train = true;
return stop_train;
}
int signal() {
// Take signal data from surver
int signal = 2;
return signal;
}
long speed() {
// Take train speed from GPS
long speed = 90;
return speed;
}
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(DOUBLE_YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
Serial.begin(9600);
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
}
void loop() {
int current_signal = signal();
if (current_signal == 1) {
delay(2000);
long allowed_speed_limit = 120;
if (speed() > allowed_speed_limit) {
// Send info to nearby station
Serial.begin(115200);
Serial.println("Train is overspeeding");
// Receive command from surver
if (stop_train() == true) {
// Give command to reduce train speed
Serial.begin(115200);
Serial.println("Command to reduce train speed");
digitalWrite(YELLOW_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 0);
oled.println("VOILATED Yellow signal");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20); // set position to display
oled.println("Train is overspeeding"); // set text
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("reduce train speed TO 120km/h");
oled.display(); // display on OLED
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0,20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Green");
oled.display(); // display on OLED
}
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Green");
oled.display(); // display on OLED
}
}
else if (current_signal == 2) {
delay(2000);
int allowed_speed_limit = 80;
if (speed() > allowed_speed_limit) {
// Send info to nearby station
Serial.begin(115200);
Serial.println("Train is overspeeding");
// Receive command from surver
if (stop_train() == true) {
// Give command to reduce train speed
Serial.begin(115200);
Serial.println("Command to reduce train speed");
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(DOUBLE_YELLOW_LED, HIGH);
// wait two seconds for initializing
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 0);
oled.println(" Yellow Signal");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20); // set position to display
oled.println("Train is overspeeding"); // set text
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("reduce train speed TO 80km/h");
oled.display(); // display on OLED
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Yellow");
oled.display(); // display on OLED
}
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Yellow");
oled.display(); // display on OLED
}
}
else if (current_signal == 4) {
int allowed_speed_limit = 40;
if (speed() > allowed_speed_limit) {
// Send info to nearby station
Serial.begin(115200);
Serial.println("Train is overspeeding");
// Receive command from surver
if (stop_train() == true) {
// Give command to apply brake
Serial.begin(115200);
Serial.println("Command to apply brake");
digitalWrite(RED_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 0);
oled.println("Vilated double yellow Signal");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(40, 20); // set position to display
oled.println("Danger alert"); // set text
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("reduce train speed TO 40km/h");
oled.display(); // display on OLED
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Double yellow");
oled.display(); // display on OLED
}
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is Double Yellow");
oled.display(); // display on OLED
}
}
else if (current_signal == 3) {
int allowed_speed_limit = 0;
if (speed() > allowed_speed_limit) {
// Send info to nearby station
Serial.begin(115200);
Serial.println("Train is overspeeding");
// Receive command from surver
if (stop_train() == true) {
// Give command to apply brake
Serial.begin(115200);
Serial.println("Command to apply brake");
digitalWrite(RED_LED, HIGH);
// wait two seconds for initializing
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 0);
oled.println("Voilated Red Signal");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20); // set position to display
oled.println("Exceed the STOP Signal"); // set text
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("Stop the train");
oled.display(); // display on OLED
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is red");
oled.display(); // display on OLED
}
} else {
// Everything is fine
Serial.begin(115200);
Serial.println("Everything is fine");
digitalWrite(GREEN_LED, HIGH);
oled.clearDisplay(); // clear display
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 20);
oled.println("Have a safe journey");
oled.setTextSize(1); // set text size
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 40);
oled.println("signal is red");
oled.display(); // display on OLED
}
}
}