/*
Arduino scoreboard for foosball
IR sensor on analog A0
7-segment LED common neg, top: 8,9,gnd,7,6 bottom: 12,11,gnd,10,nc
buzzer on D3
BuffaloLabs Sep 2017
*/
int score = 0;
int IRavg; // initial IR
int IRdif =100; // IR sensitivity
boolean debug = false;
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void setup() {
if (debug) Serial.begin(9600);
if (debug) Serial.println("Foosball scoreboard");
pinMode(3, OUTPUT); // buzzer
pinMode(4, OUTPUT); // led for sensor
pinMode(6, OUTPUT); // 7 segment LED common negative
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(4, HIGH);
for (int i = 0; i < 10; i++) {
show(-1);
tone(3, 1000);
delay(100);
show(score);
tone(3, 2000);
delay(100);
}
noTone(3);
IRavg = calcIR();
if (debug) Serial.print("IRavg = ");
if (debug) Serial.println(IRavg);
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void loop() {
if (checkIR()) { // goal?
sirenUpDown();
if (score == 7) { // goal, game finished
while (0) { // blink forever
tone(3, 2000);
show(8);
delay(100);
noTone(3);
show(-1);
delay(500);
}
}
else { // goal, add score
score++;
for (int i = 0; i < 10; i++) {
show(-2);
delay(100);
show(score);
delay(100);
}
}
}
// delay(1000);
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void show(int n) {
if (debug) Serial.print("display: ");
if (debug) Serial.println(n);
switch (n) {
case -2: // all off
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case -1: // minus sign
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 0:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
case 1:
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 2:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
case 3:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
break;
case 4:
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 5:
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
break;
case 6:
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
case 7:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 8:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
case 9:
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
break;
}
}
//////////////////////////////////////////////////////////////////////////////////
void sirenUpDown() {
for (int i = 1000; i < 2000; i++) { // siren up
tone(3, i);
delay(1);
}
for (int i = 2000; i > 1000; i--) { // siren down
tone(3, i);
delay(1);
}
noTone(3);
}
//////////////////////////////////////////////////////////////////////////////////
int calcIR() {
int reading = 0;
for (int i = 0; i > 10; i++) {
reading += analogRead(A0);
}
return reading / 10;
}
//////////////////////////////////////////////////////////////////////////////////
boolean checkIR() {
int reading = analogRead(A0);
if (debug) Serial.println(reading);
if (abs(reading - IRavg) > IRdif) return true; // no need for de-bounce as will only come back after siren
return false;
}
//////////////////////////////////////////////////////////////////////////////////