#include <ezButton.h> // the library to use for SW pin
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
uint8_t CLK_PIN = 2;
uint8_t DT_PIN = 3;
uint8_t SW_PIN = 4;
uint8_t DIRECTION_CW = 0; // clockwise direction
uint8_t DIRECTION_CCW = 1; // counter-clockwise direction
volatile int counter = -1;
volatile int direction = DIRECTION_CW;
volatile unsigned long last_time; // for debouncing
int prev_counter;
ezButton button(SW_PIN); // create ezButton object that attach to pin 4
String answer_state;
String random_words[26] = { "Apple", "Bus", "Car", "Doll", /* "Eye", "FAN", "GUM", "HOME", "Icecream", "Jar", "Kite", "Lamp", "Money", "Nose", "oil", "Pencil", "Queen", "Rocket", "Sea", "Tea", "Umbrella", "Van", "Window", "X-ray", "Yoghurt", "Zoo" */ };
String animals[21] = { "Ant", "Bat", "CAT", "DOG", /* "Frog", "Goat", "Horse", "Igona", "Jaguar", "Leopard", "Monky", "Ostrish", "Panda", "Rabbit", "Tiger", "Wolf", "Yak", "Zebra"*/ };
String shapes[8] = { "CIRCLE", "TRIANGLE", "SQUARE", "RECTANGLE", /* "POLYGON", "HEART", "OVAL", "LINE" */ };
String numbers[10] = { "ONE", "TWO", "THREE", "FOUR", /* "FIVE", " SIX", " SEVEN", "EIGHT", "NINE", "TEN" */ };
String colors[11] = { "BLACK", "WHITE", "RED", "BLUE", /* "YELLOW", "ORANGE", "GREEN", "PINK", "PURPLE", "GREY", "BROWN"*/ };
String vegetables[11] = { "Broccoli", "Carrot", "Corn", "Onion", /* "Eggplant", "Cucumber", "Potato", "Tomato", "Garlic", "Cabbage" ,"Mushrooms" */ };
String word_picker;
char alphabet[26] = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
static char user_answer;
static char true_answer;
uint8_t button_group_select_0 = 7;
uint8_t button_group_select_1 = 6;
uint8_t button_group_select_2 = 5;
uint8_t group_select_0;
uint8_t group_select_1;
uint8_t group_select_2;
uint8_t current_group;
uint8_t button_pic_0 = 8;
uint8_t button_pic_1 = 9;
uint8_t button_pic_2 = 10;
uint8_t button_pic_3 = 11;
uint8_t button_pic_4 = 12;
uint8_t pic_0;
uint8_t pic_1;
uint8_t pic_2;
uint8_t pic_3;
uint8_t pic_4;
uint8_t current_pic;
uint8_t word_random = 0;
uint8_t random_char;
uint8_t verify_button = A0;
uint8_t verify_state;
uint8_t score = 0;
uint8_t tries = 7;
int program_flow = 0;
void pic_input();
void selected_word();
void game_over();
void page_1();
void intro() {
lcd.setCursor(4, 0);
lcd.print("Hello, CHAMP");
lcd.setCursor(0, 1);
lcd.print(" Welcome to");
lcd.setCursor(0, 2);
lcd.print("GUESSING LETTER GAME");
lcd.setCursor(0, 3);
lcd.print("To Start Press Enter");
}
void page_1() {
lcd.setCursor(0, 1);
lcd.print("CHOOSE THE LETTER: ");
lcd.print(user_answer);
lcd.setCursor(0, 2);
lcd.print("TRIES: ");
lcd.print(tries);
lcd.setCursor(10, 2);
lcd.print(answer_state);
lcd.setCursor(15, 2);
lcd.print(" ANS.");
lcd.setCursor(0, 3);
lcd.print("SCORE: ");
lcd.print(score);
lcd.print(" ");
}
void game_over() {
lcd.setCursor(0, 0);
lcd.print(" GAME OVER CHAMP.");
lcd.setCursor(0, 1);
lcd.print(" YOUR SCORE: ");
lcd.print(score);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" TO START NEW GAME ");
lcd.setCursor(0, 3);
lcd.print(" Press Enter ");
}
void pic_input() {
group_select_0 = digitalRead(button_group_select_0);
group_select_1 = digitalRead(button_group_select_1);
group_select_2 = digitalRead(button_group_select_2);
if (group_select_0 == 1 && group_select_1 == 1 && group_select_2 == 1) {
current_group = 0;
} else if (group_select_0 == 1 && group_select_1 == 1 && group_select_2 == 0) {
current_group = 1;
} else if (group_select_0 == 1 && group_select_1 == 0 && group_select_2 == 1) {
current_group = 2;
} else if (group_select_0 == 1 && group_select_1 == 0 && group_select_2 == 0) {
current_group = 3;
} else if (group_select_0 == 0 && group_select_1 == 1 && group_select_2 == 1) {
current_group = 4;
} else if (group_select_0 == 0 && group_select_1 == 1 && group_select_2 == 0) {
current_group = 5;
} else if (group_select_0 == 0 && group_select_1 == 0 && group_select_2 == 1) {
current_group = 6;
} else if (group_select_0 == 0 && group_select_1 == 0 && group_select_2 == 0) {
current_group = 7;
}
pic_0 = digitalRead(button_pic_0);
pic_1 = digitalRead(button_pic_1);
pic_2 = digitalRead(button_pic_2);
pic_3 = digitalRead(button_pic_3);
pic_4 = digitalRead(button_pic_4);
if (pic_0 == 1 && pic_1 == 1 && pic_2 == 1 && pic_3 == 1 && pic_4 == 1) {
current_pic = 0;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 1 && pic_3 == 1 && pic_4 == 0) {
current_pic = 1;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 1 && pic_3 == 0 && pic_4 == 1) {
current_pic = 2;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 1 && pic_3 == 0 && pic_4 == 0) {
current_pic = 3;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 0 && pic_3 == 1 && pic_4 == 1) {
current_pic = 4;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 0 && pic_3 == 1 && pic_4 == 0) {
current_pic = 5;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 0 && pic_3 == 0 && pic_4 == 1) {
current_pic = 6;
} else if (pic_0 == 1 && pic_1 == 1 && pic_2 == 0 && pic_3 == 0 && pic_4 == 0) {
current_pic = 7;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 1 && pic_3 == 1 && pic_4 == 1) {
current_pic = 8;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 1 && pic_3 == 1 && pic_4 == 0) {
current_pic = 9;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 1 && pic_3 == 0 && pic_4 == 1) {
current_pic = 10;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 1 && pic_3 == 0 && pic_4 == 0) {
current_pic = 11;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 0 && pic_3 == 1 && pic_4 == 1) {
current_pic = 12;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 0 && pic_3 == 1 && pic_4 == 0) {
current_pic = 13;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 0 && pic_3 == 0 && pic_4 == 1) {
current_pic = 14;
} else if (pic_0 == 1 && pic_1 == 0 && pic_2 == 0 && pic_3 == 0 && pic_4 == 0) {
current_pic = 15;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 1 && pic_3 == 1 && pic_4 == 1) {
current_pic = 16;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 1 && pic_3 == 1 && pic_4 == 0) {
current_pic = 17;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 1 && pic_3 == 0 && pic_4 == 1) {
current_pic = 18;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 1 && pic_3 == 0 && pic_4 == 0) {
current_pic = 19;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 0 && pic_3 == 1 && pic_4 == 1) {
current_pic = 20;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 0 && pic_3 == 1 && pic_4 == 0) {
current_pic = 21;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 0 && pic_3 == 0 && pic_4 == 1) {
current_pic = 22;
} else if (pic_0 == 0 && pic_1 == 1 && pic_2 == 0 && pic_3 == 0 && pic_4 == 0) {
current_pic = 23;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 1 && pic_3 == 1 && pic_4 == 1) {
current_pic = 24;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 1 && pic_3 == 1 && pic_4 == 0) {
current_pic = 25;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 1 && pic_3 == 0 && pic_4 == 1) {
current_pic = 26;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 1 && pic_3 == 0 && pic_4 == 0) {
current_pic = 27;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 0 && pic_3 == 1 && pic_4 == 1) {
current_pic = 28;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 0 && pic_3 == 1 && pic_4 == 0) {
current_pic = 29;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 0 && pic_3 == 0 && pic_4 == 1) {
current_pic = 30;
} else if (pic_0 == 0 && pic_1 == 0 && pic_2 == 0 && pic_3 == 0 && pic_4 == 0) {
current_pic = 31;
}
}
void selected_word() {
switch (current_group) {
case 1:
word_picker = random_words[current_pic];
break;
case 2:
word_picker = animals[current_pic];
break;
case 3:
word_picker = shapes[current_pic];
break;
case 4:
word_picker = numbers[current_pic];
break;
case 5:
word_picker = colors[current_pic];
break;
case 6:
word_picker = vegetables[current_pic];
break;
default:
word_picker = "___";
break;
}
if (current_group > 0 && current_group < 7) {
word_picker.toUpperCase();
random_char = random(0, word_picker.length());
true_answer = word_picker[random_char];
lcd.clear();
lcd.setCursor(0, 0);
//lcd.print("COMPLET THE WORD");
for (uint8_t i = 0; i < word_picker.length(); i++) {
if (i == random_char) {
Serial.print("...");
//lcd.setCursor(1, 2);
lcd.print("_");
continue;
}
Serial.print(word_picker[i]);
lcd.print(word_picker[i]);
}
} else {
Serial.println(word_picker);
lcd.print(word_picker);
}
Serial.println(" ");
page_1();
}
void ISR_encoderChange() {
if (digitalRead(CLK_PIN) == 0) {
if ((millis() - last_time) < 50) // debounce time is 50ms
return;
if (digitalRead(DT_PIN) == HIGH) {
// the encoder is rotating in counter-clockwise direction => decrease the counter
if (counter <= 1) {
counter = 0;
user_answer = alphabet[counter];
Serial.println(user_answer);
lcd.setCursor(19, 1);
lcd.print(user_answer);
} else {
counter--;
user_answer = alphabet[counter];
Serial.println(user_answer);
lcd.setCursor(19, 1);
lcd.print(user_answer);
direction = DIRECTION_CCW;
}
} else {
// the encoder is rotating in clockwise direction => increase the counter
if (counter >= 25) {
counter = 25;
user_answer = alphabet[counter];
Serial.println(user_answer);
lcd.setCursor(19, 1);
lcd.print(user_answer);
} else {
counter++;
user_answer = alphabet[counter];
Serial.println(user_answer);
lcd.setCursor(19, 1);
lcd.print(user_answer);
direction = DIRECTION_CW;
}
}
last_time = millis();
}
}
void verfication() {
if (button.isPressed()) {
if (user_answer == true_answer) {
answer_state = "RIGHT";
score ++ ;
page_1 () ;
if (score % 100 == 0) {
tries += 1;
} else {
tries = tries;
}
Serial.print("tries:");
Serial.println(tries);
} else {
answer_state = "WRONG";
Serial.println("WRONG Answer");
if (tries == 0) {
Serial.print("Score:");
Serial.println(score);
Serial.println("GAME OVER");
lcd.clear();
program_flow = 4;
} else {
tries -= 1;
score = score;
Serial.print("Score:");
Serial.println(score);
page_1 () ;
program_flow += 1;
}
Serial.print("tries:");
Serial.println(tries);
}
} else {
ISR_encoderChange();
}
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(button_group_select_0, INPUT_PULLUP);
pinMode(button_group_select_1, INPUT_PULLUP);
pinMode(button_group_select_2, INPUT_PULLUP);
pinMode(button_pic_0, INPUT_PULLUP);
pinMode(button_pic_1, INPUT_PULLUP);
pinMode(button_pic_2, INPUT_PULLUP);
pinMode(button_pic_3, INPUT_PULLUP);
pinMode(button_pic_4, INPUT_PULLUP);
pinMode(verify_button, INPUT_PULLUP);
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
button.setDebounceTime(50); // set debounce time to 50 milliseconds
}
void loop() {
button.loop(); // MUST call the loop() function first
verify_state = digitalRead(verify_button);
if (verify_state == LOW) {
program_flow += 1;
lcd.clear();
delay(250);
}
if (program_flow % 5 == 0) {
intro();
score = 0;
tries = 7;
} else if (program_flow % 5 == 1) {
pic_input();
selected_word();
program_flow += 1;
delay(50);
} else if (program_flow % 5 == 2) {
verfication();
} else if (program_flow % 5 == 3) {
program_flow = 1;
} else if (program_flow == 4) {
game_over();
}
}