#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Eigenschaften des LCD-Displays
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// ENCODER Eingänge
#define ENCODER_CLK 4
#define ENCODER_DT 3
#define ENCODER_SW 2
// Variablen
int menu[2] = {1, 0}; // [0] - Hauptmenü, [1] - Untermenü,
bool submenu = false;
bool buttonPressed = false;
bool exitSubMenuSelected = false; // Neue Variable für "Exit" Auswahl im Untermenü
bool selectVariable = false;
// DMX-Mode Variablen
int valdmxadress = 512; // Beispiel-DMX-Adresse
bool DMXadress = false;
// Static-Mode Variablen
int staticOption = 1; // Beispiel-Option im Static-Modus
byte valRed = 25;
bool Red =false;
byte valGreen = 100;
bool Green = false;
byte valBlue = 10;
bool Blue = false;
bool increment = false;
bool decrement =false;
void setup() {
Serial.begin(250000);
// Pinmode ENCODER
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
// LCD initialisieren
lcd.init();
lcd.backlight();
intro();
updateMenu();
}
int lastClk = HIGH;
void intro() {
lcd.setCursor(1, 0);
lcd.print("HALO Traversenring");
lcd.setCursor(4, 1);
lcd.print("DA 2023/24");
lcd.setCursor(4, 2);
lcd.print("David Meyer");
lcd.setCursor(4, 3);
lcd.print("Jonas Toifl");
delay(2000);
lcd.clear();
}
void loop() {
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
if (submenu == false) {
menu[0]--;
if (menu[0] < 1) {
menu[0] = 1;
}
updateMenu();
} else if (submenu == true) {
if(selectVariable == true) {
increment = true;
updateValue();
updateMenu();
}
else if(selectVariable == false){
menu[1]--;
if (menu[0] == 1 && menu[1] < 1) {
menu[1] = 1;
} else if (menu[0] == 3 && menu[1] < 1) {
menu[1] = 1;
}
updateMenu();
}
}
}
if (newClk == LOW && dtValue == LOW) {
if (submenu == false) {
menu[0]++;
if (menu[0] > 3)
{
menu[0] = 3;
}
updateMenu();
} else if (submenu == true)
{
if(selectVariable == true) {
decrement = true;
updateValue();
updateMenu();
}
else if(selectVariable == false){
menu[1]++;
if (menu[0] == 1 && menu[1] > 3) {
menu[1] = 3;
} else if (menu[0] == 3 && menu[1] > 4) {
menu[1] = 4;
}
updateMenu();
}
}
}
}
int buttonState = digitalRead(ENCODER_SW);
if (buttonState == LOW && !buttonPressed) {
buttonPressed = true;
if (submenu == false) {
enterSubMenu();
} else if (submenu == true) {
if (menu[0] == 1 && menu[1] == 1) {
// Wenn "Exit" im Untermenü ausgewählt wird, markiere die Auswahl
exitSubMenuSelected = true;
} else if (menu[0] == 1 && menu[1] == 2) {
selectVariable = true;
DMXadress = true;
} else if (menu[0] == 3 && menu[1] == 1) {
exitSubMenuSelected = true;
} else if (menu[0] == 3 && menu[1] == 2) {
selectVariable = true;
Red = true;
} else if (menu[0] == 3 && menu[1] == 3) {
selectVariable = true;
Green = true;
} else if (menu[0] == 3 && menu[1] == 4) {
selectVariable = true;
Blue = true;
} else if (selectVariable == true && submenu == true) {
// Hier rufen Sie die Funktion auf, um aus dem "selectValue" zurückzukehren
exitSelectVariable();
} else {
executeSubMenu();
}
}
} else if (buttonState == HIGH) {
buttonPressed = false;
}
else if (buttonState == HIGH) {
buttonPressed = false;
}
// Hier prüfen, ob die "Exit" Auswahl im Untermenü ausgewählt wurde
if (exitSubMenuSelected) {
exitSubMenu();
exitSubMenuSelected = false;
}
}
void updateMenu() {
lcd.clear();
if(menu[0]==1){
switch (menu[1]){
case 0:
lcd.setCursor(0,0);
lcd.print(">DMX-Mode");
lcd.setCursor(0,1);
lcd.print(" Auto-Mode");
lcd.setCursor(0,2);
lcd.print(" Static-Mode");
break;
case 1:
lcd.setCursor(0,0);
lcd.print(">Exit");
lcd.setCursor(0,1);
lcd.print(" DMX-Adress");
lcd.setCursor(17,1);
lcd.print(valdmxadress);
lcd.setCursor(0,2);
lcd.print(" Start DMX-Mode");
break;
case 2:
lcd.setCursor(0,0);
lcd.print(" Exit");
lcd.setCursor(0,1);
lcd.print(">DMX-Adress");
lcd.setCursor(17,1);
lcd.print(valdmxadress);
lcd.setCursor(0,2);
lcd.print(" Start DMX-Mode");
break;
case 3:
lcd.setCursor(0,0);
lcd.print(" Exit");
lcd.setCursor(0,1);
lcd.print(" DMX-Adress");
lcd.setCursor(17,1);
lcd.print(valdmxadress);
lcd.setCursor(0,2);
lcd.print(">Start DMX-Mode");
break;
}
}
else if (menu[0]==2){
switch (menu[1]){
case 0:
lcd.setCursor(0,0);
lcd.print(" DMX-Mode");
lcd.setCursor(0,1);
lcd.print(">Auto-Mode");
lcd.setCursor(0,2);
lcd.print(" Static-Mode");
break;
}
}
else if (menu[0]==3){
switch (menu[1]){
case 0:
lcd.setCursor(0,0);
lcd.print(" DMX-Mode");
lcd.setCursor(0,1);
lcd.print(" Auto-Mode");
lcd.setCursor(0,2);
lcd.print(">Static-Mode");
break;
case 1:
lcd.setCursor(0,0);
lcd.print(">Exit");
lcd.setCursor(0,1);
lcd.print(" Red");
lcd.setCursor(17,1);
lcd.print(valRed);
lcd.setCursor(0,2);
lcd.print(" Green");
lcd.setCursor(17,2);
lcd.print(valGreen);
lcd.setCursor(0,3);
lcd.print(" Blue");
lcd.setCursor(17,3);
lcd.print(valBlue);
break;
case 2:
lcd.setCursor(0,0);
lcd.print(" Exit");
lcd.setCursor(0,1);
lcd.print(">Red");
lcd.setCursor(17,1);
lcd.print(valRed);
lcd.setCursor(0,2);
lcd.print(" Green");
lcd.setCursor(17,2);
lcd.print(valGreen);
lcd.setCursor(0,3);
lcd.print(" Blue");
lcd.setCursor(17,3);
lcd.print(valBlue);
break;
case 3:
lcd.setCursor(0,0);
lcd.print(" Exit");
lcd.setCursor(0,1);
lcd.print(" Red");
lcd.setCursor(17,1);
lcd.print(valRed);
lcd.setCursor(0,2);
lcd.print(">Green");
lcd.setCursor(17,2);
lcd.print(valGreen);
lcd.setCursor(0,3);
lcd.print(" Blue");
lcd.setCursor(17,3);
lcd.print(valBlue);
break;
case 4:
lcd.setCursor(0,0);
lcd.print(" Exit");
lcd.setCursor(0,1);
lcd.print(" Red");
lcd.setCursor(17,1);
lcd.print(valRed);
lcd.setCursor(0,2);
lcd.print(" Green");
lcd.setCursor(17,2);
lcd.print(valGreen);
lcd.setCursor(0,3);
lcd.print(">Blue");
lcd.setCursor(17,3);
lcd.print(valBlue);
break;
}
}
Serial.println("selectVariable =") ;
Serial.println(selectVariable);
Serial.println("submenu =");
Serial.println(submenu);
}
void enterSubMenu() {
if (menu[0] == 1) {
submenu = true;
menu[1] = 1;
} else if (menu[0] == 3) {
submenu = true;
menu[1] = 1;
}
updateMenu();
}
void exitSubMenu() {
submenu = false;
menu[0] = 1;
menu[1] = 0;
updateMenu();
}
void executeSubMenu() {
lcd.clear();
if (menu[0] == 1) {
if (menu[1] == 1) {
lcd.print("DMX-Adresse: ");
lcd.print(valdmxadress);
} else {
// Hier können Sie weitere DMX-Modus-Optionen hinzufügen
}
} else if (menu[0] == 3) {
if (menu[1] == 1) {
lcd.print("Static-Option: ");
lcd.print(staticOption);
} else {
// Hier können Sie weitere Static-Modus-Optionen hinzufügen
}
}
}
void updateValue() {
if(increment == true){
if(Red == true){
valRed++;
}
else if(Green == true){
valGreen++;
}
else if(Blue == true){
valBlue++;
}
else if(DMXadress == true){
valdmxadress++;
}
}
else if(decrement == true){
if(Red == true){
valRed--;
}
else if(Green == true){
valGreen--;
}
else if(Blue == true){
valBlue--;
}
else if(DMXadress == true){
valdmxadress--;
}
}
increment = false;
decrement = false;
}
void exitSelectVariable() {
selectVariable = false;
Red = false;
Green = false;
Blue = false;
DMXadress = false;
updateMenu();
}