#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#define DT_PIN 13
#define CLK_PIN 9
#define BUTTON_PIN 7
#define MENU_LENGTH 4
Encoder encoder(DT_PIN, CLK_PIN);
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
byte logo_left[] = {
B00111,
B01000,
B01001,
B01010,
B01010,
B01001,
B01000,
B00111
};
byte logo_right[] = {
B11100,
B00010,
B10010,
B01010,
B01010,
B10010,
B00010,
B11100
};
byte particlesl[] = {
B00000,
B00111,
B00000,
B01111,
B11111,
B00000,
B00111,
B00000
};
byte particlesr[] = {
B00000,
B11100,
B00000,
B11110,
B11111,
B00000,
B11100,
B00000
};
byte s[] = {
B10000,
B01111,
B01111,
B10001,
B11110,
B11110,
B00001,
B11111
};
byte t[] = {
B00000,
B11011,
B11011,
B11011,
B11011,
B11011,
B11011,
B11111
};
byte a[] = {
B10001,
B01110,
B01110,
B01110,
B00000,
B01110,
B01110,
B11111
};
byte d[] = {
B00011,
B01101,
B01110,
B01110,
B01110,
B01101,
B00011,
B11111
};
byte m[] = {
B01110,
B00100,
B01010,
B01010,
B01110,
B01110,
B01110,
B11111
};
byte p[] = {
B01110,
B00100,
B01010,
B01010,
B01110,
B01110,
B01110,
B11111
};
byte r[] = {
B00001,
B01110,
B01110,
B00001,
B01011,
B01101,
B01110,
B11111
};
byte i[] = {
B10001,
B11011,
B11011,
B11011,
B11011,
B11011,
B11011,
B10001
};
byte o[] = {
B10001,
B01110,
B01110,
B01110,
B01110,
B01110,
B10001,
B11111
};
int lastEncoderValue = 0;
int lastButtonState = LOW;
int currentMenu = 0;
int lastMenu = -1;
bool isMenuSelected = false;
void setup(){
lcd.init();
lcd.backlight();
lcd.createChar(0, logo_left);
lcd.createChar(1, logo_right);
lcd.createChar(2, particlesl);
lcd.createChar(3, particlesr);
lcd.createChar(4, s);
lcd.createChar(5, t);
lcd.createChar(6, a);
lcd.createChar(7, d);
lcd.createChar(8, m);
lcd.createChar(9, p);
lcd.createChar(10, r);
lcd.createChar(11, i);
lcd.createChar(12, o);
lcd.setCursor(6,0);
lcd.print("CARREGANDO");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING.");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING..");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING...");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING.");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING..");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING...");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING.");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING..");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(6,0);
lcd.print("LOADING...");
lcd.setCursor(4,1);
lcd.print("pip-boy 4000");
lcd.setCursor(8,3);
lcd.write(2);
lcd.setCursor(9,3);
lcd.write(0);
lcd.setCursor(10,3);
lcd.write(1);
lcd.setCursor(11,3);
lcd.write(3);
delay(1000);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("WELCOME BACK");
lcd.setCursor(6,3);
lcd.print("Patrick");
delay(1000);
lcd.clear();
}
void loop() {
int buttonState = !digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState && buttonState == HIGH) {
isMenuSelected = !isMenuSelected;
if (isMenuSelected) {
selectMenu(currentMenu);
lastMenu = 0;
} else {
lastEncoderValue = 0;
encoder.write(lastEncoderValue);
}
delay(200);
}
lastButtonState = buttonState;
if (isMenuSelected) {
return;
}
currentMenu = constrainMenu(currentMenu + readDelta());
if (currentMenu != lastMenu) {
showMenu(currentMenu);
lastMenu = currentMenu;
}
}
int readDelta() {
int value = encoder.read() / 4;
int delta = value - lastEncoderValue;
lastEncoderValue = value;
return delta;
}
int constrainMenu(int value) {
return value - MENU_LENGTH * floor((float) value / MENU_LENGTH);
}
void printCentered(String text, int row) {
lcd.setCursor((16 - text.length()) / 2, row);
lcd.print(text);
}
void showMenu(int menu) {
lcd.clear();
printCentered("MENU", 0);
switch (menu) {
case 0: lcd.setCursor(0,0),lcd.write((byte)4),lcd.write((byte)5),lcd.write((byte)6),lcd.write((byte)5),lcd.print(" DATA MAP RADIO"); break;
case 1: lcd.setCursor(0,1),lcd.print("1"),lcd.setCursor(2,1),lcd.write((byte)2),lcd.print(" 3 4 5"); break;
case 2: lcd.setCursor(0,1),lcd.print("1 2"),lcd.setCursor(4,1),lcd.write((byte)3),lcd.print(" 4 5"); break;
case 3: lcd.setCursor(0,1),lcd.print("1 2 3"),lcd.setCursor(6,1),lcd.write((byte)4),lcd.print(" 5"); break;
}
}
void selectMenu(int menu) {
lcd.clear();
printCentered("Hai scelto:", 0);
switch (menu) {
case 0: printCentered("Stats", 1); break;
case 1: printCentered("opzione 2", 1); break;
case 2: printCentered("opzione 3", 1); break;
case 3: printCentered("opzione 4", 1); break;
}
}