#include #include #include #include #include #include // Library for I2C communication #include #include #include #define BTN_1 2 #define BTN_2 3 #define BTN_3 4 #define BTN_4 5 #define BTN_5 6 #define BTN_CHECK 7 #define DATA_PIN 8 #define NUM_LEDS 5 LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); void greet_screen() { lcd.setCursor(2, 0); // Set the cursor on the third column and first row. lcd.print("Escaperoom J1P2"); // Print the string "Hello World!" lcd.setCursor(2, 1); // Set the cursor on the third column and the second row (counting starts at 0!). lcd.print(" Led puzzle"); lcd.setCursor(2, 2); lcd.print("by blonde"); } void winner_screen() { lcd.setCursor(2, 0); lcd.print("Congratulations!"); } CRGB leds[NUM_LEDS]; int pw_state[NUM_LEDS] = {0, 0, 0, 0, 0}; int correct_pw[NUM_LEDS] = {1, 1, 1, 1, 1}; void generate_password() { for(int i = 0; i < NUM_LEDS; i++){ correct_pw[i] = random(0, 5); } } void set_led_color(int led, int value){ switch (value) { case 0: leds[led] = CRGB::Blue; break; case 1: leds[led] = CRGB::Orange; break; case 2: leds[led] = CRGB::Red; break; case 3: leds[led] = CRGB::Yellow; break; case 4: leds[led] = CRGB::Green; break; default: break; } } void sync_colors(){ for(int i = 0; i < NUM_LEDS; i++){ set_led_color(i, pw_state[i]); } FastLED.show(); } bool check_pw(){ // Will return False if any led is wrong. for(int i = 0; i < NUM_LEDS; i++){ if(correct_pw[i] != pw_state[i]){ return false; } } // At this point all leds are correct! return true; } int count_wrong_leds() { int ret = 0; for(int i = 0; i < NUM_LEDS; i++){ if(correct_pw[i] != pw_state[i]){ ret = ret + 1; } } return ret; } void fout_leds() { int ret = count_wrong_leds(); lcd.clear(); lcd.setCursor(2, 0); lcd.print(String("leds correct ")); lcd.setCursor(3,1); lcd.print(String(NUM_LEDS - ret)); } void setup() { // Setup Serial monitor Serial.begin(9600); // Init LCD lcd.init(); lcd.backlight(); greet_screen(); // Init Ledstrip FastLED.setBrightness(255); FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // Setup buttons pinMode(BTN_1, INPUT_PULLUP); pinMode(BTN_2, INPUT_PULLUP); pinMode(BTN_3, INPUT_PULLUP); pinMode(BTN_4, INPUT_PULLUP); pinMode(BTN_5, INPUT_PULLUP); pinMode(BTN_CHECK, INPUT_PULLUP); fill_solid(leds, NUM_LEDS, CRGB::Black); FastLED.show(); generate_password(); } void loop() { // Get value of each button and do something if the button is pressed int start = 2; for(int i = 0; i < NUM_LEDS; i++){ int val = digitalRead(start + i); if(val == 0 ){ pw_state[i] = pw_state[i] + 1; // Value can't be higher than 4 if(pw_state[i] > 4){ pw_state[i] = 0; } delay(100); } } sync_colors(); // Check password if check button is pressed if(digitalRead(BTN_CHECK) == 0){ if(check_pw() == true){ winner_screen(); } else { fout_leds(); } } delay(1); }