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);
}

  

 

Notes: