/*
# ------------------******-------- #
# Control Ship Control System #
# -------------------------------- #
Ver: 2022.11.26
Wiring:
Pin 2 - - - - - Output sea signal pin - active LOW
Pin 3 - - - - - Output dock signal pin - active LOW
Pin 4 - - - - - Output Sig in. Music relay - active HIGH
Pin 5 - - - - - Input sea limt switch - active HIGH
Pin 6 - - - - - Input dock limt switch - active HIGH
Pin 7 - - - - - Input ON / OFF switch - ON LOW
Pin 8 - - - - - Output Sig in. Led Strip - active HIGH
Pin 12- - - - - Output ready signal pin - active HIGH
https://www.arduino.cc/reference/en/
# -------------------------- #
# Design by Ephraim Herman #
# -------------------------- #
*/
const int TO_SEA_SIGNAL_PIN = 2; // Connected to Motor Arduino pin 5
const int TO_DOCK_SIGNAL_PIN = 3; // Connected to Motor Arduino pin 6
const int MUSIC_RELAY = 4; // Connected to Sig. in of Music Relay
const int SEA_LIMIT_SWITCH = 5; // Connected to sea limit switch
const int DOCK_LIMIT_SWITCH = 6; // Connected to dock Limit switch
const int ON_OFF_SWITCH = 7; // Connected to On / Off switch
const int LIGHT_RELAY = 8; // Connected to Sig. in of Light Relay
const int READY_FOR_ACTION_SIGNAL_PIN = 12; // Connected to Main Arduino 12 pin
const boolean TOWARDS_THE_DOCK = LOW;
const boolean TOWARDS_THE_SEA = HIGH;
const boolean OFF = HIGH;
const boolean ON = LOW;
const unsigned long DOCK_WAITING_TIME = 20000; // Set time to 20 s'
const unsigned long SEA_WAITING_TIME = 60000; // Set time to 60 s'
const unsigned long START_WAITING_TIME = 10000; // Set time to 10 s'
boolean ship_dir;
boolean last_switch_stat = OFF;
boolean current_switch_stat = OFF;
boolean playMusic = false;
unsigned long signal_reading_waiting_time = 0;
unsigned long music_playing_waiting_time = 0;
void move_ship_to_start_pos() {
signal_reading_waiting_time = 0;
playMusic = false;
Serial.println(F("Stop motor from running to the dock."));
digitalWrite(TO_DOCK_SIGNAL_PIN, HIGH);
Serial.println(F("Light OFF."));
digitalWrite(LIGHT_RELAY, LOW);
Serial.println(F("Stop music."));
digitalWrite(MUSIC_RELAY, LOW);
if (!digitalRead(SEA_LIMIT_SWITCH)) {
Serial.println(F("Run a ship towards the sea."));
digitalWrite(TO_SEA_SIGNAL_PIN, LOW);
}
while (!digitalRead(SEA_LIMIT_SWITCH)) {
// Wait until the limit switch is activated
}
Serial.println(F("Stop the ship at sea."));
digitalWrite(TO_SEA_SIGNAL_PIN, HIGH);
ship_dir = TOWARDS_THE_DOCK;
}
void send_motor_comand(uint8_t anyDir, uint8_t anyCommand, unsigned long waitingTime) {
digitalWrite(anyDir, anyCommand);
signal_reading_waiting_time = millis() + waitingTime;
}
void setup() {
digitalWrite(READY_FOR_ACTION_SIGNAL_PIN, LOW);
pinMode(READY_FOR_ACTION_SIGNAL_PIN, OUTPUT);
Serial.begin(9600);
digitalWrite(TO_SEA_SIGNAL_PIN, HIGH);
digitalWrite(TO_DOCK_SIGNAL_PIN, HIGH);
digitalWrite(MUSIC_RELAY, LOW);
digitalWrite(LIGHT_RELAY, LOW);
digitalWrite(LED_BUILTIN, LOW);
pinMode(TO_SEA_SIGNAL_PIN, OUTPUT);
pinMode(TO_DOCK_SIGNAL_PIN, OUTPUT);
pinMode(MUSIC_RELAY, OUTPUT);
pinMode(LIGHT_RELAY, OUTPUT);
pinMode(SEA_LIMIT_SWITCH, INPUT);
pinMode(DOCK_LIMIT_SWITCH, INPUT);
pinMode(ON_OFF_SWITCH, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(READY_FOR_ACTION_SIGNAL_PIN, HIGH);
delay(1000);
Serial.println(F("Setting the behavior of the pins as input or output has been completed successfully."));
move_ship_to_start_pos();
}
void loop() {
// read_switch_status();
if (last_switch_stat != digitalRead(ON_OFF_SWITCH)) {
delay(40);
current_switch_stat = digitalRead(ON_OFF_SWITCH);
}
if (last_switch_stat != current_switch_stat) {
Serial.println(F("The switch state has changed."));
if (current_switch_stat == OFF) {
Serial.println(F("Switch in OFF position."));
move_ship_to_start_pos();
digitalWrite(LED_BUILTIN, LOW);
} else {
Serial.println(F("Switch in ON position."));
digitalWrite(LED_BUILTIN, HIGH);
}
}
last_switch_stat = current_switch_stat;
if (digitalRead(SEA_LIMIT_SWITCH) == HIGH && digitalRead(DOCK_LIMIT_SWITCH) == HIGH) {
Serial.println(F("A limit switches signaling ERROR was found!!!"));
digitalWrite(TO_SEA_SIGNAL_PIN, HIGH);
digitalWrite(TO_DOCK_SIGNAL_PIN, HIGH);
digitalWrite(MUSIC_RELAY, LOW);
current_switch_stat = OFF;
while (digitalRead(SEA_LIMIT_SWITCH) == HIGH && digitalRead(DOCK_LIMIT_SWITCH) == HIGH) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
digitalWrite(LIGHT_RELAY, !digitalRead(LIGHT_RELAY));
delay(500);
Serial.println(F("ERROR"));
}
digitalWrite(LIGHT_RELAY, LOW);
digitalWrite(LED_BUILTIN, LOW);
Serial.println(F("The system has stopped waiting for a power switch state change."));
} else {
if (signal_reading_waiting_time < millis()) {
if (current_switch_stat == ON) {
if (ship_dir == TOWARDS_THE_DOCK) {
if (digitalRead(SEA_LIMIT_SWITCH) == HIGH) {
// move_ship_to_dock();
// digitalWrite(TO_DOCK_SIGNAL_PIN, LOW);
// signal_reading_waiting_time = millis() + START_WAITING_TIME;
Serial.println(F("Run a ship towards the dock."));
send_motor_comand(TO_DOCK_SIGNAL_PIN, LOW, START_WAITING_TIME);
playMusic = true;
music_playing_waiting_time = millis() + START_WAITING_TIME;
Serial.println(F("Light ON."));
digitalWrite(LIGHT_RELAY, HIGH);
}
if (digitalRead(DOCK_LIMIT_SWITCH) == HIGH) {
// stop_ship_in_dock();
// digitalWrite(TO_DOCK_SIGNAL_PIN, HIGH);
// signal_reading_waiting_time = millis() + DOCK_WAITING_TIME;
Serial.println(F("Stop the ship at dock."));
send_motor_comand(TO_DOCK_SIGNAL_PIN, HIGH, DOCK_WAITING_TIME);
ship_dir = TOWARDS_THE_SEA;
}
} else if (ship_dir == TOWARDS_THE_SEA) {
if (digitalRead(DOCK_LIMIT_SWITCH) == HIGH) {
// move_ship_to_sea();
// digitalWrite(TO_SEA_SIGNAL_PIN, LOW);
// signal_reading_waiting_time = millis() + START_WAITING_TIME;
Serial.println(F("Run a ship towards the sea."));
send_motor_comand(TO_SEA_SIGNAL_PIN, LOW, START_WAITING_TIME);
}
if (digitalRead(SEA_LIMIT_SWITCH) == HIGH) {
// stop_ship_in_sea();
// digitalWrite(TO_SEA_SIGNAL_PIN, HIGH);
// signal_reading_waiting_time = millis() + SEA_WAITING_TIME;
Serial.println(F("Stop the ship at sea."));
send_motor_comand(TO_SEA_SIGNAL_PIN, HIGH, SEA_WAITING_TIME);
ship_dir = TOWARDS_THE_DOCK;
Serial.println(F("Stop music."));
digitalWrite(MUSIC_RELAY, LOW);
}
}
}
if (music_playing_waiting_time < millis()) {
if (playMusic) {
Serial.println(F("Start music."));
digitalWrite(MUSIC_RELAY, HIGH);
playMusic = false;
}
}
}
}
}