/*
Forum: https://forum.arduino.cc/t/i-need-your-help-with-an-urgent-matter-friends/1425296/34
Wokwi: https://wokwi.com/projects/453227347545678849
2026/01/15
ec2021
*/
#include <Adafruit_NeoPixel.h>
constexpr uint8_t neoPixelPin {11};
constexpr uint8_t noOfPixels {30};
constexpr uint8_t brightness {200};
Adafruit_NeoPixel strip = Adafruit_NeoPixel(noOfPixels, neoPixelPin, NEO_GRB + NEO_KHZ800);
class BtnClass {
private:
byte pin;
byte state;
byte lastState;
unsigned long lastChange;
public:
init(byte p) {
pin = p;
pinMode(pin, INPUT_PULLUP);
lastState = HIGH;
}
boolean pressed() {
byte actState = digitalRead(pin);
if (actState != lastState) {
lastChange = millis();
lastState = actState;
};
if (actState != state && millis() - lastChange > 30) {
state = actState;
return !state;
}
return false;
}
};
BtnClass btnStart;
constexpr uint8_t magnetPin[] = {5, 4, 6, 3, 7, 10, 9, 8};
constexpr uint8_t noOfBars = sizeof(magnetPin) / sizeof(magnetPin[0]);
boolean barStatus[noOfBars];
constexpr uint16_t timeToMount {1500};
int level = 1;
boolean runGame = false;
boolean barsMounted = false;
void setup() {
Serial.begin(115200);
btnStart.init(A0);
strip.begin();
strip.show();
strip.setBrightness(255);
for (int i = 0; i < noOfBars; i++) {
pinMode(magnetPin[i], OUTPUT);
}
randomSeed(analogRead(A5));
setAllLightsToRed();
Serial.println("Start Gaming");
}
void loop() {
if (btnStart.pressed()) {
if (barsMounted) {
startGame();
} else {
mountBars();
}
};
if (runGame) {
doGame();
}
}
void startGame() {
Serial.println("Start Game");
for (int i = 0; i < 5; i++) {
setStripTo( 0, 0, brightness );
delay( 300 );
setStripTo( 0, 0, 0 );
delay( 500 );
}
setAllLightsToGreen();
runGame = true;
}
void doGame() {
switch (level) {
case 1:
Level1();
break;
case 2:
Level2();
break;
case 3:
Level3();
break;
}
}
void setAllLightsToGreen() {
for (int i = 0; i < noOfBars; i++) {
setLight(i, 0, 200, 0);
}
strip.show();
}
void activateBar(int no) {
setLight(no, brightness, brightness, 0);
strip.show();
digitalWrite(magnetPin[no], HIGH);
}
void releaseBar(int no) {
setLight(no, brightness, 0, 0);
strip.show();
digitalWrite(magnetPin[no], LOW);
}
void setLight(int no, uint8_t r, uint8_t g, uint8_t b) {
strip.setPixelColor(no * 4, r, g, b );
strip.setPixelColor(no * 4 + 1, r, g, b );
}
void setStripTo(uint8_t r, uint8_t g, uint8_t b) {
for (int i = 0; i < noOfPixels; i++) {
strip.setPixelColor(i, r, g, b);
}
strip.show();
}
void resetBarStatus() {
for (int i = 0; i < noOfBars; i++) {
barStatus[i] = true;
}
}
void mountBars() {
for (int i = 0; i < noOfBars; i++) {
activateBar(i);
delay(timeToMount);
}
barsMounted = true;
}
void setAllLightsToRed() {
for (int i = 0; i < noOfBars; i++) {
setLight(i, brightness, 0, 0 );
}
strip.show();
}
void Level1() {
Serial.println("Level 1");
orderedLevel(1000, 3000);
level = 2;
barsMounted = false;
}
void Level2() {
Serial.println("Level 2");
randomLevel(1000, 3000);
level = 3;
barsMounted = false;
}
void Level3() {
Serial.println("Level 3");
randomLevel(500, 5000);
level = 1;
barsMounted = false;
}
void orderedLevel(uint16_t minTime, uint16_t maxTime) {
int randomInterval;
while (runGame) {
for (int i = 0; i < noOfBars; i++) {
randomInterval = random( minTime, maxTime);
delay(randomInterval);
releaseBar(i);
}
runGame = false;
}
}
void randomLevel(uint16_t minTime, uint16_t maxTime) {
int randomBar;
int randomInterval;
int releasedBars = 0;
resetBarStatus();
while (runGame) {
randomBar = random( 0, noOfBars);
if (barStatus[randomBar]) {
randomInterval = random( minTime, maxTime );
delay(randomInterval);
releaseBar(randomBar);
barStatus[randomBar] = false;
releasedBars++;
}
runGame = (releasedBars < noOfBars);
}
}