Ithamar_code/J1P2/escaperoom_code

168 lines
3.3 KiB
Plaintext
Raw Permalink Normal View History

2023-08-25 17:35:45 +00:00
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <HardwareSerial.h>
#include <FastLED.h>
#include <Wire.h> // Library for I2C communication
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <FastLED.h>
#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<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
// FastLED.addLeds<WS2812B, DATA_PIN, GRB>(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);
}