Ok ich habe den Code jetzt zerlegt, so das man ihn besser lesen kann
Die Buttonabfrage und die Encoderabfrage funktionieren gut,
es geht nur im diese Menüstruktur, ob man das so macht oder nicht.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,9,8,7); //Create LCD object (RS,E,DB4,DB5,DB6,DB7)
#include <rotary.h> //github.com/brianlow/Rotary
Rotary r=Rotary(3,2);
const int RotSW=4; //Pushbutton
int butState=0;
unsigned char cnt=0;
int subMenu;
int rotTurn=0;
void setup()
{pinMode(RotSW,INPUT_PULLUP);
lcd.begin(20,4);
lcd.clear();
PCICR|=(1<<PCIE2);
PCMSK2|=(1<<PCINT18)|(1<<PCINT19);
}
void loop()
{lcd.clear();
lcd.setCursor(0,0);
lcd.print("Your in the Loop");
butState=getButton(); //Read state of pushbutton
while(butState==3)
{
Main_Menu();
} //Button long press -> Menü aufrufen
delay(100);
}
void Main_Menu()
{lcd.setCursor(0,0);
lcd.print("Set Exit ");
if(cnt==1)
{
rotTurn++;
cnt=0;
if(rotTurn>1)
{
rotTurn=0;
}
} //Encoder turn right
if(cnt==2)
{rotTurn--;
cnt=0;
if(rotTurn<0)
{
rotTurn=1;
}
} //Encoder turn left
butState=getButton(); //Read state of pushbutton
switch(rotTurn)
{case 0: //In Sub_Menu() springen
lcd.setCursor(0,1);
lcd.print("--- ");
if(butState==1 && subMenu!=1)
{
subMenu=1;
Sub_Menu();
}
break;
case 1: //Menü() verlassen und in die Loop() zurückspringen
lcd.setCursor(0,1);
lcd.print(" ---- ");
if(butState==1)
{
butState=0;
loop();
} //Springt nicht zurück in die Loop()
break;
default:
break;
}
butState=3;
}
void Sub_Menu()
{lcd.setCursor(0,0);
lcd.print("Set ");
lcd.setCursor(0,1);
lcd.print(" ");
if(cnt==1)
{
rotTurn++;
cnt=0;
} //Encoder turn right
if(cnt==2)
{
rotTurn--;
cnt=0;
} //Encoder turn left
if(rotTurn<0)
{
rotTurn=255;
}
if(rotTurn>255)
{
rotTurn=0;
}
lcd.setCursor(0,1);
lcd.print("RotTurn (0-255): ");
lcd.print(rotTurn);
butState=getButton(); //Read state of pushbutton
if(butState==1)
{
butState=0;
Main_Menu();
} //Sprint nicht zurück in die Main_Menu()
while(subMenu==1)
{
delay(100);
Sub_Menu();
} //Verläßt das Sub_Menu() nach paar sekunden!
}
ISR(PCINT2_vect) //Interrupt service routine for encoder
{unsigned char result=r.process();
if(result==DIR_CW)
{
cnt=1;
}
else if(result==DIR_CCW)
{
cnt=2;
}
}
byte getButton() //Read Pushbutton with debounce
{butState=0;
unsigned long dnTime, upTime;
if(!digitalRead(RotSW))
{delay(20);
if(!digitalRead(RotSW))
{
dnTime=millis();
while(!digitalRead(RotSW));
}
upTime=(millis()-dnTime);
if(upTime>=1000) return butState=3; //Long press
else if(upTime>=400) return butState=2; //Medium press
else return butState=1; //Short click
}
return butState=0;
}