#include <Arduino.h>
#include <U8g2lib.h>
#define JOY_PIN_X 35
#define JOY_PIN_Y 34
#define JOY_PIN_BUTTON 13
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
const char* menuItems[] = {"Sensitivity", "Filter", "Sound", "Bluetooth", "Default"};
int selectedItem = 0;
bool inMainMenu = true;
bool inSubMenu = false;
int sensitivityValue = 1;
int filterValue = 0;
int soundValue = 8;
int bluetoothValue = 0;
unsigned long lastJoyMove = 0;
unsigned long lastButtonPress = 0;
const char* bluetoothMenuItems[] = {"classic", "low"};
int bluetoothSelectedItem = 0;
bool inBluetoothMenu = false;
unsigned long lastActivityTime = millis();
bool buttonPressed = false;
// 'item_sel_outline', 128x20px
const unsigned char bitmap_item_sel_outline [] PROGMEM = {
0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
pinMode(JOY_PIN_BUTTON, INPUT_PULLUP);
Serial.begin(9600);
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr);
displayWelcomeScreen();
}
void loop() {
bool currentButtonState = digitalRead(JOY_PIN_BUTTON) == LOW;
// التحقق من حالة الزر
if (!buttonPressed && currentButtonState && millis() - lastButtonPress > 200) {
buttonPressed = true;
lastButtonPress = millis();
// الانتقال بين القوائم
if (inBluetoothMenu) {
inBluetoothMenu = false;
inMainMenu = true;
displayMainMenu();
} else if (inSubMenu) {
inSubMenu = false;
inMainMenu = true;
displayMainMenu();
} else if (inMainMenu) {
inMainMenu = false;
if (selectedItem == 3) {
inBluetoothMenu = true;
displayBluetoothMenu();
} else {
inSubMenu = true;
displaySubMenu();
}
}
lastJoyMove = millis();
} else if (!currentButtonState) {
buttonPressed = false;
}
int joyY = analogRead(JOY_PIN_Y);
int joyX = analogRead(JOY_PIN_X);
// التحكم في القائمة الرئيسية
if (inMainMenu && !inSubMenu && !inBluetoothMenu) {
if ((joyY < 1000 or joyY > 3000) && millis() - lastJoyMove > 200) {
lastJoyMove = millis();
if (joyY > 3000) {
selectedItem--;
if (selectedItem < 0) selectedItem = sizeof(menuItems) / sizeof(menuItems[0]) - 1;
} else if (joyY < 1000) {
selectedItem++;
if (selectedItem >= sizeof(menuItems) / sizeof(menuItems[0])) selectedItem = 0;
}
displayMainMenu();
}
}
// التحكم في القائمة الفرعية
if (inSubMenu && !inBluetoothMenu) {
if (selectedItem == 0) {
sensitivityValue += (joyX < 1000) ? -1 : (joyX > 3000) ? 1 : 0;
sensitivityValue = constrain(sensitivityValue, 1, 16);
} else if (selectedItem == 1) {
filterValue += (joyX < 1000) ? -1 : (joyX > 3000) ? 1 : 0;
filterValue = constrain(filterValue, 0, 40);
} else if (selectedItem == 2) {
soundValue += (joyX < 1000) ? -1 : (joyX > 3000) ? 1 : 0;
soundValue = constrain(soundValue, 0, 15);
}
displaySubMenu();
}
// التحكم في القائمة الفرعية للبلوتوث
if (inBluetoothMenu) {
if ((joyY < 1000 or joyY > 3000) && millis() - lastJoyMove > 200) {
lastJoyMove = millis();
if (joyY > 3000) {
bluetoothSelectedItem--;
if (bluetoothSelectedItem < 0) bluetoothSelectedItem = 1;
} else if (joyY < 1000) {
bluetoothSelectedItem++;
if (bluetoothSelectedItem > 1) bluetoothSelectedItem = 0;
}
displayBluetoothMenu();
}
}
if (!inSubMenu && millis() - lastJoyMove > 5000) {
inMainMenu = true;
displayWelcomeScreen();
}
}
void displayBluetoothMenu() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 12, "Bluetooth");
// عرض القائمة الفرعية للبلوتوث
for (int i = 0; i < 2; i++) {
if (i == bluetoothSelectedItem) {
// رسم الـ bitmap بجانب الخيار المحدد
u8g2.drawBitmap(0, i * 12 + 30-12 , 16, 20, bitmap_item_sel_outline);
u8g2.drawStr(12, i * 12 + 30, bluetoothMenuItems[i]);
} else {
u8g2.drawStr(12, i * 12 + 30, bluetoothMenuItems[i]);
}
}
u8g2.sendBuffer();
}
void displayWelcomeScreen() {
u8g2.clearBuffer();
u8g2.drawStr(0, 20, "Welcome!");
u8g2.sendBuffer();
lastJoyMove = millis();
}
void displayMainMenu() {
u8g2.clearBuffer();
for (int i = 0; i < sizeof(menuItems) / sizeof(menuItems[0]); i++) {
if (i == selectedItem) {
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawBitmap(0, i*12 , 16, 20, bitmap_item_sel_outline);
}else {
u8g2.setFont(u8g2_font_ncenR08_tr);
}
// u8g2.drawStr(0, i*12 + 12, (i == selectedItem) ? ">" : " ");
u8g2.drawStr(12, i*12 + 12, menuItems[i]);
if (i == 0) {
u8g2.setCursor(100, i*12 + 12);
u8g2.print(sensitivityValue);
} else if (i == 1) {
u8g2.setCursor(100, i*12 + 12);
u8g2.print(filterValue);
} else if (i == 2) {
u8g2.setCursor(100, i*12 + 12);
u8g2.print(soundValue);
}
}
u8g2.sendBuffer();
delay(150);
}
void displaySubMenu() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(50, 12, menuItems[selectedItem]);
u8g2.setCursor(64, 32);
if (selectedItem == 0) {
u8g2.clearBuffer();
u8g2.drawStr(32, 12, "Sensitivity");
u8g2.print(sensitivityValue);
} else if (selectedItem == 1) {
u8g2.clearBuffer();
u8g2.drawStr(50, 12, "Filter");
u8g2.print(filterValue);
} else if (selectedItem == 2) {
u8g2.clearBuffer();
u8g2.drawStr(50, 12, "Sound");
u8g2.print(soundValue);
}
u8g2.sendBuffer();
delay(150);
}