Panic Cube Code
Code for Sketch One:
// Pin Definitions
#include // Ensure the TM1637 library is included
const int redLEDTop = 2;
const int greenLEDTop = 3;
const int rgbRed = 5;
const int rgbGreen = 6;
const int rgbBlue = 7;
const int buzzerPin = 8;
const int buttonPin = 9;
const int potPin = A0;
const int displayClockPin = 10; // TM1637 CLK
const int displayDataPin = 11; // TM1637 DIO
const int wire1Pin = 12;
const int wire2Pin = 13;
const int wire3Pin = 4;
const int joystickXPin = A1;
const int joystickYPin = A2;
const int redLEDBottom = 15;
const int greenLEDBottom = 16;
// Variables
int timer = 300; // 5 minutes = 300 seconds
bool gameStarted = false;
bool stage1Complete = false;
bool stage2Complete = false;
bool stage3Complete = false;
int potValue = 0;
int joystickX = 0;
int joystickY = 0;
unsigned long previousMillis = 0; // for timer
const long interval = 1000; // 1 second for buzzer and countdown
bool buttonPressed = false;
// Initialize the 7-Segment Display
TM1637Display display(displayClockPin, displayDataPin);
void setup() {
// Initialize Pins
pinMode(redLEDTop, OUTPUT);
pinMode(greenLEDTop, OUTPUT);
pinMode(rgbRed, OUTPUT);
pinMode(rgbGreen, OUTPUT);
pinMode(rgbBlue, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Using internal pull-up resistor
pinMode(wire1Pin, INPUT);
pinMode(wire2Pin, INPUT);
pinMode(wire3Pin, INPUT);
pinMode(redLEDBottom, OUTPUT);
pinMode(greenLEDBottom, OUTPUT);
// Initialize Serial Monitor for debugging
Serial.begin(9600);
// Set up 7-segment display brightness
display.setBrightness(0x0f); // Max brightness
}
void loop() {
buttonPressed = digitalRead(buttonPin) == LOW;
if (buttonPressed && !gameStarted) {
gameStarted = true;
startGame();
}
if (gameStarted) {
runTimer();
runBuzzer();
}
if (gameStarted && !stage1Complete) checkStage1();
if (gameStarted && stage1Complete && !stage2Complete) checkStage2();
if (gameStarted && stage2Complete && !stage3Complete) checkWires();
if (gameStarted && stage3Complete) checkJoystick();
}
void startGame() {
display.showNumberDec(timer, false);
digitalWrite(redLEDTop, HIGH);
digitalWrite(greenLEDTop, HIGH);
analogWrite(rgbRed, 255);
analogWrite(rgbGreen, 0);
analogWrite(rgbBlue, 0);
}
void runTimer() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (timer > 0) {
timer--;
display.showNumberDec(timer, false);
}
if (timer == 0) endGame();
}
}
void runBuzzer() {
if (timer > 0) {
tone(buzzerPin, 1000);
} else {
noTone(buzzerPin);
}
}
void checkStage1() {
potValue = analogRead(potPin);
if (digitalRead(buttonPin) == LOW && potValue > 1020) {
stage1Complete = true;
digitalWrite(redLEDTop, LOW);
}
}
void checkStage2() {
potValue = analogRead(potPin);
if (potValue < 340) {
digitalWrite(greenLEDTop, HIGH);
display.showString("BLUE");
delay(500);
stage2Complete = true;
}
}
void checkWires() {
if (digitalRead(wire1Pin) == LOW || digitalRead(wire2Pin) == LOW) {
digitalWrite(redLEDTop, HIGH);
stage1Complete = false;
}
if (digitalRead(wire3Pin) == LOW) {
digitalWrite(greenLEDTop, LOW);
}
stage3Complete = true;
}
void checkJoystick() {
joystickX = analogRead(joystickXPin);
joystickY = analogRead(joystickYPin);
if (joystickX > 512 && joystickY > 512) {
digitalWrite(redLEDBottom, HIGH);
digitalWrite(greenLEDBottom, HIGH);
stopGame();
}
}
void endGame() {
noTone(buzzerPin);
display.showString("FINISH");
digitalWrite(redLEDTop, LOW);
digitalWrite(greenLEDTop, LOW);
}
void stopGame() {
display.showString("WIN");
noTone(buzzerPin);
digitalWrite(redLEDBottom, LOW);
digitalWrite(greenLEDBottom, LOW);
}
Code for Sketch Two (Serial output):
// Pin Definitions
const int redLEDTop = 2;
const int greenLEDTop = 3;
const int rgbRed = 5;
const int rgbGreen = 6;
const int rgbBlue = 7;
const int buzzerPin = 8;
const int buttonPin = 9;
const int potPin = A0;
const int displayClockPin = 10; // TM1637 CLK
const int displayDataPin = 11; // TM1637 DIO
const int wire1Pin = 12;
const int wire2Pin = 13;
const int wire3Pin = 4;
const int joystickXPin = A1;
const int joystickYPin = A2;
const int redLEDBottom = 15;
const int greenLEDBottom = 16;
// Variables
int timer = 300; // 5 minutes = 300 seconds
bool gameStarted = false;
bool stage1Complete = false;
bool stage2Complete = false;
bool stage3Complete = false;
int potValue = 0;
int joystickX = 0;
int joystickY = 0;
unsigned long previousMillis = 0; // for timer
const long interval = 1000; // 1 second for buzzer and countdown
bool buttonPressed = false;
void setup() {
// Initialize Pins
pinMode(redLEDTop, OUTPUT);
pinMode(greenLEDTop, OUTPUT);
pinMode(rgbRed, OUTPUT);
pinMode(rgbGreen, OUTPUT);
pinMode(rgbBlue, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Using internal pull-up resistor
pinMode(wire1Pin, INPUT);
pinMode(wire2Pin, INPUT);
pinMode(wire3Pin, INPUT);
pinMode(redLEDBottom, OUTPUT);
pinMode(greenLEDBottom, OUTPUT);
// Initialize Serial Monitor for debugging
Serial.begin(9600);
Serial.println("Setup complete. Waiting for button press to start the game.");
// Initialize the 7-Segment Display (using TM1637 library)
// Replace this with your actual TM1637 initialization (adjust library and code as needed)
TM1637 display(displayClockPin, displayDataPin);
display.setBrightness(0x0f); // Max brightness
}
void loop() {
// Check button press to start game
buttonPressed = digitalRead(buttonPin) == LOW;
if (buttonPressed && !gameStarted) {
gameStarted = true;
Serial.println("Game started!");
startGame();
}
// Run the countdown and beeping
if (gameStarted) {
runTimer();
runBuzzer();
}
// Check and complete Stage 1 (Button and Dial Interaction)
if (gameStarted && !stage1Complete) {
checkStage1();
}
// Check and complete Stage 2 (Dial Adjustment)
if (gameStarted && stage1Complete && !stage2Complete) {
checkStage2();
}
// Check wire cutting for Stage 3
if (gameStarted && stage2Complete && !stage3Complete) {
checkWires();
}
// Final Stage: Joystick input
if (gameStarted && stage3Complete) {
checkJoystick();
}
}
// **Start Game Function**
void startGame() {
Serial.println("Starting countdown...");
display.showNumberDec(timer, false);
digitalWrite(redLEDTop, HIGH);
digitalWrite(greenLEDTop, HIGH);
analogWrite(rgbRed, 255);
analogWrite(rgbGreen, 0);
analogWrite(rgbBlue, 0);
}
// **Countdown Timer Function**
void runTimer() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (timer > 0) {
timer--;
display.showNumberDec(timer, false);
Serial.print("Time remaining: ");
Serial.println(timer);
}
if (timer == 0) {
endGame();
}
}
}
// **Buzzer Function**
void runBuzzer() {
if (timer > 0) {
tone(buzzerPin, 1000);
} else {
noTone(buzzerPin);
}
}
// **Stage 1: Button and Dial Interaction**
void checkStage1() {
potValue = analogRead(potPin);
if (digitalRead(buttonPin) == LOW && potValue > 1020) {
stage1Complete = true;
Serial.println("Stage 1 complete!");
digitalWrite(redLEDTop, LOW);
}
}
// **Stage 2: Dial Adjustment**
void checkStage2() {
potValue = analogRead(potPin);
if (potValue < 340) {
Serial.println("Stage 2 complete! Showing BLUE.");
digitalWrite(greenLEDTop, HIGH);
display.showString("BLUE");
delay(500);
stage2Complete = true;
}
}
// **Stage 3: Wire Cutting**
void checkWires() {
if (digitalRead(wire1Pin) == LOW || digitalRead(wire2Pin) == LOW) {
Serial.println("Incorrect wire cut! Resetting Stage 1.");
digitalWrite(redLEDTop, HIGH);
stage1Complete = false;
}
if (digitalRead(wire3Pin) == LOW) {
Serial.println("Correct wire cut! Stage 3 complete.");
digitalWrite(greenLEDTop, LOW);
stage3Complete = true;
}
}
// **Final Stage: Joystick Interaction**
void checkJoystick() {
joystickX = analogRead(joystickXPin);
joystickY = analogRead(joystickYPin);
if (joystickX > 512 && joystickY > 512) {
Serial.println("Joystick correct! Game won!");
digitalWrite(redLEDBottom, HIGH);
digitalWrite(greenLEDBottom, HIGH);
stopGame();
}
}
// **End Game Function**
void endGame() {
Serial.println("Time's up! Game over.");
noTone(buzzerPin);
display.showString("FINISH");
digitalWrite(redLEDTop, LOW);
digitalWrite(greenLEDTop, LOW);
}