#define CLK 2
#define DIO 3
#define BEEP 4
#define WIRE1 5
#define WIRE2 6
#define WIRE3 7
#define WIRE4 8
#define WIRE5 9
bool def1 = 0;
bool def2 = 0;
bool def3 = 0;
bool def4 = 0;
bool def5 = 0;
bool trip1 = 0;
bool trip2 = 0;
bool trip3 = 0;
bool trip4 = 0;
bool trip5 = 0;
byte dig1 = 0;
byte dig2 = 0;
byte dig3 = 5;
byte dig4 = 9;
bool colon = 0;
int counter = 1000;
bool boom = 0;
bool defuse = 0;
#include <GyverTM1637.h>
GyverTM1637 disp (CLK, DIO);
#include <Beeper.h>
Beeper buzz(4);
#include <TimerMs.h>
TimerMs readwire(100, 1, 0);
TimerMs point(counter * 0.5, 1, 0);
TimerMs count(counter, 1, 0);
void setup() {
Serial.begin(115200);
pinMode(WIRE1, INPUT_PULLUP);
pinMode(WIRE2, INPUT_PULLUP);
pinMode(WIRE3, INPUT_PULLUP);
pinMode(WIRE4, INPUT_PULLUP);
pinMode(WIRE5, INPUT_PULLUP);
disp.clear();
disp.brightness(7);
disp.display(dig1, dig2, dig3, dig4);
}
void loop() {
while (boom) {
buzz.tick();
buzz.beepNote(NOTE_A4);
//tone(BEEP, 1000);
disp.twist(0, 0, 0, 0, 150);
if (count.tick()) disp.clear();
}
if (!buzz.tick()) {
wires();
}
if (point.tick()) {
colon = !colon;
disp.point(colon);
}
// Timer & Display
if (!boom && !defuse && count.tick()) {
buzz.beepNote(NOTE_A4, 1, 50);
if (dig4 == 0) {
dig4 = 9;
if (dig3 == 0) {
dig3 = 5;
if (dig2 != 0) {
dig2 -= 1;
} else {
count.setTime(2000);
boom = 1;
}
} else {
dig3 -= 1;
}
} else {
dig4 -= 1;
}
// Debug
Serial.print("Trips: ");
Serial.print(trip1);
Serial.print(" ");
Serial.print(trip2);
Serial.print(" ");
Serial.print(trip3);
Serial.print(" ");
Serial.print(trip4);
Serial.print(" ");
Serial.print(trip5);
Serial.println(" ");
Serial.print("Defused: ");
Serial.print(def1);
Serial.print(" ");
Serial.print(def2);
Serial.print(" ");
Serial.print(def3);
Serial.print(" ");
Serial.print(def4);
Serial.print(" ");
Serial.print(def5);
Serial.println(" ");
Serial.print("Counter: ");
Serial.println(counter);
disp.twist(dig1, dig2, dig3, dig4, 5);
}
if (defuse) {
disp.point(0);
disp.twist(1, 9, 6, 2, 100);
delay(2000);
disp.clear();
}
}
void wires() {
if (digitalRead(WIRE1) && !def1 && !trip1) {
if (!def2 && !def3 && def4 && !def5 && counter == 1000) {
def1 = 1;
} else {
trip1 = 1;
counter -= 150;
}
}
if (digitalRead(WIRE2) && !def2 && !trip2) {
if (def1 && def3 && def4 && !def5 && counter == 1000) {
def2 = 1;
} else {
trip2 = 1;
counter -= 150;
}
}
if (digitalRead(WIRE3) && !def3 && !trip3) {
if (def1 && !def2 && def4 && !def5 && counter == 1000) {
def3 = 1;
} else {
trip3 = 1;
counter -= 150;
}
}
if (digitalRead(WIRE4) && !def4 && !trip4) {
if (!def1 && !def2 && !def3 && !def5 && counter == 1000) {
def4 = 1;
} else {
trip4 = 1;
counter -= 150;
}
}
if (digitalRead(WIRE5) && !def5 && !trip5) {
if (def1 && def2 && def3 && def4 && counter == 1000) {
def5 = 1;
defuse = 1;
} else {
trip5 = 1;
counter -= 150;
}
}
// Reset
if (!digitalRead(WIRE1) && (def1 || trip1)) {
def1 = 0;
trip1 = 0;
if (counter != 1000) {
counter += 150;
}
}
if (!digitalRead(WIRE2) && (def2 || trip2)) {
def2 = 0;
trip2 = 0;
if (counter != 1000) {
counter += 150;
}
}
if (!digitalRead(WIRE3) && (def3 || trip3)) {
def3 = 0;
trip3 = 0;
if (counter != 1000) {
counter += 150;
}
}
if (!digitalRead(WIRE4) && (def4 || trip4)) {
def4 = 0;
trip4 = 0;
if (counter != 1000) {
counter += 150;
}
}
if (!digitalRead(WIRE5) && (def5 || trip5)) {
def5 = 0;
trip5 = 0;
if (counter != 1000) {
counter += 150;
}
}
count.setTime(counter);
point.setTime(counter * 0.5);
}