Hi, I'm new to coding and this is my first project.
I'm trying to make an electronic darts scoreboard, using an LCD to display the current score and to select how many players are in the game.
I'm then using 4 LEDC68 3 digit 7 segment displays to show up to 4 players, with an LED linked to each one to indicate again who's turn it is.
Currently, all 4 LEDC68s turn on, and single player works correctly.
However when I select 2 player, P1Display and P2Display both show the score of P2, with this continuing up to selecting 4 player and all 4 displays showing the scoore of P4.
I'm struggling to wokr out how to get the displays to each show their own players score, could anyone please help me out?
Thanks
#include <TM1651.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
//////////////////////////////////////////////keypad
const byte ROWS = 4;
const byte COLS = 3;
char hexaKeys[ROWS][COLS] = {
{'7', '8', '9'},
{'4', '5', '6'},
{'1', '2', '3'},
{'R', '0', 'S'}
};
byte rowPins[ROWS] = {6,5,4,3};
byte colPins[COLS] = {9,8,7};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//////////////////////////////////////////////LCD
#define PIN_A0 (14)
#define PIN_A1 (15)
#define PIN_A2 (16)
#define PIN_A3 (17)
#define PIN_A4 (18)
#define PIN_A5 (19)
const int rs = 14, en = 15, d4 = 16, d5 = 17, d6 = 18, d7 = 19;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//////////////////////////////////////////////SPEAKER
#define SPEAKER 12
//////////////////////////////////////////////7Seg
#define P1CLK 53
#define P1DIO 51
#define P2CLK 49
#define P2DIO 47
#define P3CLK 45
#define P3DIO 43
#define P4CLK 41
#define P4DIO 39
//Players LED indicators
#define Player1Led 22
#define Player2Led 24
#define Player3Led 26
#define Player4Led 28
TM1651 P1Display(P1CLK,P1DIO);
TM1651 P2Display(P2CLK,P2DIO);
TM1651 P3Display(P3CLK,P3DIO);
TM1651 P4Display(P4CLK,P4DIO);
char key = 'z';
void setup(){
Serial.begin(9600);
pinMode(A0, OUTPUT);pinMode(A1, OUTPUT);pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);pinMode(A4, OUTPUT);pinMode(A5, OUTPUT);
lcd.begin(16, 2);
P1Display.displaySet(2);
P2Display.displaySet(2);
P3Display.displaySet(2);
P4Display.displaySet(2);
//begin game
promptStart();
}
void loop(){
promptStart();
}
void promptStart(){
int NUMPLAYERS = 0;
digitalWrite(Player1Led, HIGH);
digitalWrite(Player2Led, HIGH);
digitalWrite(Player3Led, HIGH);
digitalWrite(Player4Led, HIGH);
P1Display.displayClear();
P2Display.displayClear();
P3Display.displayClear();
P4Display.displayClear();
lcd.clear();
lcd.print("Enter number of");
lcd.setCursor(0,1);
lcd.print("players (1-4): ");
bool playersInRange = false;
while (!playersInRange){
key = customKeypad.getKey();
if (c2i(key)<5 && c2i(key)>0){
NUMPLAYERS = c2i(key);
lcd.print(NUMPLAYERS);
keyBeep();
delay(500);
playersInRange = true;
}
else if (c2i(key) > 4 || c2i(key)==0) {
badBeep();
}
else{
//badBeep();
}
}
//choose game based on number of players
lcd.clear();
lcd.setCursor(0,0);lcd.print(key);lcd.setCursor(1,0);lcd.print("P BEGIN");delay(1000);
lcd.clear();
switch (NUMPLAYERS) {
case 1:
game1P();
break;
case 2:
game2P();
break;
case 3:
game3P();
break;
case 4:
game4P();
break;
}
}
void game1P(){
int P1_sc=501;
while (true){
lcd.clear();
lcd.setCursor(0,0);lcd.print("SCORE:");
P1Display.displayInteger(P1_sc);
digitalWrite(Player1Led, HIGH);
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, LOW);
digitalWrite(Player4Led, LOW);
int roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P1_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P1_sc = P1_sc - roundScore;
}
lcd.clear();lcd.setCursor(0,0);
lcd.print("SCORE:");lcd.setCursor(13,0);lcd.print(P1_sc,DEC);
if (P1_sc == 0) {
victory(1);return;
}
}
}
void game4P(){
int P1_sc=501;int P2_sc=501;int P3_sc=501;int P4_sc=501;
while (true){
lcd.clear();
lcd.setCursor(0,0);lcd.print("P1 SCORE:");
P1Display.displayInteger(P1_sc);
P2Display.displayInteger(P2_sc);
P3Display.displayInteger(P3_sc);
P4Display.displayInteger(P4_sc);
digitalWrite(Player1Led, HIGH);
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, LOW);
digitalWrite(Player4Led, LOW);
//Player One
int roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P1_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P1_sc = P1_sc - roundScore;
}
if (P1_sc == 0) {
victory(1);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P2 SCORE:");
digitalWrite(Player1Led, LOW);
digitalWrite(Player2Led, HIGH);
//Player Two
roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P2_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P2_sc = P2_sc - roundScore;
}
if (P2_sc == 0) {
victory(2);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P3 SCORE:");
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, HIGH);
//Player Three
roundScore = waitForSubtraction(0);
//if (roundScore==-1){return;}
if (P3_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P3_sc = P3_sc - roundScore;
}
if (P3_sc == 0) {
victory(3);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P4 SCORE:");
digitalWrite(Player3Led, LOW);
digitalWrite(Player4Led, HIGH);
//Player Four
roundScore = waitForSubtraction(0);
//if (roundScore==-1){return;}
if (P4_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P4_sc = P4_sc - roundScore;
}
if (P4_sc == 0) {
victory(4);return;
}
}
}
void game3P(){
int P1_sc=501;int P2_sc=501;int P3_sc=501;
while (true){
lcd.clear();
lcd.setCursor(0,0);lcd.print("P1 SCORE:");
P1Display.displayInteger(P1_sc);
P2Display.displayInteger(P2_sc);
P3Display.displayInteger(P3_sc);
digitalWrite(Player1Led, HIGH);
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, LOW);
digitalWrite(Player4Led, LOW);
//Player One
int roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P1_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P1_sc = P1_sc - roundScore;
}
if (P1_sc == 0) {
victory(1);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P2 SCORE:");
digitalWrite(Player1Led, LOW);
digitalWrite(Player2Led, HIGH);
//Player Two
roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P2_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P2_sc = P2_sc - roundScore;
}
if (P2_sc == 0) {
victory(2);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P3 SCORE:");
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, HIGH);
//Player Three
roundScore = waitForSubtraction(0);
//if (roundScore==-1){return;}
if (P3_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P3_sc = P3_sc - roundScore;
}
if (P3_sc == 0) {
victory(3);return;
}
}
}
void game2P(){
int P1_sc=501;int P2_sc=501;
while (true){
lcd.clear();
lcd.setCursor(0,0);lcd.print("P1 SCORE:");
P1Display.displayInteger(P1_sc);
P2Display.displayInteger(P2_sc);
digitalWrite(Player1Led, HIGH);
digitalWrite(Player2Led, LOW);
digitalWrite(Player3Led, LOW);
digitalWrite(Player4Led, LOW);
//Player One
int roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P1_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P1_sc = P1_sc - roundScore;
}
if (P1_sc == 0) {
victory(1);return;
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("P2 SCORE:");
digitalWrite(Player1Led, LOW);
digitalWrite(Player2Led, HIGH);
//Player Two
roundScore = waitForSubtraction(1);
//if (roundScore==-1){return;}
if (P2_sc-roundScore<0){
Serial.println("no change to score. Current score:");
}
else{
P2_sc = P2_sc - roundScore;
}
if (P2_sc == 0) {
victory(2);return;
}
}
}
int waitForSubtraction(int row){
int score=0;
int tensPlace = 0;
while (true){
key = customKeypad.getKey();
if (key){
Serial.println("key pressed");
if (key=='R'){submitBeep();return -1*score;}
if (key=='S'){submitBeep();return score;}
if (tensPlace==0){score = c2i(key);keyBeep();lcd.setCursor(5,row);lcd.print(key);}
if (tensPlace==1){score = score*10+c2i(key);keyBeep();lcd.setCursor(6,row);lcd.print(key);}
if (tensPlace==2){score = score*10+c2i(key);keyBeep();lcd.setCursor(7,row);lcd.print(key);}
if (tensPlace >2){badBeep();return 0;}
tensPlace = tensPlace+1;
}
}
}
int c2i(char key){
return key-'0';
}
// pin, freq, duration
void keyBeep(){
tone(SPEAKER, 500, 100);
//delay(50);
//noTone(SPEAKER);
}
void badBeep(){
tone(SPEAKER, 100, 50);
//noTone(SPEAKER);
delay(100);
tone(SPEAKER, 100, 50);
//noTone(SPEAKER);
}
void submitBeep(){
tone(SPEAKER, 1000, 100);
}
void victory(int winNum){
lcd.clear();
lcd.print("PLAYER ");lcd.setCursor(8,0);lcd.print(winNum);
lcd.setCursor(0,1);lcd.print("WINS");
keyBeep();keyBeep();keyBeep();keyBeep();
delay(2000);
promptStart();
}