#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BUTTON_UP 2
#define BUTTON_DOWN 3
#define BUTTON_SELECT 4
enum Menu {
TEMPERATURE,
VOLUME,
LIGHTS,
BATTERY,
DIFFICULTY
};
Menu currentMenu = TEMPERATURE;
int selectedItem = 0;
int lightsState[4] = {0, 0, 0, 0}; // 0 - off, 1 - on
int volumeLevel = 50; // Initial volume level
int batteryPercentage = 76; // Example battery percentage
int batteryMode = 0; // 0 for battery save mode, 1 for performance mode
unsigned long debounceDelay = 50;
unsigned long lastDebounceTime = 0;
bool buttonHeld = false;
bool inSubMenu = false;
void displayTemperatureScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Temperature:");
float temperature = random(200, 300) / 10.0; // Simulated temperature reading (20.0 - 30.0)
display.print(temperature);
display.println("C");
display.display();
}
void displayVolumeScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Volume:");
display.print(volumeLevel);
display.println("%");
display.display();
}
void displayLightsScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Lights:");
for (int i = 0; i < 4; i++) {
display.print("Light ");
display.print(char('A' + i));
display.print(": ");
display.println(lightsState[i] ? "On" : "Off");
}
display.display();
}
void displayBatteryScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Battery:");
display.print(batteryPercentage);
display.println("%");
display.println("Battery Mode:");
if (batteryMode == 0) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Highlight the active mode
display.println("Battery Save");
display.setTextColor(SSD1306_WHITE);
display.println("Performance");
} else {
display.println("Battery Save");
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Highlight the active mode
display.println("Performance");
display.setTextColor(SSD1306_WHITE);
}
display.display();
}
void displayDifficultyScreen() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Difficulty:");
for (int i = 0; i < 3; i++) {
if (i == selectedItem) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Highlight the selected difficulty
} else {
display.setTextColor(SSD1306_WHITE);
}
switch (i) {
case 0:
display.println("Easy");
break;
case 1:
display.println("Normal");
break;
case 2:
display.println("Hard");
break;
}
}
display.display();
}
void displayMenu(int start) {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.println("Menu:");
for (int i = start; i < start + 3; i++) {
if (i == selectedItem) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Highlight the selected item
} else {
display.setTextColor(SSD1306_WHITE);
}
switch (i) {
case TEMPERATURE:
display.println("Temperature");
break;
case VOLUME:
display.println("Volume");
break;
case LIGHTS:
display.println("Lights");
break;
case BATTERY:
display.println("Battery");
break;
case DIFFICULTY:
display.println("Difficulty");
break;
}
}
display.display();
}
void setup() {
Wire.begin();
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_SELECT, INPUT_PULLUP);
displayMenu(0); // Display the initial menu
}
void loop() {
int upState = digitalRead(BUTTON_UP);
int downState = digitalRead(BUTTON_DOWN);
int selectState = digitalRead(BUTTON_SELECT);
if (upState == LOW && !inSubMenu) {
selectedItem = max(0, selectedItem - 1);
displayMenu(selectedItem > 1 ? selectedItem - 1 : 0); // Update the menu display
delay(250); // Button delay to prevent rapid changes
}
if (downState == LOW && !inSubMenu) {
selectedItem = min(4, selectedItem + 1);
displayMenu(selectedItem > 1 ? selectedItem - 1 : 0); // Update the menu display
delay(250); // Button delay to prevent rapid changes
}
if (selectState == LOW) {
if (!inSubMenu) {
switch (selectedItem) {
case TEMPERATURE:
displayTemperatureScreen();
break;
case VOLUME:
displayVolumeScreen();
inSubMenu = true;
break;
case LIGHTS:
displayLightsScreen();
break;
case BATTERY:
displayBatteryScreen();
break;
case DIFFICULTY:
displayDifficultyScreen();
break;
}
delay(500); // Button delay to prevent rapid changes
} else { // Inside a submenu
if (selectedItem == VOLUME) {
if (upState == LOW) {
volumeLevel = min(100, volumeLevel + 1);
displayVolumeScreen();
delay(250);
}
if (downState == LOW) {
volumeLevel = max(0, volumeLevel - 1);
displayVolumeScreen();
delay(250);
}
}
}
} else {
inSubMenu = false; // Reset submenu state if SELECT button is released
}
}