// 240804
// Carpet
// one player
// two player
// two player coop
// two player with different lights - in progress
// Striped colored carpet with contact matts for each color for 1 or 2 players
// IN PROGRESS - NOT FINALIZED
#include <Adafruit_NeoPixel.h>
// Info Output
#define SINGLE_LED
//#define MATRIX
// Serial
#define SerialOn
// Sound
#define BEEP 12
// PIN for Matrix
#define PIN 13
#define LED 11
// NeoPixels attached
#define LED_COUNT 1 // 256
// Rounds
#define TIMESOF 10
// Declare our NeoPixel strip object:
#ifdef SINGLE_LED
Adafruit_NeoPixel strip(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);
#endif
Adafruit_NeoPixel strip2(LED_COUNT, LED, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
// Variables
// Helles Gelb: RGB(255, 255, 102)
uint32_t yellow = strip.Color(255, 255, 102);
// Sonnengelb: RGB(255, 223, 0)
uint32_t orange = strip.Color(255, 223, 0);
// Grün: RGB(0, 255, 0)
uint32_t green = strip.Color(0, 255, 0);
// Grau: RGB(128, 128, 128)
uint32_t grey = strip.Color(128,128,128);
// Rosa: RGB(255, 192, 203)
uint32_t pink = strip.Color(255, 192, 203);
// Schwarz: RGB(0, 0, 0)
uint32_t black = strip.Color(0, 0, 0);
// Türkis: RGB(64, 224, 208)
uint32_t turquois = strip.Color(64, 224, 208);
// Rot: RGB(255, 0, 0)
uint32_t red = strip.Color(255, 0, 0);
// Color for Player
// Blau: RGB(0, 0, 255)
uint32_t blue = strip.Color(0, 0, 255);
uint32_t col[]={(yellow),(orange),(green),(grey),(pink),(black),(turquois),(red)};
bool twoPlayerTogether=false;
bool twoPlayerCompetition=true;
long randNum;
long lastRandNum=9;
long randArray [10];
bool rounds=false;
int counter=0; // for counting the rounds
int counterA=0;
int counterB=0;
int a=0; // for 2 player game competition
int b=0; // for 2 player game competition
int pointsA; // points player A
int pointsB; // points player B
unsigned long runtime;
unsigned long resulttime;
void setup()
{
// Serial out
#ifdef SerialOn
Serial.begin(9600);
#endif
// initialize A-Pins for pushbutton input
pinMode(A0, INPUT_PULLUP);
pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP);
pinMode(A3, INPUT_PULLUP);
pinMode(A4, INPUT_PULLUP);
pinMode(A5, INPUT_PULLUP);
// initialize D-Pins for pushbutton input
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP); // for 2 player game from here
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
//
pinMode(10, OUTPUT);
pinMode(11, OUTPUT); // 2nd LED
pinMode(BEEP, OUTPUT);
// Matrix
strip.begin();
//strip.setBrightness(255);
//strip.show(); // Initialize all pixels to 'off'
// init
digitalWrite(BEEP, LOW);
// LED-Test and BEEP
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
//digitalWrite(BEEP, HIGH);
tone(BEEP,2000);
delay(500); // Wait millisecond(s)
digitalWrite(10, LOW);
digitalWrite(11, LOW);
//digitalWrite(BEEP, LOW);
noTone(BEEP);
//delay(500); // Wait millisecond(s)
// Test Matrix
for (int i=0; i<=16; i++){
strip.setPixelColor(i, 255, 0, 0);
}
strip.show();
delay(500); // Wait millisecond(s)
// fill (color, first, count)
strip.fill(green,0,16);
strip2.fill(green,0,16);
strip.show();
strip2.show();
delay(500); // Wait millisecond(s)
strip.setPixelColor(0, 0, 0, 0);
strip.show();
}
void loop()
{
// loop
rounds=true;
// **************************************************
// One/Two Player Standard
// **************************************************
if(twoPlayerCompetition==false){
// intro
if (counter==0) {startRoutine();}
if (counter==TIMESOF-1){runtime = millis();}; // start timer after first hit
// set color of LED here and store marker
label: randNum = random(8);
if (randNum==lastRandNum) goto label;
lastRandNum=randNum;
strip.setPixelColor(0,col[randNum]);
strip.show();
while(rounds){
// check for input
while(digitalRead(A0)!= LOW && digitalRead(A1)!=LOW && digitalRead(A2)!=LOW && digitalRead(A3)!= LOW && digitalRead(A4)!= LOW && digitalRead(A5)!=LOW && digitalRead(0)!=LOW && digitalRead(1)!= LOW && digitalRead(2)!= LOW && digitalRead(3)!=LOW && digitalRead(4)!=LOW && digitalRead(5)!= LOW && digitalRead(6)!= LOW && digitalRead(7)!=LOW && digitalRead(8)!=LOW && digitalRead(9)!= LOW) {delay(10);}
if(digitalRead(A0)== LOW) {if(randNum==0){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(A1)== LOW) {if(randNum==1){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(A2)== LOW) {if(randNum==2){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(A3)== LOW) {if(randNum==3){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(A4)== LOW) {if(randNum==4){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(A5)== LOW) {if(randNum==5){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(0) == LOW) {if(randNum==6){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(1) == LOW) {if(randNum==7){rounds=false;a=1;if(a+b==1){pointsA++;}}} //
else if(digitalRead(2)== LOW) {if(randNum==0){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(3)== LOW) {if(randNum==1){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(4)== LOW) {if(randNum==2){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(5)== LOW) {if(randNum==3){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(6)== LOW) {if(randNum==4){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(7) == LOW) {if(randNum==5){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(8) == LOW) {if(randNum==6){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
else if(digitalRead(9) == LOW) {if(randNum==7){rounds=false;b=1;if(a+b==1){pointsB++;}}} //
delay(10);
if (twoPlayerTogether==true) {if((rounds==false) && ((a+b)==1)) {rounds=true;}}
}
counter--;
if(counter==0) {
// outro
endRoutine();
}
} // End of twoPlayerCompetition == false
// **************************************************
// Two Player Competition
// **************************************************
else{ // twoPlayerCompetition == true
if (counterA==0 && counterB==0) {startRoutineCompetition();}
strip.setPixelColor(0,col[randArray[counterA-1]]);
strip.show();
strip2.setPixelColor(0,col[randArray[counterB-1]]);
strip2.show();
#ifdef SerialOn
Serial.print(counterA);
Serial.print(" ");
Serial.println(counterB);
#endif
while(rounds){
// check for input
while(digitalRead(A0)!= LOW && digitalRead(A1)!=LOW && digitalRead(A2)!=LOW && digitalRead(A3)!= LOW && digitalRead(A4)!= LOW && digitalRead(A5)!=LOW && digitalRead(0)!=LOW && digitalRead(1)!= LOW && digitalRead(2)!= LOW && digitalRead(3)!=LOW && digitalRead(4)!=LOW && digitalRead(5)!= LOW && digitalRead(6)!= LOW && digitalRead(7)!=LOW && digitalRead(8)!=LOW && digitalRead(9)!= LOW) {delay(10);}
if(digitalRead(A0)== LOW) {if(randArray[counterA-1]==0){rounds=false;a=1;}} //
else if(digitalRead(A1)== LOW) {if(randArray[counterA-1]==1){rounds=false;a=1;}} //
else if(digitalRead(A2)== LOW) {if(randArray[counterA-1]==2){rounds=false;a=1;}} //
else if(digitalRead(A3)== LOW) {if(randArray[counterA-1]==3){rounds=false;a=1;}} //
else if(digitalRead(A4)== LOW) {if(randArray[counterA-1]==4){rounds=false;a=1;}} //
else if(digitalRead(A5)== LOW) {if(randArray[counterA-1]==5){rounds=false;a=1;}} //
else if(digitalRead(0) == LOW) {if(randArray[counterA-1]==6){rounds=false;a=1;}} //
else if(digitalRead(1) == LOW) {if(randArray[counterA-1]==7){rounds=false;a=1;}} //
else if(digitalRead(2)== LOW) {if(randArray[counterB-1]==0){rounds=false;b=1;}} //
else if(digitalRead(3)== LOW) {if(randArray[counterB-1]==1){rounds=false;b=1;}} //
else if(digitalRead(4)== LOW) {if(randArray[counterB-1]==2){rounds=false;b=1;}} //
else if(digitalRead(5)== LOW) {if(randArray[counterB-1]==3){rounds=false;b=1;}} //
else if(digitalRead(6)== LOW) {if(randArray[counterB-1]==4){rounds=false;b=1;}} //
else if(digitalRead(7) == LOW) {if(randArray[counterB-1]==5){rounds=false;b=1;}} //
else if(digitalRead(8) == LOW) {if(randArray[counterB-1]==6){rounds=false;b=1;}} //
else if(digitalRead(9) == LOW) {if(randArray[counterB-1]==7){rounds=false;b=1;}} //
delay(10);
}
if (a==1) {a=0;counterA--;}
if (b==1) {b=0;counterB--;}
if(counterA==0 || counterB==0) {
// outro
endRoutineCompetition();
}
} // end else
} // loop End
void startRoutine(){
resetLED();
counter=TIMESOF;
pointsA=0;
pointsB=0;
beepOnce();
#ifdef SerialOn
Serial.println("Game started!");
Serial.println("");
#endif
}
void startRoutineCompetition(){
resetLED();
counterA=TIMESOF;
counterB=TIMESOF;
beepOnce();
// predefined list for running along two separate processings
for(int j=0;j<TIMESOF;j++) {
label2: randNum = random(8);
if (j>0) {
if (randNum==randArray[j-1]) goto label2;
}
randArray[j]=randNum;
}
#ifdef SerialOn
Serial.println("Competition Game started!");
Serial.println("");
for (int k=0;k<TIMESOF;k++){
Serial.print(randArray[k]);
Serial.print(" ");
}
Serial.println();
#endif
}
void endRoutine(){
beepOnce();
beepOnce();
resulttime=millis()-runtime;
#ifdef SerialOn
Serial.println("Game over! Your score");
Serial.print("Player A: ");
Serial.println(pointsA);
Serial.print("Player B: ");
Serial.println(pointsB);
Serial.print("Time:");
Serial.println(resulttime/10);
Serial.println("");
#endif
}
void endRoutineCompetition(){
beepOnce();
beepOnce();
//resulttime=millis()-runtime;
Serial.println("Competition Game over!");
if(counterA==0) {
Serial.println("Player A won! ");
flash(1);
}
if(counterB==0) {
Serial.println("Player B won! ");
flash(2);
}
//Serial.print("Time:");
//Serial.println(resulttime/10);
Serial.println("");
counterA=0;
counterB=0;
}
void beepOnce(){
tone(12, 1000);
digitalWrite(10,HIGH);
strip.setPixelColor(0, 255,255, 255);
strip.show();
delay(500);
noTone(12);
digitalWrite(10,LOW);
}
void flash(int i){
resetLED();
delay(500);
if (i==1){
for(int t=0;t<4;t++){
strip.fill(green,0,16);
//strip.setPixelColor(0, green);
strip.show();
delay(500);
strip.fill(black,0,16);
//strip.setPixelColor(0, black);
strip.show();
delay(500);
}
}
if (i==2){
for(int t=0;t<4;t++){
strip2.fill(blue,0,16);
//strip2.setPixelColor(0, blue);
strip2.show();
delay(500);
strip2.fill(black,0,16);
//strip2.setPixelColor(0, black);
strip2.show();
delay(500);
}
}
}
void resetLED(){
// reset LED
strip.setPixelColor(0, 0, 0, 0);
strip.show();
strip2.setPixelColor(0, 0, 0, 0);
strip2.show();
}