#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN_NEO_PIXEL 6 // Arduino pin that connects to NeoPixel
#define NUM_PIXELS 16 // The number of LEDs (pixels) on NeoPixel
Adafruit_NeoPixel NeoPixel(NUM_PIXELS, PIN_NEO_PIXEL, NEO_GRB + NEO_KHZ800);
#define RELAY_PIN 7
#define BEEPER_PIN 8
#define ENCODER_CLK 2
#define ENCODER_DT 3
int k = 0;
int encoderPos = 0;
int lastEncoded = 0;
void setup() {
// Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BEEPER_PIN, OUTPUT);
NeoPixel.begin();
NeoPixel.clear();
NeoPixel.show(); // Initialize all pixels to 'off'
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
digitalWrite(RELAY_PIN,LOW); // Turn OFF Relay Pin Initially
}
int correctSequence[] = {3, -3, 3, -3, 3, -3, 3, -3};
int index = 0;
int last_k;
int flag = 1;
int last_index;
int success;
int j,l,t;
void loop() {
Read_Encoder();
if (k <= correctSequence[index] && k > last_k && flag == 1)
{ last_k = k;
t++;
j++;
NeoPixel.setPixelColor(j - 1, 255, 0, 0);
NeoPixel.show();
//Serial.println(t);
if (t == (NUM_PIXELS))
{
winGame();
flag = 1; j = 0;
index = 0; last_index = 0;
k = 0; last_k = 0;
success = 0;
digitalWrite(RELAY_PIN,HIGH); // Chnage of relay state at winning
}
if (k == correctSequence[index])
{
last_index = index;
success = correctSequence[index];
index++; flag = 2; k = 0; last_k = 0;
}
}
else if (k > last_k && flag == 2)
{
for (int i = NUM_PIXELS; i >= 0; i--)
{
NeoPixel.setPixelColor(i, 0, 0, 0);
NeoPixel.show();
// delay(100);
}
flag = 1; j = 0; l=0; t=0;
index = 0; last_index = 0;
k = 0; last_k = 0;
loseGame();
}
if (k >= correctSequence[index] && k < last_k && flag == 2)
{ last_k = k;
t++;
//Serial.println(t);
if (k == correctSequence[index])
{
index++;
flag = 1;
k = 0;
last_k = 0;
}
l++;
NeoPixel.setPixelColor(NUM_PIXELS - l, 255, 0, 0);
NeoPixel.show();
if (t == (NUM_PIXELS))
{
winGame();
flag = 1; j = 0;
index = 0; last_index = 0;
k = 0; last_k = 0;
success = 0;
digitalWrite(RELAY_PIN,HIGH); // Chnage of relay state at winning
}
}
else if (k < last_k && flag == 1)
{
for (int i = NUM_PIXELS; i >= 0; i--)
{
NeoPixel.setPixelColor(i, 0, 0, 0);
NeoPixel.show();
//delay(100);
}
flag = 1; j = 0; l=0; t=0;
index = 0; last_index = 0;
k = 0; last_k = 0;
loseGame();
}
}
int lastClk = LOW;
void Read_Encoder()
{
int newClk = digitalRead(ENCODER_CLK);
if (digitalRead(ENCODER_CLK) == HIGH || digitalRead(ENCODER_DT) == HIGH) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (digitalRead(ENCODER_CLK) == LOW && digitalRead(ENCODER_DT) == HIGH) {
k ++; //Serial.println(k);
delay(200);
}
if (digitalRead(ENCODER_CLK) == HIGH && digitalRead(ENCODER_DT) == LOW) {
k--; //Serial.println(k);
delay(200);
}
}
}
void turnOnLEDs(int numLEDs) {
for (int i = 0; i < NUM_PIXELS; i++) {
if (i < numLEDs) {
NeoPixel.setPixelColor(i, 255, 255, 255); // White color
} else {
NeoPixel.setPixelColor(i, 0, 0, 0); // Off
}
}
NeoPixel.show();
}
void winGame() {
digitalWrite(RELAY_PIN, HIGH); // Change relay state
playWinningSong();
delay(5000); // Pause for 5 seconds before resetting
resetGame();
}
void loseGame() {
playLosingSound();
resetGame();
}
void playWinningSong() {
tone(BEEPER_PIN, 330, 100); // E note
delay(200);
tone(BEEPER_PIN, 392, 100); // G note
delay(200);
tone(BEEPER_PIN, 440, 100); // A note
delay(200);
tone(BEEPER_PIN, 494, 100); // B note
}
void playLosingSound() {
tone(BEEPER_PIN, 294, 100); // D note
delay(200);
tone(BEEPER_PIN, 262, 100); // C note
}
void resetGame() {
digitalWrite(RELAY_PIN, LOW); // Reset relay state
encoderPos = 0;
lastEncoded = 0;
for (int i = 0; i < NUM_PIXELS; i++) {
NeoPixel.setPixelColor(i, 0, 0, 0); // Turn off all LEDs
}
NeoPixel.show();
}