/***********************/
/* PINS */
/***********************/
// Ultrasonic
const int echoPin = 22;
const int trigPin = 23;
// Piezo
const int piezoPin[2] = {A0, A1};
// Button Player
const int buttonPin = 24;
const int buttonLedPin = 25;
// Button 301
const int button301Pin = 26;
const int button301LedPin = 27;
// Button 501
const int button501Pin = 28;
const int button501LedPin = 29;
// Button Cricket
const int buttonCricPin = 30;
const int buttonCricLedPin = 31;
// Button DIN
const int buttonDINPin =32;
const int buttonDINLedPin = 33;
// Button DOUT
const int buttonDOUTPin = 0;
const int buttonDOUTLedPin = 1;
// Button MOUT
const int buttonMOUTPin = 2;
const int buttonMOUTLedPin = 3;
// Button League
const int buttonLeaguePin = 16;
const int buttonLeagueLedPin = 17;
// Anzeige Spieler
const int ledPlayer1 = 18;
const int ledPlayer2 = 19;
const int ledPlayer3 = 20;
const int ledPlayer4 = 21;
// Latch Cricket-Anzeige
const int latchPin[4] = {4,5,6,7};
const int clockPin[4] = {8,9,10,11};
const int dataPin[4] = {12,13,14,15};
// Matrix
// Output Pins
const int PO_[4] = {34, 35, 36, 37};
// Input Pins
const int PI_[16] = {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
const int PI_Analog_Reserve[14] = {A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15};
/***********************/
/* VARIABLES */
/***********************/
// Matrix Values
// 120 = single 20, 220 = double 20, 320 = triple 20
// 125 = single Bull, 225 = double bull
const int MATRIX_VALUES[4][16] = {
{212, 112, 209, 109, 214, 114, 211, 111, 208, 108, 000, 312, 309, 314, 311, 308},
{216, 116, 207, 107, 219, 119, 203, 103, 217, 117, 225, 316, 307, 319, 303, 317},
{202, 102, 215, 115, 210, 110, 206, 106, 213, 113, 125, 302, 315, 310, 306, 313},
{204, 104, 218, 118, 201, 101, 220, 120, 205, 105, 000, 304, 318, 301, 320, 305}};
bool bI[4][16];
bool bHitDetected = false;
// Piezo
int iValue[2] = {0, 0};
int iPiezoThreshold = 20;
bool bMissedDart = false;
// Ultrasonic
long lDuration;
int iDistance;
int iUltrasonicThreshold = 0;
int iMotionDetected = 0;
int iUltrasonicThresholdMeasured = 0;
int iDebounceWobbleTime = 750;
// BTN Hilfsvariable
bool iButtonState = 0;
//Temporäre Schleifenzähler usw.
int i = 0;
int j =0;
int k=0;
//Zwischenspeicher
int LastScore;
int ActPlayer = 0;
int SetPlayer = 0;
bool StateUltraSonic = false;
bool ButtonPressed = false; //Rückgabewert
bool GameStarted = false;
int GameSelection = 0; //0=keinSpiel, 1=301, 2=501, 3=Cricket, 4=Offen ;)
byte ModeSelection = 0; //Bit1=DoubleOut(CutThroat), Bit2=MasterOut, Bit3=DoubleIn, --> 0=SingleOut, 1=DoubleOut(CutThroat), 2=MasterOut, 4=DoubleIn, 5=DoubleIn-DoubleOut, 6=DoubleIn-MasterOut,
int iState = 0; //Spielstatus: 1: Warte auf Wurf, 2: Nächster Spieler, 3:
int Throw = 0;
int ScoreFirst = 0;
//Definitionen
const int PlayerMax = 4;
const int MaxRunde301 = 10;
const int MaxRunde501 = 15;
const int MaxRundeCricket = 20;
//Spiel und Spielvariante
bool G301 = false;
bool G501 = false;
bool Cricket = false;
bool DIN = false;
bool DOUT = false;
bool MOUT = false;
bool CutThroat = false;
bool League = false;
bool Winner=false;
bool Bust = false;
int Rundenzaehler = 0;
int punktzahl = 0;
int zahl = 0;
int modifier = 0;
bool Double = false;
bool Triple = false;
int OverallScore = 0;
int TempPlayerScore = 0;
int TempThrowScore = 0;
bool ThrowGood = false;
bool TestModeAct = false;
int TestModeNr = 0;
int ThrowScore[3] = {0,0,0};
// Player, 15-25, Wurf 1-3
bool CricketScore[4][7][3] =
{
{
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false}
},
{
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false}
},
{
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false}
},
{
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false},
{false, false, false}
}};
int Points[4] = {0, 0, 0, 0};
byte ledsCricket[4][3] = {{0x00,0x00,0x00},
{0x00,0x00,0x00},
{0x00,0x00,0x00},
{0x00,0x00,0x00}};
void setup()
{
// Pins Ultrasonic
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Pin Button
pinMode(buttonPin, INPUT_PULLUP);
// Pin Button LED
pinMode(buttonLedPin, OUTPUT);
digitalWrite(buttonLedPin, LOW);
// Pin Button 301
pinMode(button301Pin, INPUT_PULLUP);
// Pin Button 301 LED
pinMode(button301LedPin, OUTPUT);
digitalWrite(button301LedPin, LOW);
// Pin Button 501
pinMode(button501Pin, INPUT_PULLUP);
// Pin Button 501 LED
pinMode(button501LedPin, OUTPUT);
digitalWrite(button501LedPin, LOW);
// Pin Button Cricket
pinMode(buttonCricPin, INPUT_PULLUP);
// Pin Button Cricket LED
pinMode(buttonCricLedPin, OUTPUT);
digitalWrite(buttonCricLedPin, LOW);
// Pin Button DOUT
pinMode(buttonDOUTPin, INPUT_PULLUP);
// Pin Button DOUT LED
pinMode(buttonDOUTLedPin, OUTPUT);
digitalWrite(buttonDOUTLedPin, LOW);
// Pin Button DIN
pinMode(buttonDINPin, INPUT_PULLUP);
// Pin Button DIN LED
pinMode(buttonDINLedPin, OUTPUT);
digitalWrite(buttonDINLedPin, LOW);
// Pin Button MOUT
pinMode(buttonMOUTPin, INPUT_PULLUP);
// Pin Button MOUT LED
pinMode(buttonMOUTLedPin, OUTPUT);
digitalWrite(buttonMOUTLedPin, LOW);
// Pin Button League LED
pinMode(buttonLeagueLedPin, OUTPUT);
digitalWrite(buttonLeagueLedPin, LOW);
// Pin LED Player 1-4
pinMode(ledPlayer1, OUTPUT);
digitalWrite(ledPlayer1, LOW);
pinMode(ledPlayer2, OUTPUT);
digitalWrite(ledPlayer2, LOW);
pinMode(ledPlayer3, OUTPUT);
digitalWrite(ledPlayer3, LOW);
pinMode(ledPlayer4, OUTPUT);
digitalWrite(ledPlayer4, LOW);
// Matrix
for (int i = 0; i < 4; i++)
{
pinMode(PO_[i], OUTPUT);
}
for (int i = 0; i < 16; i++)
{
pinMode(PI_[i], INPUT_PULLUP);
}
//Cricket Latch Register
for (int i = 1; i < 5; i++)
{
pinMode(latchPin[i], OUTPUT);
pinMode(dataPin[i], OUTPUT);
pinMode(clockPin[i], OUTPUT);
}
GameSelection = 0; //0=keinSpiel, 1=301, 2=501, 3=Cricket, 4=Offen ;)
ModeSelection = 0; //Bit1=DoubleOut(CutThroat), Bit2=MasterOut, Bit3=DoubleIn, Bit8=League --> 0=SingleOut, 1=DoubleOut(CutThroat), 2=MasterOut, 4=DoubleIn, 5=DoubleIn-DoubleOut, 6=DoubleIn-MasterOut,
//StartGame = false;
StartupLights();
}
void loop() {
// put your main code here, to run repeatedly:
//EvaluateButtonsGame();
//EvaluateButtonsMode();
//EvaluateButtonPlayer();
//EvaluateGameMode();
//SetLamps();
delay(500);
digitalWrite(button301LedPin, HIGH);
//for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
//digitalWrite(latchPin[0], LOW);
//shiftOut(dataPin[0], clockPin[0], MSBFIRST, 0xFF);
//shiftOut(dataPin[0], clockPin[0], MSBFIRST,0x00);
//shiftOut(dataPin[0], clockPin[0], MSBFIRST,0xF0);
//digitalWrite(latchPin[0], HIGH);
//delay(5000);
ledsCricket[0][0] = 0x0F;
ledsCricket[1][0] = 0x00;
ledsCricket[2][0] = 0x00;
ledsCricket[0][1] = 0xFF;
ledsCricket[1][1] = 0x00;
ledsCricket[2][1] = 0x00;
ledsCricket[3][1] = 0x00;
ledsCricket[0][2] = 0xF0;
ledsCricket[1][2] = 0x00;
ledsCricket[2][2] = 0x00;
ledsCricket[3][2] = 0x00;
//for (i=1; i<9; i++)
//{
//for (j=0; j<3; j++)
//{
//bitSet(ledsCricket[0][j], i);
updateShiftRegisterCricket(0);
//}
delay(500);
//}
delay(500);
digitalWrite(button301LedPin, LOW);
//for (i=0; i<8; i++)
//{
//for (j=0; j<3; j++)
//{
//bitClear(ledsCricket[0][j], i);
updateShiftRegisterCricket_1(0);
//}
delay(500);
//}
//}
}
void CheckButton(int Button)
{
iButtonState = digitalRead(Button);
// Wenn gedrückt Ausgabe
if (iButtonState == LOW)
{
return ButtonPressed;
delay(500);
}
}
void EvaluateButtonPlayer()
{
Serial.print("\t" && "EvaluateButtonPlayer wird ausgeführt");
if (GameSelection > 0)
{
if (!League)
{
CheckButton(buttonPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
if (SetPlayer < PlayerMax)
{
SetPlayer++;
}
else
{
SetPlayer = 1;
}
}
}
else
{
SetPlayer =4;
}
}
else
{
SetPlayer = 0;
}
Serial.print("\t" && "Anzahl Spieler: " && SetPlayer);
}
void EvaluateGameMode()
{
Serial.print("\t" && "EvaluateGameMode wird ausgeführt");
//Spiel und Variante zur besseren Lesbarkeit ausprogrammieren
G301 = false;
G501 = false;
Cricket = false;
DIN = false;
DOUT = false;
MOUT = false;
CutThroat = false;
switch (GameSelection)//0=keinSpiel, 1=301, 2=501, 3=Cricket, 4=Offen ;)
{
case 1:
G301 = true;
G501 = false;
Cricket = false;
break;
case 2:
G301 = false;
G501 = true;
Cricket = false;
break;
case 3:
G301 = false;
G501 = false;
Cricket = true;
break;
}
switch (ModeSelection)//Bit1=DoubleOut(CutThroat), Bit2=MasterOut, Bit3=DoubleIn, Bit8=League --> 0=SingleOut, 1=DoubleOut(CutThroat), 2=MasterOut, 4=DoubleIn, 5=DoubleIn-DoubleOut, 6=DoubleIn-MasterOut, 128=League_Single, 129=League_DoUT, 130=League_MOUT, 132=League_DIN, 133=League_DIN_DOUT, 134=League_DIN_MOUT
{
case 0:
DIN = false;
DOUT = false;
MOUT = false;
CutThroat = false;
League = false;
break;
case 1:
DIN = false;
DOUT = true;
MOUT = false;
CutThroat = true;
League = false;
break;
case 2:
DIN = false;
DOUT = false;
MOUT = true;
CutThroat = false;
League = false;
break;
case 4:
DIN = true;
DOUT = false;
MOUT = false;
CutThroat = false;
League = false;
break;
case 5:
DIN = true;
DOUT = true;
MOUT = false;
CutThroat = false;
League = false;
break;
case 6:
DIN = true;
DOUT = false;
MOUT = true;
CutThroat = false;
League = false;
break;
//LEAGUE:
//128=League_Single, 129=League_DoUT, 130=League_MOUT, 132=League_DIN, 133=League_DIN_DOUT, 134=League_DIN_MOUT
case 128:
DIN = false;
DOUT = false;
MOUT = false;
CutThroat = false;
League = true;
break;
case 129:
DIN = false;
DOUT = true;
MOUT = false;
CutThroat = true;
League = true;
break;
case 130:
DIN = false;
DOUT = false;
MOUT = true;
CutThroat = false;
League = true;
break;
case 132:
DIN = true;
DOUT = false;
MOUT = false;
CutThroat = false;
League = true;
break;
case 133:
DIN = true;
DOUT = true;
MOUT = false;
CutThroat = false;
League = true;
break;
case 134:
DIN = true;
DOUT = false;
MOUT = true;
CutThroat = false;
League = true;
break;
}
Serial.print("\t" && "GameMode ist DIN: " && DIN);
Serial.print("\t" && "GameMode ist DOUT: " && DOUT);
Serial.print("\t" && "GameMode ist MOUT: " && MOUT);
Serial.print("\t" && "GameMode ist CutThroat: " && CutThroat);
Serial.print("\t" && "GameMode ist League: " && League);
}
void EvaluateButtonsMode()
{
Serial.print("\t" && "EvaluateButtonsMode wird ausgeführt");
if (GameSelection = 3)
{
CheckButton(buttonDINPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
}
CheckButton(buttonMOUTPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
}
CheckButton(buttonDOUTPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
ModeSelection = 1;
}
CheckButton(buttonLeaguePin);
if (ButtonPressed = true)
{
ButtonPressed = false;
}
}
else if (GameSelection == 1 || GameSelection == 2)
{
CheckButton(buttonDINPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
if (bitRead(ModeSelection, 3) == true)
{
bitClear(ModeSelection, 3);
}
else
{
bitSet(ModeSelection, 3);
}
}
CheckButton(buttonDOUTPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
if (bitRead(ModeSelection, 1) == true)
{
bitClear(ModeSelection, 1);
bitClear(ModeSelection, 2);
}
else
{
bitSet(ModeSelection, 1);
bitClear(ModeSelection, 2);
}
}
CheckButton(buttonMOUTPin);
if (ButtonPressed = true)
{
ButtonPressed = false;
if (bitRead(ModeSelection, 2) == true)
{
bitClear(ModeSelection, 2);
bitClear(ModeSelection, 1);
}
else
{
bitSet(ModeSelection, 2);
bitClear(ModeSelection, 1);
}
}
CheckButton(buttonLeaguePin);
if (ButtonPressed = true)
{
ButtonPressed = false;
if (bitRead(ModeSelection, 8) == true)
{
bitClear(ModeSelection, 8);
}
else
{
bitSet(ModeSelection, 8);
}
}
}
}
void EvaluateButtonsGame()
{
Serial.print("\t" && "EvaluateButtonsGame wird ausgeführt");
CheckButton(button301Pin);
if (ButtonPressed = true)
{
if (GameSelection = 1)
{
ButtonPressed = false;
GameSelection = 0;
Serial.print("\t" && "301 abgewählt");
}
else
{
ButtonPressed = false;
GameSelection = 1;
Serial.print("\t" && "301 angewählt");
}
}
CheckButton(button501Pin);
if (ButtonPressed = true)
{
if (GameSelection = 2)
{
ButtonPressed = false;
GameSelection = 0;
Serial.print("\t" && "501 abgewählt");
}
else
{
ButtonPressed = false;
GameSelection = 2;
Serial.print("\t" && "501 angewählt");
}
}
CheckButton(buttonCricPin);
if (ButtonPressed = true)
{
if (GameSelection = 3)
{
ButtonPressed = false;
GameSelection = 0;
Serial.print("\t" && "Cricket abgewählt");
}
else
{
ButtonPressed = false;
GameSelection = 3;
Serial.print("\t" && "Cricket angewählt");
}
}
}
void updateShiftRegisterCricket(int Player)
{
digitalWrite(latchPin[Player], LOW);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player][0]);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player][1]);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player][2]);
//shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player+2][0]);
digitalWrite(latchPin[Player], HIGH);
delay(100);
}
void updateShiftRegisterCricket_1(int Player)
{
digitalWrite(latchPin[Player], LOW);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player+1][0]);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player+1][1]);
shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player+1][2]);
//shiftOut(dataPin[Player], clockPin[Player], LSBFIRST, ledsCricket[Player+2][0]);
digitalWrite(latchPin[Player], HIGH);
delay(100);
}
void StartupLights()
{
for (int i = 0; i < 3; i++)
{
digitalWrite(buttonLedPin, HIGH);
digitalWrite(button301LedPin, HIGH);
digitalWrite(button501LedPin, HIGH);
digitalWrite(buttonDINLedPin, HIGH);
digitalWrite(buttonDOUTLedPin, HIGH);
digitalWrite(buttonMOUTLedPin, HIGH);
digitalWrite(buttonCricLedPin, HIGH);
digitalWrite(buttonLeagueLedPin, HIGH);
digitalWrite(ledPlayer1, HIGH);
digitalWrite(ledPlayer2, HIGH);
digitalWrite(ledPlayer3, HIGH);
digitalWrite(ledPlayer4, HIGH);
//for (int j = 1; j <= PlayerMax; j++)
//{
//j=0;
//for (int k = 0; k < 8; k++)
//{
// bitSet(ledsCricket[j][i], k);
// updateShiftRegisterCricket(j);
// delay(1000);
//}
//}
delay(250);
digitalWrite(buttonLedPin, LOW);
digitalWrite(button301LedPin, LOW);
digitalWrite(button501LedPin, LOW);
digitalWrite(buttonDINLedPin, LOW);
digitalWrite(buttonDOUTLedPin, LOW);
digitalWrite(buttonMOUTLedPin, LOW);
digitalWrite(buttonCricLedPin, LOW);
digitalWrite(buttonLeagueLedPin, LOW);
digitalWrite(ledPlayer1, LOW);
digitalWrite(ledPlayer2, LOW);
digitalWrite(ledPlayer3, LOW);
digitalWrite(ledPlayer4, LOW);
//for (int j = 1; j <= PlayerMax; j++)
//{
//j=0;
//for (int k = 0; k < 8; k++)
// {
//bitClear(ledsCricket[j][i], k);
//updateShiftRegisterCricket(j);
//delay(250);
// }
//}
delay(250);
}
}
void SetLamps()
{
if (G301)
{
digitalWrite(button301LedPin, HIGH);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
}
if (G501)
{
digitalWrite(button501LedPin, HIGH);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
digitalWrite(buttonLedPin, HIGH);
delay(250);
digitalWrite(buttonLedPin, LOW);
delay(250);
}
}