bool messageSent = false;
int r1 = 2;
int a1 = 3;
int g1 = 4;
int r2 = 5;
int a2 = 6;
int g2 = 7;
int r3 = 8;
int a3 = 9;
int g3 = 10;
int r4 = 11;
int a4 = 13;
int g4 = 12;
const int r5 = A5;
const int a5 = A4;
const int g5 = A3;
unsigned long previousMillis = 0;
const long interval = 1000;
bool isBlinking = true;
const int btnflashing = A0; int flash_btnstate = 0;
#define FLASHING_ON_COMMAND "/flash on"
#define FLASHING_OFF_COMMAND "/flash off"
#define HELP_COMMAND "/help"
#define SETLANE_1_COMMAND "/setlanenumber 1"
#define SETLANE_2_COMMAND "/setlanenumber 2"
#define SETLANE_3_COMMAND "/setlanenumber 3"
#define SETLANE_4_COMMAND "/setlanenumber 4"
#define SETLANE_5_COMMAND "/setlanenumber 5"
#define G5_MODEON_COMMAND "/g5 operate"
#define G5_MODEOFF_COMMAND "/g5 idle"
#define SETDURATION_COMMAND "/setduration"
//data on this sector is just simulation on EEPROM Data
int EEPROM_MODE = 1;
int EEPROM_LANE_NUMBER = 5;
int EEPROM_A = 2;
int EEPROM_R1 = 15;
int EEPROM_G1 = 10;
int EEPROM_G2 = 5;
int EEPROM_G3 = 10;
int EEPROM_G4 = 5;
int EEPROM_G5 = 3;
int EEPROM_G5_MODE = 0;
//======================================================
unsigned long AD = EEPROM_A;
unsigned long R1D = EEPROM_R1;
unsigned long G1D = EEPROM_G1;
unsigned long G2D = EEPROM_G2;
unsigned long G3D = EEPROM_G3;
unsigned long G4D = EEPROM_G4;
unsigned long G5D = EEPROM_G5;
void setup() {
Serial.begin(9600);
Serial.println("Swarco TL500 - SERIAL ONLY TRAFFIC CONTROLLER SYSTEM");
Serial.println("Use [/help] to know available commands!");
Serial.println("NOTE! When you want to program, please set to flashing mode first to prevent delay!");
pinMode(r1, OUTPUT); pinMode(a1, OUTPUT); pinMode(g1, OUTPUT);
pinMode(r2, OUTPUT); pinMode(a2, OUTPUT); pinMode(g2, OUTPUT);
pinMode(r3, OUTPUT); pinMode(a3, OUTPUT); pinMode(g3, OUTPUT);
pinMode(r4, OUTPUT); pinMode(a4, OUTPUT); pinMode(g4, OUTPUT);
pinMode(r5, OUTPUT); pinMode(a5, OUTPUT); pinMode(g5, OUTPUT);
pinMode(btnflashing, INPUT_PULLUP);
}
void loop() {
flash_btnstate = digitalRead(btnflashing);
if (flash_btnstate == HIGH){
EEPROM_MODE = 0; messageSent = false;
} else {
if (EEPROM_LANE_NUMBER == 0){
EEPROM_MODE = 0;
if (!messageSent) {
Serial.println("[EEPROM] Set to flashing mode due to new savefiles! please program first.");
messageSent = true;}
} else {
EEPROM_MODE = 1;
}
}
if (Serial.available() > 0) {
String command = Serial.readStringUntil('\n'); // Read the command
// Trim any leading or trailing whitespace characters
command.trim();
if (command.equals(FLASHING_ON_COMMAND)) {
Serial.println("Set state to flashing mode.");
EEPROM_MODE = 0; offallleds(6);
} else if (command.equals(FLASHING_OFF_COMMAND)) {
Serial.println("Set state to normal operation.");
EEPROM_MODE = 1;
} else if (command.equals(HELP_COMMAND)) {
Serial.println("Available Commands:");
Serial.println("- [/flash <on|off>] Set operation state to flashing/normal temporarily (not saved to EEPROM).");
Serial.println("- [/setlanenumber <1 ~ 5>] Set number of lane used. the deactivated one will be turned off but still flashing on flashing mode.");
Serial.println("- [/setduration <R1, A, G1, G2, G3, G4 and G5> <duration in second>] Set duration for each lane lamp signal.");
} else if (command.equals(SETLANE_1_COMMAND)) {
Serial.println("Set Lane used to 1."); EEPROM_LANE_NUMBER = 1;
} else if (command.equals(SETLANE_2_COMMAND)) {
Serial.println("Set Lane used to 2."); EEPROM_LANE_NUMBER = 2;
} else if (command.equals(SETLANE_3_COMMAND)) {
Serial.println("Set Lane used to 3."); EEPROM_LANE_NUMBER = 3;
} else if (command.equals(SETLANE_4_COMMAND)) {
Serial.println("Set Lane used to 4."); EEPROM_LANE_NUMBER = 4;
} else if (command.equals(SETLANE_5_COMMAND)) {
Serial.println("Set Lane used to 5."); EEPROM_LANE_NUMBER = 5;
} else if (command.startsWith(SETDURATION_COMMAND)) {
String inputName = command.substring(strlen(SETDURATION_COMMAND) + 1, command.indexOf(' ', strlen(SETDURATION_COMMAND) + 1));
int inputValue = command.substring(command.lastIndexOf(' ') + 1).toInt();
bool ssS = false;
if (inputName.equals("R1")){EEPROM_R1 = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("A")){EEPROM_A = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("G1")){EEPROM_G1 = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("G2")){EEPROM_G2 = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("G3")){EEPROM_G3 = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("G4")){EEPROM_G4 = inputValue; reloadeeprom(); ssS = true;} else
if (inputName.equals("G5")){EEPROM_G5 = inputValue; reloadeeprom(); ssS = true;} else
{Serial.println("Wrong lane parameter! Should be: R1, A, G1, G2, G3, G4 and G5!"); ssS = false;}
// Print the received input values
if (ssS == true){
Serial.print("Set duration for lane ");
Serial.print(inputName);
Serial.print(" to ");
Serial.print(inputValue);
Serial.println("!");
}
} else if (command.equals(G5_MODEON_COMMAND)) {
EEPROM_G5_MODE = 1;
Serial.println("G5 Mode set to Operate!");
} else if (command.equals(G5_MODEOFF_COMMAND)) {
EEPROM_G5_MODE = 0;
Serial.println("G5 Mode set to Idle!");
} else {
Serial.println("Wrong command. Please type [/help] for more informations!");
}
}
if (EEPROM_MODE == 0){
offallleds(6);
digitalWrite(a1, HIGH); digitalWrite(a2, HIGH); digitalWrite(a3, HIGH); digitalWrite(a4, HIGH);
digitalWrite(a5, HIGH);
delay(750);
digitalWrite(a1, LOW); digitalWrite(a2, LOW); digitalWrite(a3, LOW); digitalWrite(a4, LOW);
digitalWrite(a5, LOW);
delay(750);
} else {
offallleds(6);
if (EEPROM_LANE_NUMBER >= 2){digitalWrite(r2, HIGH);}
if (EEPROM_LANE_NUMBER >= 3){digitalWrite(r3, HIGH);}
if (EEPROM_LANE_NUMBER >= 4){digitalWrite(r4, HIGH);}
if (EEPROM_LANE_NUMBER >= 5){digitalWrite(r5, HIGH);}
if (EEPROM_LANE_NUMBER >= 5 && EEPROM_G5_MODE == 0){
blinkLed(true);
} else {
blinkLed(false);
}
if (EEPROM_LANE_NUMBER >= 1){
digitalWrite(r1, HIGH); digitalWrite(a1, LOW); digitalWrite(g1, LOW);
if (EEPROM_G5_MODE == 1){digitalWrite(r5, HIGH); digitalWrite(a5, LOW); digitalWrite(g5, LOW);}else{digitalWrite(r5, LOW); digitalWrite(a5, HIGH); digitalWrite(g5, LOW);}
if (EEPROM_LANE_NUMBER >= 2){delay(2000);}else{delay(R1D * 1000);}
digitalWrite(r1, HIGH); digitalWrite(a1, HIGH); digitalWrite(g1, LOW);
if (EEPROM_G5_MODE == 1){digitalWrite(r5, HIGH); digitalWrite(a5, HIGH); digitalWrite(g5, LOW);}
delay(2000);
digitalWrite(r1, LOW); digitalWrite(a1, LOW); digitalWrite(g1, HIGH);
if (EEPROM_G5_MODE == 1){digitalWrite(r5, LOW); digitalWrite(a5, LOW); digitalWrite(g5, HIGH); delay(G5D * 1000);}
if (EEPROM_G5_MODE == 1){digitalWrite(r5, LOW); digitalWrite(a5, HIGH); digitalWrite(g5, LOW); delay(AD * 1000);
digitalWrite(r5, HIGH); digitalWrite(a5, LOW); digitalWrite(g5, LOW);}
if (EEPROM_G5_MODE == 0){delay(G1D * 1000);}else{delay((G1D - (G5D + AD)) * 1000);}
digitalWrite(r1, LOW); digitalWrite(a1, HIGH); digitalWrite(g1, LOW);
delay(AD * 1000);
}
if (EEPROM_LANE_NUMBER >= 2){
digitalWrite(r1, HIGH); digitalWrite(a1, LOW); digitalWrite(g1, LOW);
delay(2000);
digitalWrite(r2, HIGH); digitalWrite(a2, HIGH); digitalWrite(g2, LOW);
delay(2000);
digitalWrite(r2, LOW); digitalWrite(a2, LOW); digitalWrite(g2, HIGH);
delay(G2D * 1000);
digitalWrite(r2, LOW); digitalWrite(a2, HIGH); digitalWrite(g2, LOW);
delay(AD * 1000);
}
if (EEPROM_LANE_NUMBER >= 3){
digitalWrite(r2, HIGH); digitalWrite(a2, LOW); digitalWrite(g2, LOW);
delay(2000);
digitalWrite(r3, HIGH); digitalWrite(a3, HIGH); digitalWrite(g3, LOW);
delay(2000);
digitalWrite(r3, LOW); digitalWrite(a3, LOW); digitalWrite(g3, HIGH);
delay(G3D * 1000);
digitalWrite(r3, LOW); digitalWrite(a3, HIGH); digitalWrite(g3, LOW);
delay(AD * 1000);
}
if (EEPROM_LANE_NUMBER >= 4){
digitalWrite(r3, HIGH); digitalWrite(a3, LOW); digitalWrite(g3, LOW);
delay(2000);
digitalWrite(r4, HIGH); digitalWrite(a4, HIGH); digitalWrite(g4, LOW);
delay(2000);
digitalWrite(r4, LOW); digitalWrite(a4, LOW); digitalWrite(g4, HIGH);
delay(G4D * 1000);
digitalWrite(r4, LOW); digitalWrite(a4, HIGH); digitalWrite(g4, LOW);
delay(AD * 1000);
}
}
}
void offallleds(int lineS){
if (lineS == 1){
digitalWrite(r1, LOW); digitalWrite(a1, LOW); digitalWrite(g1, LOW);
} else if (lineS == 2){
digitalWrite(r2, LOW); digitalWrite(a2, LOW); digitalWrite(g2, LOW);
} else if (lineS == 3){
digitalWrite(r3, LOW); digitalWrite(a3, LOW); digitalWrite(g3, LOW);
} else if (lineS == 4){
digitalWrite(r4, LOW); digitalWrite(a4, LOW); digitalWrite(g4, LOW);
} else if (lineS == 5){
digitalWrite(r5, LOW); digitalWrite(a5, LOW); digitalWrite(g5, LOW);
} else if (lineS == 6){
digitalWrite(r1, LOW); digitalWrite(a1, LOW); digitalWrite(g1, LOW);
digitalWrite(r2, LOW); digitalWrite(a2, LOW); digitalWrite(g2, LOW);
digitalWrite(r3, LOW); digitalWrite(a3, LOW); digitalWrite(g3, LOW);
digitalWrite(r4, LOW); digitalWrite(a4, LOW); digitalWrite(g4, LOW);
digitalWrite(r5, LOW); digitalWrite(a5, LOW); digitalWrite(g5, LOW);
}
}
void reloadeeprom(){
AD = EEPROM_A;
R1D = EEPROM_R1;
G1D = EEPROM_G1;
G2D = EEPROM_G2;
G3D = EEPROM_G3;
G4D = EEPROM_G4;
G5D = EEPROM_G5;
}
void blinkLed(bool shouldBlink) {
unsigned long currentMillis = millis(); // Get the current time
if (shouldBlink && currentMillis - previousMillis >= interval) {
digitalWrite(a5, !digitalRead(a5));
previousMillis = currentMillis; // Save the last time LED was toggled
} else if (!shouldBlink) {
digitalWrite(a5, LOW); // Turn off LED if blinking is stopped
previousMillis = currentMillis; // Reset previousMillis
}
}