#include "SerialMP3Player.h"
// Switch and button inputs
const int MAIN_SWITCH = 3;
const int RED_SWITCH = 5;
const int YELLOW_SWITCH = 6;
const int GREEN_SWITCH = 7;
// MP3 Tracks
enum Tracks { BOOT_UP = 1, IDLE_LOOP, FLUSH, EPA_SHUTDOWN, POWER_OFF, TRAP_INSERT };
// Pin Definitions
#define TX 11
#define RX 10
SerialMP3Player mp3(RX, TX);
// LED and Ammeter Pins
const int LED = 12;
const int AMMETER = A3;
// Audio States
bool trackPlayed[7] = { false };
bool live = false;
bool shouldWarn = true;
bool shuttingDown = false;
bool poweredDown = true;
bool repeating_audio = false;
// Timing Variables
const unsigned long AUDIO_INTERVAL = 3100;
const unsigned long ALERT_INTERVAL = 1000;
unsigned long prevMillis = 0;
unsigned long previousTime = 0;
void setup() {
Serial.begin(9600);
mp3.begin(9600);
delay(500);
mp3.sendCommand(CMD_SEL_DEV, 0, 2); // Select SD Card
delay(500);
pinMode(LED, OUTPUT);
pinMode(AMMETER, OUTPUT);
pinMode(MAIN_SWITCH, INPUT_PULLUP);
pinMode(RED_SWITCH, INPUT_PULLUP);
pinMode(YELLOW_SWITCH, INPUT_PULLUP);
pinMode(GREEN_SWITCH, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP); // Trap sensor
pinMode(8, INPUT_PULLUP); // Door switch
pinMode(9, INPUT_PULLUP); // Main handle
pinMode(A0, OUTPUT); // GREEN light
pinMode(A1, OUTPUT); // YELLOW light
pinMode(A2, OUTPUT); // RED light
}
void loop() {
unsigned long currentMillis = millis();
Serial.println("Checking switches..."); // Serial Debug Output
// Emergency Shutdown Trigger
if (digitalRead(GREEN_SWITCH) == LOW && !trackPlayed[EPA_SHUTDOWN]) {
mp3.play(EPA_SHUTDOWN);
trackPlayed[EPA_SHUTDOWN] = true;
Serial.println("EPA Shutdown Triggered");
}
// Main Switch Handling
if (digitalRead(MAIN_SWITCH) == LOW) {
Serial.println("Main switch pressed");
if (poweredDown) {
mp3.play(BOOT_UP);
delay(1800);
digitalWrite(A0, HIGH); // Green Switch LED
poweredDown = false;
}
digitalWrite(AMMETER, HIGH); // Ammeter On
shuttingDown = true;
// Door Handling
digitalWrite(LED, digitalRead(8) == LOW ? HIGH : LOW);
digitalWrite(A0, digitalRead(RED_SWITCH) == LOW ? LOW : HIGH);
digitalWrite(A1, digitalRead(YELLOW_SWITCH) == LOW ? HIGH : LOW);
digitalWrite(A2, digitalRead(YELLOW_SWITCH) == LOW ? LOW : HIGH);
// Handle Throw
if (digitalRead(9) == LOW && !trackPlayed[FLUSH]) {
mp3.play(FLUSH);
trackPlayed[FLUSH] = true;
Serial.println("Flush Activated");
digitalWrite(A1, LOW); // Yellow Switch LED
digitalWrite(A0, HIGH); // Green Switch LED
digitalWrite(LED, LOW); // Red Above
digitalWrite(AMMETER, LOW);
delay(600);
digitalWrite(AMMETER, HIGH);
}
// Trap Inserted
if (digitalRead(4) == LOW && !trackPlayed[TRAP_INSERT]) {
mp3.play(TRAP_INSERT);
trackPlayed[TRAP_INSERT] = true;
Serial.println("Trap Inserted");
digitalWrite(LED, HIGH);
digitalWrite(A0, HIGH); // Green Switch LED
}
else { // Trap Removed
Serial.println("Trap Removed");
resetTracks();
idlestate();
}
}
else if (shuttingDown) {
mp3.play(POWER_OFF);
digitalWrite(A0, LOW);
delay(2000);
digitalWrite(AMMETER, LOW);
delay(8000);
digitalWrite(A0, LOW);
shuttingDown = false;
poweredDown = true;
Serial.println("Shutdown Complete");
}
}
void idlestate() {
unsigned long currentMillis = millis();
if ((currentMillis - prevMillis) >= AUDIO_INTERVAL) {
prevMillis = currentMillis;
if (!repeating_audio) {
mp3.play(IDLE_LOOP);
repeating_audio = true;
Serial.println("Idle Loop Playing");
} else {
repeating_audio = false;
}
}
}
void resetTracks() {
for (int i = 1; i <= 6; i++) trackPlayed[i] = false;
}
void ALERT() {
unsigned long currentMillis = millis();
if (currentMillis - previousTime >= ALERT_INTERVAL) {
digitalWrite(LED, !digitalRead(LED));
previousTime = currentMillis;
}
}