Ich habe viele Beispiele gesucht, das Forum durchwühlt und sogar ChatGPT gefragt, aber zu meinem Bedarf habe ich nicht wirklich eine funktionierende Lösung gefunden. Ich bin kein Programmierprofi, aber Anfänger auch keiner mehr... Also habe ich versucht mir das slebst zu programmieren, habe aber einen Fehler, an dem ich mir seit 2 Wochen die Zähne ausbeisse und nicht weiter komme - und bitte daher um HILFE ;-)
Was ich brauche:
Ein Menü mit 2 Seiten.
Erstes Menü hat 2 Menüpunkte ohne Editfunktion. Wähle ich Menüpunkt 1, springt man in eine Menüseite wo ich einen RTC einstellen kann (Editfunktion). Menüpunkt 2 springt ins nächste Menü mit 4 Einträgen (ohne Editfunktion). Jeder Eintrag führt auf die letzte Menüseite mit einem mehrzeiligen Untermenü in dem ich jeden Menüpunkt editieren möchte (ON/OFF, heiss/kalt, Wert einstellen 1-10 usw. und das Ganze im EEPROM speichern. Wenn jemand ein funktionierendes Beispiel dafür für mein 80x160 RGB Display hat wäre SUUUPER!
Das Problem:
Ich habe mein Menü auf das notwendigste reduziert um es hier posten zu können. Es macht prinzipjell was es machen soll (ein BUG bei der Tasterauswertung ist trotzdem vorhanden, interessierrt hier aber nicht). Menü1 hat 2 Einträge, man kann damit zu Menü2 springen und mit EXIT vom Menü 2 zu Menü 1 zurückkehren. Ist man im Menü2 kann ich 2 Werte die zu den 2 Einträgen gehören ON/OFF umschalten und speichern. Soweit OK. Wenn beide Einträge auf ON stehen und ich vom Menü1 ins Menü2 springe, wird der erste Eintrag auf OFF umgestellt und gespeichert. Genau DAS darf nicht passieren.
Ich habe den Wert MenuPage den ich als Seite definiere, beim Schalten mit dem Button (BTN_SELECT) mit Serial.printLn(menuPage) überprüft und bekomme unsinnige Ergebnisse. Nach dem Drücken ist menuPage = 0, beim nächsten Drücken springt menuPage auf 1 und erst nach weiterem Drücken von (BTN_SELECT) geht menuPage auf 2. Dann funktionier auch die Menüseite 2. Warum geht manuPage auf NULL obwohl das nirgends deiniert wird??? Oder wie kann ich dieses Phenomen beheben?
Bzw. wie bekomme ich die Menüstruktur so hin, wie ich sie brauche?
[code]
#include <UTFT.h>
#include <EEPROM.h>
// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
// Initialize display
//SDI=11 SCL=12 /CS =10 /RST=8 D/C=9
UTFT myGLCD(ST7735S_4L_80160, 11, 12, 10, 8, 9);
// Buttons (anpassen)
const int BTN_MENU = 3;
const int BTN_UP = 4;
const int BTN_DOWN = 5;
const int BTN_SELECT = 6;
int i;
bool Selecting = false;
int values[2];
String menu1Items[] = {"Menu 1-1", "Menu 1-2"};
String menu2Items[] = {"Menu 2-1", "Menu 2-2", "EXIT"};
int menuIndex = 0; // Pos im Menü nach Upload
int menuPage = 1; // Auswahl Menüseite nach Upload
int maxMenu1Items = 1; // Einträge jeder Menüseite, 1 = 2 Einträge
int maxMenu2Items = 2; // Einträge jeder Menüseite, 2 = 3 Einträge
void setup() {
// Setup the LCD
myGLCD.InitLCD(1);
myGLCD.clrScr();
myGLCD.setFont(SmallFont);
myGLCD.setColor(255, 255, 255);
pinMode(BTN_MENU, INPUT_PULLUP);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_SELECT, INPUT_PULLUP);
EEPROM.update(0, 1); // INITIALISIERUNG DES EEPROM Platzes, nach 1. Upload auskommentieren
EEPROM.update(1, 1); // INITIALISIERUNG DES EEPROM Platzes, nach 1. Upload auskommentieren
if (menuPage == 1) displayMenu1();
if (menuPage == 2) displayMenu2();
}
void loop() {
if (buttonPressed(BTN_UP)) {
if (!Selecting) {
menuIndex = (menuIndex - 1);
if (menuIndex < 0) menuIndex = 0;
if (menuPage == 1) displayMenu1();
if (menuPage == 2) displayMenu2();
} else {
values[menuIndex]++;
if (menuPage == 1) displayMenu1Select();
if (menuPage == 2) displayMenu2Select();
}
delay(200);
}
if (buttonPressed(BTN_DOWN)) {
if (!Selecting) {
menuIndex = (menuIndex + 1);
if (menuPage == 1) {
if (menuIndex > maxMenu1Items) menuIndex = maxMenu1Items;
displayMenu1();
}
if (menuPage == 2) {
if (menuIndex > maxMenu2Items) menuIndex = maxMenu2Items;
displayMenu2();
}
} else {
values[menuIndex]--;
if (menuPage == 1) displayMenu1Select();
if (menuPage == 2) displayMenu2Select();
}
delay(200);
}
if (buttonPressed(BTN_SELECT)) {
Serial.println(menuPage);
if (menuPage == 1) displayMenu1Select();
if (menuPage == 2) Selecting = !Selecting; displayMenu2Select();
delay(200);
}
}
bool buttonPressed(int pin) {
return digitalRead(pin) == LOW;
}
void displayMenu1() {
Serial.println(menuIndex);
myGLCD.setColor(255, 255, 255);
for (i = 0; i <= maxMenu1Items; ++i)
if (menuIndex == i) {
myGLCD.setColor(0, 0, 255);
myGLCD.print(menu1Items[i], 15, i * 15 + 20);
}
else {
myGLCD.setColor(255, 255, 255);
myGLCD.print(menu1Items[i], 15, i * 15 + 20);
}
}
void displayMenu1Select() {
menuPage = 2; menuIndex = 0; myGLCD.clrScr(); displayMenu2();
}
void displayMenu2() {
values[0] = EEPROM.read(0);
values[1] = EEPROM.read(1);
myGLCD.setColor(255, 255, 255);
for (i = 0; i <= maxMenu2Items; ++i) {
if (menuIndex == i) {
myGLCD.setColor(0, 0, 255);
myGLCD.print(menu2Items[i], 15, i * 15 + 20);
}
else {
myGLCD.setColor(255, 255, 255);
myGLCD.print(menu2Items[i], 15, i * 15 + 20);
}
if (i < maxMenu2Items) {
if (values[menuIndex] == 0 ) {
myGLCD.setColor(255, 0, 0);
myGLCD.print("OFF", 90, i * 15 + 20);
}
if (values[menuIndex] == 1 ) {
myGLCD.setColor(0, 255, 0);
myGLCD.print("ON ", 90, i * 15 + 20);
}
}
}
}
void displayMenu2Select() {
if (menuIndex == 0) {
values[menuIndex] = 1 - values[menuIndex];
if (values[menuIndex] == 0 ) {
myGLCD.setColor(255, 0, 0);
myGLCD.print("OFF", 90, menuIndex * 15 + 20);
}
if (values[menuIndex] == 1 ) {
myGLCD.setColor(0, 255, 0);
myGLCD.print("ON ", 90, menuIndex * 15 + 20);
}
EEPROM.update(0, values[menuIndex]);
Selecting = 0;
}
if (menuIndex == 1) {
values[menuIndex] = 1 - values[menuIndex];
if (values[menuIndex] == 0 ) {
myGLCD.setColor(255, 0, 0);
myGLCD.print("OFF", 90, menuIndex * 15 + 20);
}
if (values[menuIndex] == 1 ) {
myGLCD.setColor(0, 255, 0);
myGLCD.print("ON ", 90, menuIndex * 15 + 20);
}
EEPROM.update(1, values[menuIndex]);
Selecting = 0;
}
if (menuIndex == maxMenu2Items) {
Selecting = 0;
menuPage = 1;
menuIndex = 0;
myGLCD.clrScr();
displayMenu1();
}
}
[/code]

