Hallo Zusammen,
ich bin gerade an meinem ersten Arduino-Projekt dran. Ich habe eine Espresso-Maschine und eine Bluetooth-Waage. Die Espresso kann man via Pullup anzapfen - Das ist mein Plan.
Die Programm-Logic bekomme ich hin, woran ich gerade scheitere ist ein gescheites Menü, konkret frage ich mich wie ich am geschicktesten durchs Menü navigieren kann (Mit einem Rotary Encoder).
U8g2 liegt im "loop()" block und iteriert sich unendlich. Die angegebenen Werte kann ich dynamisch anpassen, sodass die u8g2 library diese dann ändert. Wenn ich den Menüpunkt aktivieren möchte, habe ich eine Variable gesetzt, die dann den wert "current_screen" anpasst und somit ins untermenü springt. Wenn ich dort jetzt aber eine Abfrage zum setzen der Gramm-Anzahl habe bin ich überfordert wie ich dies anstellen soll.
Habt ihr Tipps, Buzzwords etc nach denen ich Googeln kann? Mir fällt tatsächlich nichts mehr ein.
Danke!
/*
1 Shot Gramm --> 45 | Angabe des Gewichts in Gramm für einen Single-Shot
2 Shot Gramm --> 22,5 | Angabe des Gewichts in Gramm für einen Duo-Shot
BLE-Mac -> 00:12:12:12:12: | Angabe der MAC-Addresse für die Bluetooth-Verbindung
Clean --> Reinigungsroutine
Info: -->
*/
#include <U8g2lib.h>
#include <AiEsp32RotaryEncoder.h>
#include <Wire.h>
// Setup Display
U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);
// Pins for Rotary Encoder
#define ROTARY_ENCODER_A_PIN 25
#define ROTARY_ENCODER_B_PIN 26
#define ROTARY_ENCODER_BUTTON_PIN 27
#define ROTARY_ENCODER_VCC_PIN -1
#define ROTARY_ENCODER_STEPS 4
// Variables Declaration
const int NUM_ITEMS = 5; // number of items in the list and also the number of screenshots and screenshots with QR codes (other screens)
const int MAX_ITEM_LENGTH = 20; // maximum characters for the item name
char menu_items[NUM_ITEMS][MAX_ITEM_LENGTH] = { // array with item names
{ "1 Shot gramm" },
{ "2 Shot gramm" },
{ "BLE-Mac" },
{ "Clean" },
{ "Info" }
};
int item_selected = 0; // which item in the menu is selected
int item_sel_previous; // previous item - used in the menu screen to draw the item before the selected one
int item_sel_next; // next item - used in the menu screen to draw next item after the selected one
int current_screen = 1; // 0 - Dashboard, 1 = Menu, 2 = 1Shot ...
AiEsp32RotaryEncoder rotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN, ROTARY_ENCODER_STEPS);
// Menüeinstellungen
void IRAM_ATTR readEncoderISR() {
rotaryEncoder.readEncoder_ISR();
}
void setup() {
// Serial Begin
Serial.begin(115200);
// Init Display
oled.begin();
// init Rotary Encoder
rotaryEncoder.begin();
rotaryEncoder.setup(readEncoderISR);
rotaryEncoder.setBoundaries(0, NUM_ITEMS - 1, false);
}
void loop() {
//Switch Menu Rotary Encoder
if (rotaryEncoder.encoderChanged()) {
item_selected = rotaryEncoder.readEncoder();
if (item_selected < 0) item_selected = NUM_ITEMS - 1;
if (item_selected >= NUM_ITEMS) item_selected = 0;
}
if (rotaryEncoder.isEncoderButtonClicked()) {
rotary_onButtonClick(item_selected);
} else if (rotaryEncoder.isEncoderButtonClicked() && current_screen == 4) {
rotary_onButtonClick(1);
}
Serial.println(rotaryEncoder.readEncoder());
// set correct values for the previous and next items
item_sel_previous = item_selected - 1;
if (item_sel_previous < 0) { item_sel_previous = NUM_ITEMS - 1; } // previous item would be below first = make it the last
item_sel_next = item_selected + 1;
if (item_sel_next >= NUM_ITEMS) { item_sel_next = 0; } // next item would be after last = make it the first
if (current_screen == 1) {
MenuContent();
} else if (current_screen == 2) {
OneShotContent();
} else if (current_screen == 3) {
TwoShotContent();
} else if (current_screen == 4) {
InfoContent();
}
delay(50);
}
}
void MenuContent() {
oled.firstPage();
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(20, 10, menu_items[item_sel_previous]);
oled.drawStr(20, 25, menu_items[item_selected]);
oled.drawStr(20, 40, menu_items[item_sel_next]);
} while (oled.nextPage());
}
void OneShotContent() {
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(5, 15, "1 Shot");
} while (oled.nextPage());
}
void TwoShotContent() {
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(5, 15, "2 Shot");
} while (oled.nextPage());
}
void BLEMACContent() {
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(5, 15, "BLE-MAC");
} while (oled.nextPage());
}
void CleanContent() {
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(5, 15, "Clean");
} while (oled.nextPage());
}
void InfoContent() {
oled.firstPage();
do {
oled.setFont(u8g2_font_9x15_tf);
oled.drawStr(5, 15, "Info");
} while (oled.nextPage());
}
void rotary_onButtonClick(int page) {
current_screen = page;
}