4 x LEDs (red, yellow, green, & blue)
4 x 330Ω Resistors
7 x Push/Tactile Buttons
Potentiometer
Piezo Speaker
Liquid Crystal Display (LCD)
RedBoard/Arduino
Jumper Wires
3 x Breadboards
Puzzles & Potions Gameboard*
Puzzles & Potions Tokens*
Puzzles & Potions RedBoard/Breadboard Overlay*
Puzzles & Potions LCD Display*
Purchased Items:
Arduino SparkFun Kit (available here)
Includes LEDs, resistors, potentiometer, piezo, LCD, RedBoard, & jumperwires
Tactile Buttons (available here)
Additional Breadboards & Wires (available here)
*Printable & listed below
Wiring Setup:
Using this key and the TinkerCAD circuit drawing illustrated above, construct as shown
LCD Display Connections (Left to Right):
Pin 1: GND (via power rail)
Pin 2: 5V (via power rail)
Pin 3: Center pin of Potentiometer
Pin 4: Digital Pin 8
Pin 5: GND (via power rail)
Pin 6: Digital Pin 7
Pin 7-10: N/A
Pin 11: Digital Pin 5
Pin 12: Digital Pin 4
Pin 13: Digital Pin 3
Pin 14: Digital Pin 2
Pin 15: 5V (via power rail)
Pin 16: GND (via power rail)
Buttons:
Moderator Button: Digital Pin 1
Correct Guess Button: Pin A0
Wrong Guess Button: Digital Pin 9
Player 1 (Red) Button: Pin A3
Player 2 (Yellow) Button: Pin A4
Player 3 (Green) Button: Pin A5
Player 4 (Blue) Button: Pin A2
LEDs:
Player 1 (Red) LED: Digital Pin 13
Player 2 (Yellow) LED: Digital Pin 12
Player 3 (Green) LED: Digital Pin 11
Player 4 (Blue) LED: Digital Pin 10
/* Written by: Maya De Los Santos, Teddy Walinskas, and Esther Benasayag
* Last Update: 12/7/2020
* Resources used:
* https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld [LCD]
* https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce [Debounce]
*/
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define REST 0
#include <LiquidCrystal.h>
int ledState = LOW, lastButtonState = LOW; // Intialize Debounce States
unsigned long lastDebounceTime = 0, resetTime = 2000; // Initialize Debounce Variables
bool resetGame = false; // Set Reset Game to False
const int ledOne = 13, ledTwo = 12, ledThree = 11, ledFour =10; // Initalize LEDS
// Initalize Question Buttons
const int questionBOne = A3, questionBTwo = A4, questionBThree = A5, questionBFour = A2;
// Initalize Question Button States
int questionBOneState = 0, questionBTwoState = 0, questionBThreeState = 0, questionBFourState = 0;
// Initalize Speaker, Moderator, Guess, Category, & Start/End Buttons
const int speaker = 6, modB = 9, newCategoryB = 0, startEndB = 1;
const int delayBOne = A0, delayBTwo = A1; // Initalize Delay Buttons
int delayBStateOne = 0, delayBStateTwo = 0, delayBStateThree = 0; // Initalize Delay Button States
const long delayTime = 30000; // Set Delay Time
long startTime1 = 0, startTime2 = 0, startTime3 = 0; // Intialize StartTime# Variables
long currentTime1 = 0, currentTime2 = 0, currentTime3 = 0; // Intialize CurrentTime# Variables
bool ignorePlayer1 = false, ignorePlayer2 = false, ignorePlayer3 = false; // Initialize ignorePlayer# booleans
bool game = true;
const int board = 59;
int roundUpdate1, roundUpdate2, roundUpdate3, roundUpdate4;
LiquidCrystal lcd(8, 7, 5, 4, 3, 2); // Initialize the LCD
// Set Category Array
String categories[] = {"Animals", "Books/Literature", "Countries", "Famous Character", "Movies", "Musical Artists"};
// notes to play, "Harry Potter" theme song:
int notes[] = {
REST, NOTE_D4, NOTE_G4, NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_D5, NOTE_C5, NOTE_A4,
NOTE_G4, NOTE_AS4, NOTE_A4, NOTE_F4, NOTE_GS4, NOTE_D4, NOTE_D4, NOTE_G4,
NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_D5, NOTE_F5, NOTE_E5, NOTE_DS5, NOTE_B4,
NOTE_DS5, NOTE_D5, NOTE_CS5, NOTE_CS4, NOTE_B4, NOTE_G4};
void setup() {
// Assign components to INPUT/OUTPUT
pinMode(ledOne, OUTPUT); // Player 1's LED
pinMode(ledTwo, OUTPUT); // Player 2's LED
pinMode(ledThree, OUTPUT); // Player 3's LED
pinMode(ledFour, OUTPUT); // Player 4's LED
pinMode(questionBOne,INPUT_PULLUP); // Player 1's Button
pinMode(questionBTwo,INPUT_PULLUP); // Player 2's Button
pinMode(questionBThree,INPUT_PULLUP); // Player 3's Button
pinMode(questionBFour, INPUT_PULLUP); // Player 4's Button
pinMode(speaker, OUTPUT); // Game speaker
pinMode(modB, INPUT_PULLUP); // Moderator's button to signal winner
pinMode(startEndB, INPUT_PULLUP); // Start/End Game Button
pinMode(newCategoryB, INPUT_PULLUP); // New Category Button
pinMode(delayBOne,INPUT_PULLUP); // Player 1's Delay Button
pinMode(delayBTwo,INPUT_PULLUP); // Player 2's Delay Button
// Set up the LCD dimensions
lcd.begin(16, 2);
// Start Serial Monitor (Keep for TinkerCAD practice)
//Serial.begin(9600);
// Set intitial LED states
digitalWrite(ledOne, ledState);
digitalWrite(ledTwo, ledState);
digitalWrite(ledThree, ledState);
digitalWrite(ledFour, ledState);
// Set up srand() & rand()
randomSeed(analogRead(0));
random();
}
void loop() {
// Run through 31 notes listed above in notes array
for(int thisNote = 0; thisNote < 31; thisNote++){
tone(speaker, notes[thisNote], 120);
// Needed in order to differentiate between notes
int pause = 220 * 1.30;
delay(pause);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Welcome to the Wizard Realm!!!");
for (int positionCounter = 0; positionCounter < 20; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(150);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Are you ready to prove your strength?");
for (int positionCounter = 0; positionCounter < 26; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(150);
}
lcd.clear();
lcd.setCursor(0,0);
bool pause = true;
while (pause) {
int startEndBState = digitalRead(startEndB);
if (startEndBState == LOW) {
pause = false;
}
}
pause = true;
lcd.clear();
lcd.setCursor(0,0);
int placementPlayer1= 0, placementPlayer2 = 0, placementPlayer3 = 0, placementPlayer4 = 0;
while (game) {
// ------------------------------- Random Category Code --------------------------------
// Pick random number between 0 and categories' size
int choice = random(6);
String category = categories[choice];
// set the cursor to column 0, line 0
// (note: line 1 is the second row, since counting begins with 0):
lcd.clear();
lcd.setCursor(0, 0);
// Print randomly chosen game category to the LCD
lcd.print(category);
delay(1000);
// ------------------------------- Start/End Game Code ---------------------------------
int startEndBState = digitalRead(startEndB);
bool pause = true;
while (pause) {
startEndBState = digitalRead(startEndB);
if (startEndBState == LOW) {
pause = false;
}
}
if(startEndBState == LOW) {
resetGame = false; // Should either be inside or outside 'startEndState' if statement
// Start game greeting/countdown
lcd.clear();
countdown();
while(resetGame != true) {
// Reset debouncer timer
lastDebounceTime = millis();
// ------------------------------- Question Button Code -----------------------------
// Read the state of each pushbutton
questionBOneState = digitalRead(questionBOne);
questionBTwoState = digitalRead(questionBTwo);
questionBThreeState = digitalRead(questionBThree);
questionBFourState = digitalRead(questionBFour);
// If any guess button is pressed
if(questionBOneState == LOW) {
tone(speaker,196,125); // Turn on the speaker
questionReaction();
delay(1000);
delayBStateOne = digitalRead(delayBOne);
pause = true;
while (pause) {
delayBStateOne = digitalRead(delayBOne);
int modBState = digitalRead(modB);
if (delayBStateOne == LOW) {
pause = false;
}
if (modBState == LOW) {
pause = false;
}
}
if(delayBStateOne == LOW) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wizard 1 Wins");
lcd.setCursor(0,1);
lcd.print("Round");
digitalWrite(ledOne, HIGH);
delay(2000);
lcd.clear();
digitalWrite(ledOne, LOW);
resetGame = true;
roundUpdate1 = random(1,3);
lcd.setCursor(0,0);
lcd.print("Wizard 1 moves");
lcd.setCursor(0,1);
lcd.print(roundUpdate1);
lcd.setCursor(2,1);
lcd.print("spaces");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
int temp = roundUpdate1 + placementPlayer1;
if (temp == 10 || temp == 26 || temp == 45) {
roundUpdate1 = -3;
}
else if (temp == 15 || temp == 28) {
roundUpdate1 = 3;
}
else if (temp == 12) {
roundUpdate1 = 7;
}
else if (temp == 33) {
roundUpdate1 = -28;
}
else if (temp == 43) {
roundUpdate1 = -6;
}
else if (temp == 56) {
roundUpdate1 = -33;
}
roundUpdate2 = 0;
roundUpdate3 = 0;
roundUpdate4 = 0;
}
}
if(questionBTwoState == LOW) {
tone(speaker,196,125); // Turn on the speaker
questionReaction();
int delayBOneState = digitalRead(delayBOne);
pause = true;
while (pause) {
delayBOneState = digitalRead(delayBOne);
int modBState = digitalRead(modB);
if (delayBOneState == LOW) {
pause = false;
}
if (modBState == LOW) {
pause = false;
}
}
if (delayBOneState == LOW) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wizard 2 Wins");
lcd.setCursor(0,1);
lcd.print("Round");
lcd.setCursor(0,0);
digitalWrite(ledTwo, HIGH);
delay(2000);
lcd.clear();
digitalWrite(ledTwo, LOW);
resetGame = true;
roundUpdate1 = 0;
roundUpdate2 = random(1,3);
lcd.setCursor(0,0);
lcd.print("Wizard 2 moves");
lcd.setCursor(0,1);
lcd.print(roundUpdate2);
lcd.setCursor(2,1);
lcd.print("spaces");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
int temp = roundUpdate2 + placementPlayer2;
if (temp == 10 || temp == 26 || temp == 45) {
roundUpdate2 = -3;
}
else if (temp == 15 || temp == 28) {
roundUpdate2 = 3;
}
else if (temp == 12) {
roundUpdate2 = 7;
}
else if (temp == 33) {
roundUpdate2 = -28;
}
else if (temp == 43) {
roundUpdate2 = -6;
}
else if (temp == 56) {
roundUpdate2 = -33;
}
roundUpdate3 = 0;
roundUpdate4 = 0;
}
}
if(questionBThreeState == LOW) {
tone(speaker,196,125); // Turn on the speaker
questionReaction();
delay(1000);
delayBStateOne = digitalRead(delayBOne);
while (pause) {
delayBStateOne = digitalRead(delayBOne);
int modBState = digitalRead(modB);
if (delayBStateOne == LOW) {
pause = false;
}
if (modBState == LOW) {
pause = false;
}
}
if(delayBStateOne == LOW){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wizard 3 Wins");
lcd.setCursor(0,1);
lcd.print("Round");
digitalWrite(ledThree, HIGH);
delay(2000);
lcd.clear();
digitalWrite(ledThree, LOW);
resetGame = true;
roundUpdate1 = 0;
roundUpdate2 = 0;
roundUpdate3 = random(1,3);
lcd.setCursor(0,0);
lcd.print("Wizard 3 moves");
lcd.setCursor(0,1);
lcd.print(roundUpdate3);
lcd.setCursor(2,1);
lcd.print("spaces");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
int temp = roundUpdate3 + placementPlayer3;
if (temp == 10 || temp == 26 || temp == 45) {
roundUpdate3 = -3;
}
else if (temp == 15 || temp == 28) {
roundUpdate3 = 3;
}
else if (temp == 12) {
roundUpdate3 = 7;
}
else if (temp == 33) {
roundUpdate3 = -28;
}
else if (temp == 43) {
roundUpdate3 = -6;
}
else if (temp == 56) {
roundUpdate3 = -33;
}
roundUpdate4 = 0;
}
}
if(questionBFourState == LOW) {
tone(speaker,196,125); // Turn on the speaker
questionReaction();
int delayBOneState = digitalRead(delayBOne);
pause = true;
while (pause) {
delayBOneState = digitalRead(delayBOne);
int modBState = digitalRead(modB);
if (delayBOneState == LOW) {
pause = false;
}
if (modBState == LOW) {
pause = false;
}
}
if (delayBOneState == LOW) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wizard 4 Wins");
lcd.setCursor(0,1);
lcd.print("Round");
lcd.setCursor(0,0);
digitalWrite(ledFour, HIGH);
delay(2000);
lcd.clear();
digitalWrite(ledFour, LOW);
resetGame = true;
roundUpdate1 = 0;
roundUpdate2 = 0;
roundUpdate3 = 0;
roundUpdate4 = random(1,3);
lcd.setCursor(0,0);
lcd.print("Wizard 4 moves");
lcd.setCursor(0,1);
lcd.print(roundUpdate4);
lcd.setCursor(2,1);
lcd.print("spaces");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
int temp = roundUpdate4 + placementPlayer4;
if (temp == 10 || temp == 26 || temp == 45) {
roundUpdate4 = -3;
}
else if (temp == 15 || temp == 28) {
roundUpdate4 = 3;
}
else if (temp == 12) {
roundUpdate4 = 7;
}
else if (temp == 33) {
roundUpdate4 = -28;
}
else if (temp == 43) {
roundUpdate4 = -6;
}
else if (temp == 56) {
roundUpdate4 = -33;
}
}
}
}
// ----------------------------- Guess button Code ----------------------------------
// If guess button is pressed...
// Call guessReaction function to activate guess sound & LEDs
void guessReaction();
// ------------------- Decide Winner & Track Player Code ------------------------
//Serial.println("Player guessed correctly");
lcd.setCursor(0, 0);
lcd.print(" Checking The Standings of the Wizards...");
for (int positionCounter = 0; positionCounter < 55; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(250);
}
delay(5000);
lcd.clear();
placementPlayer1 += roundUpdate1;
placementPlayer2 += roundUpdate2;
placementPlayer3 += roundUpdate3;
placementPlayer4 += roundUpdate4;
bool placementTrack(int placementPlayer1,int placementPlayer2,int placementPlayer3,int placementPlayer4,int roundUpdate1,int roundUpdate2,int roundUpdate3,int roundUpdate4,bool game);
game = placementTrack(placementPlayer1,placementPlayer2,placementPlayer3,placementPlayer4,roundUpdate1,roundUpdate2,roundUpdate3,roundUpdate4,game);
lcd.clear();
}
// ------------------------------- End of while loop -------------------------------
}
// ------------------------- End of startEndB state if statement ---------------------
delay(200);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("goodbye");
}
void countdown() {
delay(300);
lcd.setCursor(0, 0);
lcd.print("Ready..");
delay(300);
lcd.setCursor(10, 0);
lcd.print("Set..");
delay(300);
lcd.setCursor(7, 1);
lcd.print("Go!");
delay(300);
lcd.clear();
}
void questionReaction() {
digitalWrite(ledOne,HIGH); // Turn on Player One's LED
digitalWrite(ledTwo,HIGH); // Turn on Player Two's LED
digitalWrite(ledThree,HIGH); // Turn on Player Threes's LED
digitalWrite(ledFour,HIGH); // Turn on Player Four's LED
delay(500);
digitalWrite(ledOne,LOW); // Turn on Player One's LED
digitalWrite(ledTwo,LOW); // Turn on Player Two's LED
digitalWrite(ledThree,LOW); // Turn on Player Threes's LED
digitalWrite(ledFour,LOW); // Turn on Player Threes's LED
delay(500);
}
void guessReaction(){
tone(speaker, 396, 200); // Make buzz sound
digitalWrite(ledOne, HIGH);
digitalWrite(ledTwo, HIGH);
digitalWrite(ledThree, HIGH);
digitalWrite(ledFour, HIGH);
delay(10000);
digitalWrite(ledOne, LOW);
digitalWrite(ledTwo, LOW);
digitalWrite(ledThree, LOW);
digitalWrite(ledFour, LOW);
}
bool placementTrack(int placementPlayer1, int placementPlayer2,int placementPlayer3,int placementPlayer4,int roundUpdate1,int roundUpdate2,int roundUpdate3,int roundUpdate4, bool game) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("hey");
int oldPlacementPlayer1 = placementPlayer1;
int oldPlacementPlayer2 = placementPlayer2;
int oldPlacementPlayer3 = placementPlayer3;
int oldPlacementPlayer4 = placementPlayer4;
if (placementPlayer1 >= board) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player 1 Wins");
delay(4000);
game = false;
}
if (placementPlayer2 >= board) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player 2 Wins");
delay(4000);
game = false;
}
if (placementPlayer3 >= board) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player 3 Wins");
delay(4000);
game = false;
}
if (placementPlayer4 >= board) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player 4 Wins");
delay(4000);
game = false;
}
lcd.clear();
lcd.setCursor(0,0);
return game;
}