#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
static const unsigned char image_Pin_arrow_right_9x7_bits[] U8X8_PROGMEM = {0x20,0x00,0x60,0x00,0xff,0x00,0xff,0x01,0xff,0x00,0x60,0x00,0x20,0x00};
#define BUTTON_UP_PIN 4
#define BUTTON_DOWN_PIN 2
#define BUTTON_SELECT_PIN 5
class MenuItem {
private:
String name;
MenuItem* children[10];
public:
int selectedItem;
int numChildren;
int value;
String unit;
MenuItem* parent;
MenuItem(String itemName, MenuItem* itemParent) {
name = itemName;
parent = itemParent;
numChildren = 0;
selectedItem = 0;
value = 0;
unit = "";
}
void addChild(MenuItem* child) {
children[numChildren] = child;
numChildren++;
}
void display() {
u8g2.firstPage();
do {
if(numChildren>0){
//Serial.println(numChildren);
for (int i = 0; i < numChildren; i++ ){
if (i == selectedItem) {
u8g2.setFont(u8g2_font_helvR12_tr);
int8_t h = u8g2.getAscent()-u8g2.getDescent();
int8_t w = u8g2.getStrWidth(children[i]->name.c_str());
if(selectedItem < 3){
u8g2.drawRFrame(0,i*20+3, 120, h+4,3);
u8g2.setBitmapMode(1);
u8g2.drawXBMP(105, i*20+10, 9, 7, image_Pin_arrow_right_9x7_bits);
} else{
u8g2.drawRFrame(0,2*20+3, 120, h+4,3);
u8g2.setBitmapMode(1);
u8g2.drawXBMP(105, 2*20+10, 9, 7, image_Pin_arrow_right_9x7_bits);
}
} else {
u8g2.setFont(u8g2_font_helvR10_tr);
}
if(selectedItem < 3){
u8g2.drawStr(5, i*20+5, children[i]->name.c_str());
} else{
u8g2.drawStr(5, (i-selectedItem+2)*20+5, children[i]->name.c_str());
}
}
} else{
u8g2.setFont(u8g2_font_helvR12_tr);
u8g2.drawStr(10, 5, name.c_str());
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.drawStr(10, 30,"Set:");
u8g2.drawStr(118-u8g2.getStrWidth(unit.c_str())-u8g2.getStrWidth(String(value).c_str())-5, 30,String(value).c_str());
u8g2.drawStr(118-u8g2.getStrWidth(unit.c_str()), 30,unit.c_str());
int8_t h = u8g2.getAscent()-u8g2.getDescent();
u8g2.drawRFrame(0,25, 123, h+10,3);
}
} while(u8g2.nextPage());
}
int getnumChildren(){
return numChildren;
}
void setUnit(String str){
unit = str;
}
MenuItem* select() {
if(numChildren>0){
return children[selectedItem];
}
else{
return parent;
}
}
};
// Khởi tạo các menu item
MenuItem root("Root", NULL);
MenuItem menu1("Menu 1", &root);
MenuItem menu2("Menu 2", &root);
MenuItem menu3("Menu 3", &root);
MenuItem menu4("Menu 4", &root);
MenuItem menu5("Menu 5", &root);
MenuItem menu6("Menu 6", &root);
MenuItem menu7("Menu 7", &root);
MenuItem menu8("Menu 8", &root);
MenuItem menu9("Menu 9", &root);
MenuItem submenu11("Submenu 11", &menu1);
MenuItem submenu12("Submenu 12", &menu1);
MenuItem submenu13("Submenu 13", &menu1);
MenuItem submenu14("Submenu 14", &menu1);
MenuItem submenu15("Submenu 15", &menu1);
MenuItem submenu16("Submenu 16", &menu1);
MenuItem submenu21("Submenu 21", &menu2);
MenuItem submenu22("Submenu 22", &menu2);
MenuItem submenu23("Submenu 23", &menu2);
MenuItem submenu31("Submenu 31", &menu3);
MenuItem submenu32("Submenu 32", &menu3);
MenuItem submenu33("Submenu 33", &menu3);
MenuItem submenu111("Submenu 111", &submenu11);
MenuItem submenu112("Submenu 112", &submenu11);
void setup() {
// Khởi tạo màn hình OLED I2C
u8g2.begin();
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.setFontPosTop();
Serial.begin(9600);
// Thiết lập các chân nút bấm
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
// Xây dựng cây menu
root.addChild(&menu1);
root.addChild(&menu2);
root.addChild(&menu3);
root.addChild(&menu4);
root.addChild(&menu5);
root.addChild(&menu6);
root.addChild(&menu7);
root.addChild(&menu8);
root.addChild(&menu9);
menu1.addChild(&submenu11);
menu1.addChild(&submenu12);
menu1.addChild(&submenu13);
menu1.addChild(&submenu14);
menu1.addChild(&submenu15);
menu1.addChild(&submenu16);
menu2.addChild(&submenu21);
menu2.addChild(&submenu22);
menu2.addChild(&submenu23);
menu3.addChild(&submenu31);
menu3.addChild(&submenu32);
menu3.addChild(&submenu33);
submenu11.addChild(&submenu111);
submenu11.addChild(&submenu112);
// Thiet lap don vi
submenu11.unit = "rpm";
submenu12.unit = "deg";
submenu13.unit = "mm";
submenu16.unit = "Kw";
submenu21.unit = "V";
submenu22.unit = "A";
submenu23.unit = "W";
}
void loop() {
MenuItem* currentMenu = &root;
while (true) {
currentMenu->display();
//currentMenu = currentMenu->select();
if (digitalRead(BUTTON_UP_PIN) == LOW) {
if(currentMenu->getnumChildren()>0){
currentMenu->selectedItem = (currentMenu->selectedItem + 1)%currentMenu->numChildren;
}
else{
currentMenu->value+=10;
}
}
if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
//currentMenu->selectedItem = (currentMenu->selectedItem - 1 + currentMenu->numChildren)%currentMenu->numChildren;
if(currentMenu->getnumChildren()>0){
currentMenu->selectedItem = (currentMenu->selectedItem - 1)%currentMenu->numChildren;
if(currentMenu->selectedItem<0){
currentMenu->selectedItem =0;
currentMenu = currentMenu->parent;
}
} else{
currentMenu->value--;
}
}
if (digitalRead(BUTTON_SELECT_PIN) == LOW) {
currentMenu = currentMenu->select();
}
}
}