#include <TM1637Display.h>
#define clk 8
#define dio 9
const int buzzer = 2;
const int LEDWhite = A5;
const int LEDRed = A4;
const int LEDGreen = A3;
const int LEDBlue = A2;
const int LEDYellow = A1;
const int Button = 10;
const int WireWhite = 7;
const int WireRed = 6;
const int WireGreen = 5;
const int WireBlue = 4;
const int WireYellow = 3;
const int KEY_PRESSED = HIGH;
const unsigned long KEY_DURATION = 3000;
int secTime = 1000;
int wireToCut = 3;
int life = 2;
int startTime = 60;
TM1637Display disp =TM1637Display(clk,dio);
void setup()
{
disp.clear();
disp.setBrightness(10);
pinMode(buzzer, OUTPUT);
pinMode(LEDWhite, OUTPUT);
pinMode(LEDRed, OUTPUT);
pinMode(LEDGreen, OUTPUT);
pinMode(LEDBlue, OUTPUT);
pinMode(LEDYellow, OUTPUT);
pinMode(WireWhite, INPUT_PULLUP);
pinMode(WireRed, INPUT_PULLUP);
pinMode(WireGreen, INPUT_PULLUP);
pinMode(WireBlue, INPUT_PULLUP);
pinMode(WireYellow, INPUT_PULLUP);
}
void Beeper(int tickCountPerSec)
{
const int beepLength = 30;
if (tickCountPerSec > 8)
{
tickCountPerSec = 8;
}
int speed = secTime/tickCountPerSec;
for(int i = 0; i < tickCountPerSec; i++)
{
tone(buzzer, 3000);
delay(beepLength);
noTone(buzzer);
delay(speed - beepLength);
}
delay(secTime%tickCountPerSec);
}
void ToDisplay(int time)
{
int minute = time/60;
int secound = time%60;
int display = minute*100 + secound;
if(secound%2)
{
disp.showNumberDecEx(display, SEG_G, true);
}
else
{
disp.showNumberDecEx(display, 0, true);
}
}
int activeLed = -1;
int whiteOriginal = LOW;
int redOriginal = LOW;
int greenOriginal = LOW;
int blueOriginal = LOW;
int yellowOriginal = LOW;
void SetLife(int prevActive)
{
if(activeLed == prevActive)
{
wireToCut--;
}
else
{
secTime = secTime/2;
life--;
}
}
void WireControl()
{
if(whiteOriginal != digitalRead(WireWhite))
{
SetLife(0);
whiteOriginal = digitalRead(WireWhite);
}
if(redOriginal != digitalRead(WireRed))
{
SetLife(1);
redOriginal = digitalRead(WireRed);
}
if(greenOriginal != digitalRead(WireGreen))
{
SetLife(2);
greenOriginal = digitalRead(WireGreen);
}
if(blueOriginal != digitalRead(WireBlue))
{
SetLife(3);
blueOriginal = digitalRead(WireBlue);
}
if(yellowOriginal != digitalRead(WireYellow))
{
SetLife(4);
yellowOriginal = digitalRead(WireYellow);
}
}
void RandomLed()
{
digitalWrite(LEDWhite, LOW);
digitalWrite(LEDRed, LOW);
digitalWrite(LEDGreen, LOW);
digitalWrite(LEDBlue, LOW);
digitalWrite(LEDYellow, LOW);
bool goodLed = false;
int selectedWire;
while(!goodLed)
{
selectedWire = random(0, 5);
switch (selectedWire) {
case 0:
if(digitalRead(WireWhite) == LOW)
{
digitalWrite(LEDWhite, HIGH);
goodLed = true;
}
break;
case 1:
if(digitalRead(WireRed) == LOW)
{
digitalWrite(LEDRed, HIGH);
goodLed = true;
}
break;
case 2:
if(digitalRead(WireGreen) == LOW)
{
digitalWrite(LEDGreen, HIGH);
goodLed = true;
}
break;
case 3:
if(digitalRead(WireBlue) == LOW)
{
digitalWrite(LEDBlue, HIGH);
goodLed = true;
}
break;
case 4:
if(digitalRead(WireYellow) == LOW)
{
digitalWrite(LEDYellow, HIGH);
goodLed = true;
}
break;
default:
break;
}
}
activeLed = selectedWire;
}
void SetBomb()
{
for(int timer = startTime; timer >= 0; timer--)
{
if(timer%2)
{
RandomLed();
}
ToDisplay(timer);
if(timer != 0)
{
Beeper(startTime/timer);
}
WireControl();
if(wireToCut == 0 || life == 0)
{
timer = 0;
}
}
if(wireToCut != 0)
{
disp.showNumberDecEx(0, SEG_G, true);
tone(buzzer,3000);
}
}
void SetTime()
{
ToDisplay(startTime);
int buttonState = 0;
unsigned long buttonPressTime = 0;
unsigned long buttonPressReleaseTime = 0;
bool buttonDown = false;
bool finished = false;
while(!finished)
{
// read the pushbutton input pin:
while (buttonDown == false)
{
while(true)
{
delay(50);
if(digitalRead(Button) == HIGH)
{
disp.showNumberDecEx(1);
}
else
{
disp.showNumberDecEx(0);
}
}
buttonState = digitalRead(Button);
if (buttonState == KEY_PRESSED) {
// The button just got pushed
buttonPressTime = millis();
buttonDown = true;
delay(50);
}
}
while (buttonDown == true)
{
buttonState = digitalRead(Button);
if (buttonState != KEY_PRESSED) {
// The button just got released
buttonPressReleaseTime = millis();
buttonDown = false;
delay(50);
}
}
if ( buttonPressReleaseTime - buttonPressTime >= KEY_DURATION) {
finished = true;
}
else
{
startTime+= 60;
ToDisplay(startTime);
}
}
}
void loop()
{
SetTime();
SetBomb();
while(true){}
}