#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW//FC16_HW//GENERIC_HW//ICSTATION_HW//
#define MAX_DEVICES 8
#define MAX_ZONES 4
#define PAUSE_TIME 1000
#define SCROLL_SPEED 50
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
const int player1button = 14;
const int player2button = 15;
const int player3button = 16;
const int player4button = 17;
const int pressallowed = 19;
const int pluspoint = 6;
const int minuspoint = 7;
const int reset = 18;
const int player1led = 2;
const int player2led = 3;
const int player3led = 4;
const int player4led = 5;
int button1State = 0;
int button2State = 0;
int button3State = 0;
int button4State = 0;
int plusState = 0;
int lastplusState = 0;
int minState = 0;
int lastminState = 0;
int points1 = 0;
int points2 = 0;
int points3 = 0;
int points4 = 0;
int points1new = 0;
int points2new = 0;
int points3new = 0;
int points4new = 0;
int maxpoints = 999;
char p1[1];
char p2[1];
char p3[1];
char p4[1];
void setup() {
//settings for the zones of the display [7][6] | [5][4] | [3][2] | [1][0]
P.begin(7);
P.setZone(0, 0, 1);
P.setZone(1, 2, 3);
P.setZone(2, 4, 5);
P.setZone(3, 6, 7);
//define pinmodes
pinMode(player1button, INPUT);
pinMode(player2button, INPUT);
pinMode(player3button, INPUT);
pinMode(player4button, INPUT);
pinMode(pressallowed, INPUT);
pinMode(pluspoint, INPUT);
pinMode(minuspoint, INPUT);
pinMode(reset, INPUT);
pinMode(player1led, OUTPUT);
pinMode(player2led, OUTPUT);
pinMode(player3led, OUTPUT);
pinMode(player4led, OUTPUT);
//startup animation of the LEDS
digitalWrite(player1led, HIGH);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, HIGH);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(500);
digitalWrite(player1led, LOW);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
}
void loop() {
//read digital inputs
button1State = digitalRead(player1button);
button2State = digitalRead(player2button);
button3State = digitalRead(player3button);
button4State = digitalRead(player4button);
plusState = digitalRead(pluspoint);
minState = digitalRead(minuspoint);
//declare playerstatus
static boolean player1win = false;
static boolean player2win = false;
static boolean player3win = false;
static boolean player4win = false;
// detect who pushes first
if (button1State == HIGH && player2win == false && player3win == false && player4win == false) {
digitalWrite(player1led, HIGH);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
player1win = true;
}
if (button2State == HIGH && player1win == false && player3win == false && player4win == false ) {
digitalWrite(player1led, LOW);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
player2win = true;
}
if (button3State == HIGH && player1win == false && player2win == false && player4win == false ) {
digitalWrite(player1led, LOW);
digitalWrite(player2led, LOW);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, LOW);
player3win = true;
}
if (button4State == HIGH && player1win == false && player2win == false && player3win == false ) {
digitalWrite(player1led, LOW);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, HIGH);
player4win = true;
}
// When a player has pressed first and a pluspoint is given then add one point until maxpoints is reached
if (plusState != lastplusState){
if (plusState == HIGH && player1win == true && points1 < maxpoints) {
points1new = points1 + 1;
}
if (plusState == HIGH && player2win == true && points2 < maxpoints) {
points2new = points2 + 1;
}
if (plusState == HIGH && player3win == true && points3 < maxpoints) {
points3new = points3 + 1;
}
if (plusState == HIGH && player4win == true && points4 < maxpoints) {
points4new = points4 + 1;
}
delay(200);
}
// When a player has pressed first and a minpoint is given then deduct one point, at 0 the counter stops
if (minState != lastminState){
if (minState == HIGH && player1win == true) {
if(points1 > 0) { points1new = points1 - 1; }
}
if (minState == HIGH && player2win == true) {
if(points2 > 0) {points2new = points2 - 1; }
}
if (minState == HIGH && player3win == true) {
if(points3 > 0) { points3new = points3 - 1; }
}
if (minState == HIGH && player4win == true) {
points4new = points4 - 1;
if(points4 > 0) { points4new = points4 - 1; }
}
delay(200);
}
//save the new points
points1 = points1new;
points2 = points2new;
points3 = points3new;
points4 = points4new;
//convert the string to 2 characters (points1 --> p1, points2 --> p2, ...)
char p1[3];
sprintf(p1, "%i", points1);
char p2[3];
sprintf(p2, "%i", points2);
char p3[3];
sprintf(p3, "%i", points3);
char p4[3];
sprintf(p4, "%i", points4);
//display the points from the player in the correct zone (Zone 0 is player 4, Zone 3 is player 1)
P.displayZoneText(3, p1, PA_CENTER, 25, 5, PA_PRINT, PA_PRINT);
P.displayZoneText(2, p2, PA_CENTER, 25, 5, PA_PRINT, PA_PRINT);
P.displayZoneText(1, p3, PA_CENTER, 25, 5, PA_PRINT, PA_PRINT);
P.displayZoneText(0, p4, PA_CENTER, 25, 5, PA_PRINT, PA_PRINT);
P.displayAnimate();
//When the reset is pushed:
//Reset the winning player
if (digitalRead(reset) == HIGH) {
//P.displayClear();
player1win = false;
player2win = false;
player3win = false;
player4win = false;
//And play a short animation on the LED to show that the buttons have been reset.
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, HIGH);
delay(200);
digitalWrite(player1led, LOW);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(200);
digitalWrite(player1led, HIGH);
digitalWrite(player2led, HIGH);
digitalWrite(player3led, HIGH);
digitalWrite(player4led, HIGH);
delay(200);
digitalWrite(player1led, LOW);
digitalWrite(player2led, LOW);
digitalWrite(player3led, LOW);
digitalWrite(player4led, LOW);
delay(1000);
}
}