/*
Acchiappa la talpa. Con 3 led per le talpe e 3 pulsanti,
con la possibilità di inserire diversi livelli di intensità attraverso un
potenziometro, che permettano di variare la velocità di accensione dei led.
Un indicatore numerico progressivo dovrà indicare il punteggio,
un segnale acustico dovrà essere emesso quando la talpa viene mancata.
*/
#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 {
tone(buzz, 100);
delay(150);
noTone(buzz);
return false; }
}
}
}
digitalWrite(led, LOW);
return false; }
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); }