Hallo Zusammen,
ich bin noch Einsteiner im Programmieren, hab aber trotzdem versucht mithilfe von Wokwi eine umfassende, aber leicht verständliche und ausbaubare Menüstruktur aufzubauen.
Die Menüführung läuft soweit zufriedenstellend, wenn es auch eventuell nicht den Gepflogenheiten einer sauberen Programmierung entspricht.
Also bitte nicht steinigen, ich bin schon froh soweit gekommen zu sein!
Womit ich allerdings kämpfe ist das Löschen des Displays beim Menüwechsel.
Angefangen hab ich mit tft.FillScreen, das läuft allerdings langsam, da ja das gesamte Display überschrieben wird.
Bei meiner Recherche bin ich dann darauf gestoßen, dass man besser nur die Schrift auf die Hintergrundfarbe ändert.
Aber leider will das einfach nicht klappen.
Bitte daher um eure Hilfe wo der Fehler liegt.
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 7
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
const int buttonUpPin = 2;
const int buttonDownPin = 3;
const int buttonConfirmPin = 4;
const int buttonMainmenuPin =5;
bool isButtonPressed(int pin) {
return digitalRead(pin) == LOW;
}
int selectedMenu = 1;
int selectedItem = 1;
int numItemsInMenu = 2;
unsigned long timeoutMillis = 0;
bool timeout = false;
bool actionRunning = false;
void setup() {
pinMode(buttonUpPin, INPUT_PULLUP);
pinMode(buttonDownPin, INPUT_PULLUP);
pinMode(buttonConfirmPin, INPUT_PULLUP);
pinMode(buttonMainmenuPin, INPUT_PULLUP);
tft.begin();
tft.fillScreen(ILI9341_BLACK);
//tft.setRotation(3);
displayMenu();
timeout = false;
timeoutMillis = millis();
actionRunning = false;
}
void loop() {
handleMenuNavigation();
checkTimeout();
}
void handleMenuNavigation() {
// Menünavigation mit den Tasten
if (isButtonPressed(buttonUpPin) && !actionRunning) {
selectedItem = (selectedItem == 1) ? numItemsInMenu : selectedItem - 1;
displayMenu();
timeoutMillis = millis(); // Zurücksetzen des millis-Zählers
delay(200);
}
if (isButtonPressed(buttonDownPin) && !actionRunning) {
selectedItem = (selectedItem == numItemsInMenu) ? 1 : selectedItem + 1;
displayMenu();
timeoutMillis = millis(); // Zurücksetzen des millis-Zählers
delay(200);
}
// Zurück zum Hauptmenü
if (isButtonPressed(buttonMainmenuPin)) {
backToMainMenu();
timeoutMillis = millis(); // Zurücksetzen des millis-Zählers
delay(200);
}
// Bestätigung des ausgewählten Menüpunkts
if (isButtonPressed(buttonConfirmPin)) {
clear_lcd();
timeoutMillis = millis(); // Zurücksetzen des millis-Zählers
actionMenu(selectedMenu, selectedItem);
}
}
void checkTimeout() {
// Prüfen, ob timeout aktiv und 10 Sekunden vergangen sind
if (!timeout && millis() - timeoutMillis >= 10000) {
actionMenu(2, 1); // actionMenu21 ausführen
}
}
void handleMenuAction(int nextMenu, int itemsInMenu) {
// Menüwechsel und Anzeige
selectedMenu = nextMenu;
selectedItem = 1;
numItemsInMenu = itemsInMenu;
displayMenu();
timeout = false;
}
void actionMenu(int menu, int item) {
// Aktionen für jedes Menü und Menüpunkt
switch(menu) {
case 1:
switch(item) {
case 1:
handleMenuAction(2, 2); // Zum Menü 2 mit 2 Punkten wechseln
break;
case 2:
handleMenuAction(3, 3); // Zum Menü 3 mit 3 Punkten wechseln
break;
}
break;
case 2:
switch(item) {
case 1:
clear_lcd();
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setTextSize(2);
tft.setCursor(10, 50);
tft.println("Messen...");
timeout = true;
actionRunning = true;
break;
case 2:
actionRunning = false;
timeout = false;
backToMainMenu();
break;
}
break;
case 3:
switch(item) {
case 1:
case 2:
case 3:
actionRunning = false;
timeout = false;
backToMainMenu();
break;
}
break;
}
}
void backToMainMenu() {
// Zurück zum Hauptmenü
clear_lcd();
selectedMenu = 1;
selectedItem = 1;
numItemsInMenu = 2;
displayMenu();
timeout = false;
actionRunning = false;
}
void displayMenu() {
// Anzeige des aktuellen Menüs
if (selectedMenu == 1) {
printMenuItem("Messen", 10, 50, 1);
printMenuItem("Kalibrieren", 10, 100, 2);
} else if (selectedMenu == 2) {
printMenuItem("pH/ORP Messung",10, 50, 1);
printMenuItem("zurück", 10, 100, 2);
} else if (selectedMenu == 3) {
printMenuItem("pH", 10, 50, 1);
printMenuItem("ORP", 10, 100, 2);
printMenuItem("zurück", 10, 150, 3);
}
}
void printMenuItem(const char *item, int x, int y, int index) {
// Anzeige eines Menüpunkts
if (selectedItem == index) {
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
} else {
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
}
tft.setTextSize(2);
tft.setCursor(x, y);
tft.println(item);
}
void clear_lcd() {
//tft.setTextColor(ILI9341_BLACK, ILI9341_BLACK);
tft.fillScreen(ILI9341_BLACK);
}