#include <TM1637.h>
#define btnB 7
#define btnY 5
#define btnG 6
#define ledB 10
#define ledY 8
#define ledG 9
#define buzz 11
#define pot A0
#define clk 4
#define dio 3
#define maxLedOnTime 1000
#define minLedOnTime 200
#define nOfLedAndBtn 3
TM1637 tm(clk, dio);
int counter = 0;
int ledOnTime = maxLedOnTime;
int ledArray[nOfLedAndBtn] = {ledY, ledG, ledB};
int btnArray[nOfLedAndBtn] = {btnY, btnG, btnB};
void setup(){
Serial.begin(115200);
pinMode(btnB, INPUT);
pinMode(btnY, INPUT);
pinMode(btnG, INPUT);
pinMode(ledB, OUTPUT);
pinMode(ledY, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(buzz, OUTPUT);
tm.init();
tm.set(BRIGHT_TYPICAL);
}
void loop(){
int randomLed = random(0,nOfLedAndBtn);
if(manageLed(ledArray[randomLed])){
counter ++;
showPoint(counter);
} else {
counter = 0;
showPoint(counter);
}
ledOnTime = map(analogRead(pot), 0, 1023, minLedOnTime, maxLedOnTime);
delay(200);
}
bool manageLed(int led){
digitalWrite(led, HIGH);
unsigned long startTime = millis();
while(startTime + ledOnTime > millis()){
for(int btn : btnArray){
if(digitalRead(btn)){
digitalWrite(led, LOW);
if(btn == led - 3){
return true;
}else{
playBuzz();
return false;
}
}
}
}
digitalWrite(led, LOW);
return false;
}
void playBuzz(){
tone(buzz, 100);
delay(150);
noTone(buzz);
}
void showPoint(int counter){
tm.display(0, (counter / 1000) % 10);
tm.display(1, (counter / 100) % 10);
tm.display(2, (counter / 10) % 10);
tm.display(3, counter % 10);
}