#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// button and lcd pins
// Player 1
LiquidCrystal_I2C lcdP1(0x27, 20, 4);
const int btnPinUpP1 = 2;
const int btnPinDownP1 = 3;
const int btnPinSelectorP1 = 4;
// Player 2
LiquidCrystal_I2C lcdP2(0x26, 20, 4);
const int btnPinUpP2 = 5;
const int btnPinDownP2 = 6;
const int btnPinSelectorP2 = 7;
// Player 3
LiquidCrystal_I2C lcdP3(0x25, 20, 4);
const int btnPinUpP3 = 8;
const int btnPinDownP3 = 9;
const int btnPinSelectorP3 = 10;
// Player 4
LiquidCrystal_I2C lcdP4(0x24, 20, 4);
const int btnPinUpP4 = 11;
const int btnPinDownP4 = 12;
const int btnPinSelectorP4 = 13;
// Life and Counters ALL players
int counter[] = {40, 40, 40, 40};
int poisonCounter[] = {0, 0, 0, 0};
int commandDamageFront[] = {0, 0, 0, 0};
int commandDamageSide[] = {0, 0, 0, 0};
int commandDamageDiagonal[] = {0, 0, 0, 0};
// 0 life counter | 1 poison counter | 2 command damage front | 3 command damage side | 4 command damage diagonal
// Selector and life showing on lcd ALL players
int selectorState[] = {0, 0, 0, 0};
int currentCounter[] = {0, 0, 0, 0};
// last button states so the lcd doesnt blink or change if no change was made / buttons were pressed
// Player 1
int btnStateUpP1 = HIGH,
btnStateDownP1 = HIGH,
btnStateSelectorP1 = HIGH,
lastBtnStateUpP1 = HIGH,
lastBtnStateDownP1 = HIGH,
lastBtnStateSelectorP1 = HIGH,
// Player 2
btnStateUpP2 = HIGH,
btnStateDownP2 = HIGH,
btnStateSelectorP2 = HIGH,
lastBtnStateUpP2 = HIGH,
lastBtnStateDownP2 = HIGH,
lastBtnStateSelectorP2 = HIGH,
// Player 3
btnStateUpP3 = HIGH,
btnStateDownP3 = HIGH,
btnStateSelectorP3 = HIGH,
lastBtnStateUpP3 = HIGH,
lastBtnStateDownP3 = HIGH,
lastBtnStateSelectorP3 = HIGH,
// Player 4
btnStateUpP4 = HIGH,
btnStateDownP4 = HIGH,
btnStateSelectorP4 = HIGH,
lastBtnStateUpP4 = HIGH,
lastBtnStateDownP4 = HIGH,
lastBtnStateSelectorP4 = HIGH;
char displayCounter[3];
// FUNTION displays the changes on the lcd of the choosen player
void displayChange(LiquidCrystal_I2C lcd, int player) {
//player--; //just to correctly index the array
sprintf(displayCounter, "%03d", currentCounter[player]);
if (currentCounter[player] < 100) {
displayCounter[0] = displayCounter[1];
displayCounter[1] = displayCounter[2];
displayCounter[2] = ' ';
}
if (currentCounter[player] < 10) {
displayCounter[0] = displayCounter[1];
displayCounter[1] = ' ';
}
lcd.setCursor(7, 1);
lcd.print(displayCounter);
}
// FUNCTION
void displaySelector(LiquidCrystal_I2C lcd, int player) {
// player--; //just to correctly index the array
selectorState[player]++;
if (selectorState[player] > 4)
selectorState[player] = 0;
lcd.clear();
lcd.setCursor(0, 0);
switch (selectorState[player]) {
case 0:
lcd.print(" Life Total:");
commandDamageDiagonal[player] = currentCounter[player];
currentCounter[player] = counter[player];
break;
case 1:
lcd.print("Poison Counters:");
counter[player] = currentCounter[player];
currentCounter[player] = poisonCounter[player];
break;
case 2:
lcd.print(" CD Front:");
poisonCounter[player] = currentCounter[player];
currentCounter[player] = commandDamageFront[player];
break;
case 3:
lcd.print(" CD Side:");
commandDamageFront[player] = currentCounter[player];
currentCounter[player] = commandDamageSide[player];
break;
case 4:
lcd.print(" CD Diagonal:");
commandDamageSide[player] = currentCounter[player];
currentCounter[player] = commandDamageDiagonal[player];
break;
}
displayChange(lcd, player);
}
void setup() {
// initialize buttons and lcd
//Player 1
lcdP1.init();
lcdP1.backlight();
lcdP1.setCursor(3, 0);
lcdP1.print("Life Total:");
lcdP1.setCursor(7, 1);
lcdP1.print("40");
currentCounter[0] = counter[0];
pinMode(btnPinUpP1, INPUT);
pinMode(btnPinDownP1, INPUT);
pinMode(btnPinSelectorP1, INPUT);
//Player 2
lcdP2.init();
lcdP2.backlight();
lcdP2.setCursor(3, 0);
lcdP2.print("Life Total:");
lcdP2.setCursor(7, 1);
lcdP2.print("40");
currentCounter[1] = counter[1];
pinMode(btnPinUpP2, INPUT);
pinMode(btnPinDownP2, INPUT);
pinMode(btnPinSelectorP2, INPUT);
//Player 3
lcdP3.init();
lcdP3.backlight();
lcdP3.setCursor(3, 0);
lcdP3.print("Life Total:");
lcdP3.setCursor(7, 1);
lcdP3.print("40");
currentCounter[2] = counter[2];
pinMode(btnPinUpP3, INPUT);
pinMode(btnPinDownP3, INPUT);
pinMode(btnPinSelectorP3, INPUT);
//Player 4
lcdP4.init();
lcdP4.backlight();
lcdP4.setCursor(3, 0);
lcdP4.print("Life Total:");
lcdP4.setCursor(7, 1);
lcdP4.print("40");
currentCounter[3] = counter[3];
pinMode(btnPinUpP4, INPUT);
pinMode(btnPinDownP4, INPUT);
pinMode(btnPinSelectorP4, INPUT);
}
void loop() {
// Read button state
//Player 1
btnStateUpP1 = digitalRead(btnPinUpP1);
btnStateDownP1 = digitalRead(btnPinDownP1);
btnStateSelectorP1 = digitalRead(btnPinSelectorP1);
//Player 2
btnStateUpP2 = digitalRead(btnPinUpP2);
btnStateDownP2 = digitalRead(btnPinDownP2);
btnStateSelectorP2 = digitalRead(btnPinSelectorP2);
//Player 3
btnStateUpP3 = digitalRead(btnPinUpP3);
btnStateDownP3 = digitalRead(btnPinDownP3);
btnStateSelectorP3 = digitalRead(btnPinSelectorP3);
//Player 4
btnStateUpP4 = digitalRead(btnPinUpP4);
btnStateDownP4 = digitalRead(btnPinDownP4);
btnStateSelectorP4 = digitalRead(btnPinSelectorP4);
//Add delay to all button presses so you can keep button pressed to change life
delay(150);
//Control what players made changes to show them later
bool madeChangesP1 = false,
madeChangesP2 = false,
madeChangesP3 = false,
madeChangesP4 = false;
//Check if buttons are pressed
// Player 1
if (btnStateUpP1 == LOW ) {
currentCounter[0]++;
madeChangesP1 = true;
}
if (btnStateDownP1 == LOW ) {
currentCounter[0]--;
madeChangesP1 = true;
}
if (btnStateSelectorP1 == LOW && lastBtnStateSelectorP1 == HIGH) {
displaySelector(lcdP1, 0);
}
if (madeChangesP1 == true) {
displayChange(lcdP1, 0);
}
lastBtnStateSelectorP1 = btnStateSelectorP1;
// Player 2
if (btnStateUpP2 == LOW ) {
currentCounter[1]++;
madeChangesP2 = true;
}
if (btnStateDownP2 == LOW ) {
currentCounter[1]--;
madeChangesP2 = true;
}
if (btnStateSelectorP2 == LOW && lastBtnStateSelectorP2 == HIGH) {
displaySelector(lcdP2, 1);
}
if (madeChangesP2 == true) {
displayChange(lcdP2, 1);
}
lastBtnStateSelectorP2 = btnStateSelectorP2;
if (btnStateUpP3 == LOW ) {
currentCounter[2]++;
madeChangesP3 = true;
}
if (btnStateDownP3 == LOW ) {
currentCounter[2]--;
madeChangesP3 = true;
}
if (btnStateSelectorP3 == LOW && lastBtnStateSelectorP3 == HIGH) {
displaySelector(lcdP3, 3);
}
if (madeChangesP2 == true) {
displayChange(lcdP3, 3);
}
lastBtnStateSelectorP3 = btnStateSelectorP3;
if (btnStateUpP4 == LOW ) {
currentCounter[3]++;
madeChangesP4 = true;
}
if (btnStateDownP4 == LOW ) {
currentCounter[3]--;
madeChangesP4 = true;
}
if (btnStateSelectorP4 == LOW && lastBtnStateSelectorP2 == HIGH) {
displaySelector(lcdP4, 4);
}
if (madeChangesP4 == true) {
displayChange(lcdP4, 4);
}
lastBtnStateSelectorP4 = btnStateSelectorP4;
}