#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include <ezButton.h>
#include "lcd_custom_character.h"
File file;
int book_num = 0;
int book_state = 0;
int prev_book_num = -1;
int page_num = 0, prev_page_num = -1;
String display_text = "";
ezButton next(2);
ezButton prev(3);
ezButton select_book(4);
ezButton open_book(5);
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(9600);
SD.begin();
next.setDebounceTime(50);
prev.setDebounceTime(50);
select_book.setDebounceTime(50);
open_book.setDebounceTime(50);
lcd.init();
lcd.backlight();
lcd.clear();
welcome();
animate();
}
void lcd_print(int x, int y, String message) {
lcd.setCursor(x, y);
lcd.print(message);
}
void display_char(int x, int y, int id) {
lcd.setCursor(x, y);
lcd.write(id);
}
void animate() {
lcd.createChar(0, left_stick);
lcd.createChar(1, right_stick);
lcd.createChar(2, open_eye);
lcd.createChar(3, middle_stick);
lcd.createChar(4, closed_eye);
for (int i = 0; i < 5; i++) {
display_char(11, 3, 1);
display_char(9, 3, 3);
display_char(7, 3, 0);
if (i % 2 == 0) {
display_char(8, 3, 2);
display_char(10, 3, 2);
delay(500);
}
else {
display_char(8, 3, 4);
display_char(10, 3, 4);
delay(50);
}
}
}
void welcome() {
lcd_print(1, 0, "Welcome");
delay(200);
lcd_print(8, 1, "To");
delay(200);
lcd_print(10, 2, "Digi Book");
delay(100);
}
void loop() {
next.loop();
prev.loop();
select_book.loop();
open_book.loop();
if (next.isPressed()) {
if (book_state) page_num++;
else book_num++;
}
else if (prev.isPressed()) {
if (book_state) page_num--;
else book_num--;
}
else if (select_book.isPressed()) {
book_state = 0;
prev_book_num = -1;
page_num = 0;
prev_page_num = -1;
}
else if (open_book.isPressed()) {
book_state = 1;
}
book_num = constrain(book_num, 0, 1);
if (page_num < 0) page_num = 0;
check_book();
read_book();
delay(50);
}
void check_book() {
if (prev_book_num != book_num) {
prev_book_num = book_num;
lcd.clear();
if (book_num) {
lcd_print(0, 0, "Think and Grow Rich");
}
else {
lcd_print(0, 0, "Harry Potter");
}
}
}
void read_book() {
if (book_state) {
if (book_num) file = SD.open("think.txt", FILE_READ);
else file = SD.open("harry.txt", FILE_READ);
int total_pages = file.size() / 80;
page_num = constrain(page_num, 0, total_pages);
int pointer = page_num * 80;
if (file) {
if (prev_page_num != page_num) {
prev_page_num = page_num;
file.seek(pointer);
display_text = "";
while (display_text.length() != 80) {
char data = file.read();
display_text.concat(data);
}
}
}
}
file.close();
}
void page_print() {
lcd.clear();
for (int i = 0; i < 4; i++) {
lcd_print(0, i, display_text.substring(i*20, (i+1)*20));
}
}