#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// #include <Adafruit_SH1106.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4
//Adafruit_SH1106 display(OLED_RESET);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define upButton 2
#define downButton 3
#define setButton 4
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;
int POWER=50;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(setButton, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
display.clearDisplay(); // vymazání displeje
display.setTextSize(1);
display.setTextColor(WHITE);
display.display(); // aktualizace displeje
Serial.begin(9600);
}
// ++++++++++++++ Hlavní menu ++++++++++++++++++++++++++++++++++++++++++++++++++++++
void menu0() {
int selectedMenuItem = 0;
int numMenuItems = 4;
char *menuItems[numMenuItems] = {"Item 1 - Set power", "Item 2 - Sound", "Item 3 - LED Light", "Item 4"};
while (true) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Select option:");
display.drawFastHLine(0,8,SCREEN_WIDTH,WHITE);
for (int i = 0; i < numMenuItems; i++) {
if (i == selectedMenuItem) {
display.setTextColor(BLACK, WHITE); // Invert colors for the selected item
} else {
display.setTextColor(WHITE);
}
display.setCursor(0, 18 + i * 8); // Začátek menu
display.println(menuItems[i]);
}
display.display();
// Handle button presses
if (digitalRead(upButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem > 0) {
selectedMenuItem = (selectedMenuItem + numMenuItems - 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(downButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem < numMenuItems - 1) {
selectedMenuItem = (selectedMenuItem + 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(setButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
Serial.println(selectedMenuItem);
// Do something based on the selected menu item
// For example, you can add switch-case statements here.
switch (selectedMenuItem) {
case 0:
menu1();
// // Action for Item 1
break;
case 1:
menu2();
// // Action for Item 2
break;
case 2:
menu3();
// // Action for Item 3
break;
}
lastDebounceTime = millis();
}
}
}
}
// ++++++++++++++++ MENU 1
void menu1() {
int selectedMenuItem = 0;
int numMenuItems = 3;
//char *menuItems[numMenuItems] = {"..","+ Increase power", "- Decrease power"};
char *menuItems[numMenuItems] = {"<.. Back","+ Increase power", "- Decrease power"};
while (true) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Item 1:");
display.drawFastHLine(0,8,SCREEN_WIDTH,WHITE);
display.setCursor(0, 48);
display.print("POWER:"); display.print(POWER);
for (int i = 0; i < numMenuItems; i++) {
if (i == selectedMenuItem) {
display.setTextColor(BLACK, WHITE); // Invert colors for the selected item
} else {
display.setTextColor(WHITE);
}
display.setCursor(0, 18 + i * 8); // Začátek menu
display.println(menuItems[i]);
}
display.display();
// Handle button presses
if (digitalRead(upButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem > 0) {
selectedMenuItem = (selectedMenuItem + numMenuItems - 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(downButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem < numMenuItems - 1) {
selectedMenuItem = (selectedMenuItem + 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(setButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
Serial.println(selectedMenuItem);
// Do something based on the selected menu item
// For example, you can add switch-case statements here.
switch (selectedMenuItem) {
case 0:
delay(300);
menu0();
// // Action for Item 1
break;
case 1:
POWER=POWER+1;
// Action for Item 2
break;
case 2:
POWER=POWER-1;
// Action for Item 3
break;
}
lastDebounceTime = millis();
}
}
}
}
// ++++++++++++++++ MENU 2
void menu2() {
int selectedMenuItem = 0;
int numMenuItems = 3;
//char *menuItems[numMenuItems] = {"..","+ Increase power", "- Decrease power"};
char *menuItems[numMenuItems] = {"<.. Back","Sound on", "Sound off"};
while (true) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Item 2:");
display.drawFastHLine(0,8,SCREEN_WIDTH,WHITE);
for (int i = 0; i < numMenuItems; i++) {
if (i == selectedMenuItem) {
display.setTextColor(BLACK, WHITE); // Invert colors for the selected item
} else {
display.setTextColor(WHITE);
}
display.setCursor(0, 18 + i * 8); // Začátek menu
display.println(menuItems[i]);
}
display.display();
// Handle button presses
if (digitalRead(upButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem > 0) {
selectedMenuItem = (selectedMenuItem + numMenuItems - 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(downButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem < numMenuItems - 1) {
selectedMenuItem = (selectedMenuItem + 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(setButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
Serial.println(selectedMenuItem);
// Do something based on the selected menu item
// For example, you can add switch-case statements here.
switch (selectedMenuItem) {
case 0:
delay(300);
menu0();
// // Action for Item 1
break;
case 1:
tone(6, 800);
// Action for Item 2
break;
case 2:
noTone(6);
// Action for Item 3
break;
}
lastDebounceTime = millis();
}
}
}
}
// ++++++++++++++++ MENU 3
void menu3() {
int selectedMenuItem = 0;
int numMenuItems = 3;
//char *menuItems[numMenuItems] = {"..","+ Increase power", "- Decrease power"};
char *menuItems[numMenuItems] = {"<.. Back","LED on", "LED off"};
while (true) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Item 3:");
display.drawFastHLine(0,8,SCREEN_WIDTH,WHITE);
for (int i = 0; i < numMenuItems; i++) {
if (i == selectedMenuItem) {
display.setTextColor(BLACK, WHITE); // Invert colors for the selected item
} else {
display.setTextColor(WHITE);
}
display.setCursor(0, 18 + i * 8); // Začátek menu
display.println(menuItems[i]);
}
display.display();
// Handle button presses
if (digitalRead(upButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem > 0) {
selectedMenuItem = (selectedMenuItem + numMenuItems - 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(downButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (selectedMenuItem < numMenuItems - 1) {
selectedMenuItem = (selectedMenuItem + 1) % numMenuItems;
}
lastDebounceTime = millis();
}
}
if (digitalRead(setButton) == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
Serial.println(selectedMenuItem);
// Do something based on the selected menu item
// For example, you can add switch-case statements here.
switch (selectedMenuItem) {
case 0:
delay(300);
menu0();
// // Action for Item 1
break;
case 1:
digitalWrite(LED_BUILTIN, HIGH);
// Action for Item 2
break;
case 2:
digitalWrite(LED_BUILTIN, LOW);
// Action for Item 3
break;
}
lastDebounceTime = millis();
}
}
}
}
// -----------------------------
void loop() {
menu0();
}