Hallo liebe Community,
Nach jahrelanger Pause bin ich kürzlich wieder in die Welt des Arduino eingetaucht und hoffe hier kann mir jemand bei einem kleinem Problem weiterhelfen ![]()
Ich bin dabei eine Menüstruktur zu erstellen welche durch eine 4x1 Membrantastatur angesteuert wird.
Das Menü sollte wie folgt arbeiten:
Menüebene 1:
-taste 1-3 aktiviert unterschiedliche Timer
-Taste 4 stoppt alle timer vorzeitig
-Taste 4 lange gedrückt wechselt zur Menüebene 2
Menüebene 2 (anzeigen der eingestellten Zeiten der Timer):
-Taste 1+2 scrollt cursor rauf und runter
-Taste 4 wechselt zur Menüebene 3
-Taste 4 lange gedrückt springt wieder zur Ebene 1 zurück
Menüebene 3 (einstellen der angezeigten Zeiten und zwar jene wo der Cursor war):
-Taste 1-2 Zeit verstellen
-Taste 4 speichern und zurück zu Ebene 3
-Taste 4 lange gedrückt zurück zur Ebene 1
Die Tasten einzulesen verwende ich die Bounce2-bibliothek. Um den langen Tastendruck zu erkennen, nutze ich die funktion „debouncedState“ welche mir zurückgeben sollte ob die Taste aktuell gedrückt ist oder nicht. Damit werte ich einen Timer aus.
Den kurzen Tastendruck werte ich über das Loslassen der Taste aus.
Nun zum Problem:
Die Menüstruktur funktioniert soweit schon mal. Das eigentliche Problem liegt an den einem Fall wo ich von Ebene 3 zurück zur 2. springen will. Wenn ich in der Ebene 3 die Taste 4 kurz betätige wechselt es zur Ebene 2 und nach einer Sekunde (erkennung langer Tastendruck) springt es ganz raus in die 1. Ebene.
Habe mir die variable aus der Funktion „debouncedState“ auf dem Lcd ausgeben lassen und bemerkt dass diese beim wechsel der Ebene auf Low „hängen“ bleibt. Aber genau des kann ich mir net erklären, die Taste wurde ja losgelassen?! Und es passiert nur in diesem Fall. Zwischen Ebene 1 und 2 funktioniert der selbe code ohne probleme.
Anbei füge ich den Ausschnitt des „menüs“ ein. Diese Routine wird vom Main-loop aufgerufen.
Aktuell besteht das Programm nur aus diesem Teil um das Problem zu finden und beheben.
Ps: mir ist bewusst dass das Menü vielleicht „komisch“ sein könnte, anderst/besser gemacht werden usw. Aber wie gesagt, bin erst wieder ‚neu‘ in dieser Welt und hab einfach mal aus eigener Logik was aufbauen wollen. Bitte steinigt mich dafür net ![]()
Auch die ganzen anderen Zeilen imenü können vernachlässigt werden. Eigentlich hab ich nur die Menüstruktur in ein neues Projekt gepackt um fehler zu beheben und daher paar sachen eingefügt oder ausgeklammert zum Testen.
Es geht rein um die Funktionen der Taste 4 und das Rumspringen ![]()
//Verarbeitung der Tastendücke
Bounce myButton1 = Bounce();
Bounce myButton2 = Bounce();
Bounce myButton3 = Bounce();
Bounce myButton4 = Bounce();
void Taster_einlesen() {
myButton1.update();
myButton2.update();
myButton3.update();
myButton4.update();
debouncedState = myButton4.read();
if (menu_ebene == 0){
if (myButton1.fallingEdge()) {
// Ventil_1_Ansteuern = 1;
lcd.setCursor(0, 0);
lcd.print("*");
startMillisV1 = millis();
}
if (myButton2.fallingEdge()) {
// Ventil_2_Ansteuern = 1;
lcd.setCursor(0, 1);
lcd.print("*");
startMillisV2 = millis();
}
if (myButton3.fallingEdge()) {
//Ventil_3_Ansteuern = 1;
lcd.setCursor(0, 2);
lcd.print("*");
startMillisV3 = millis();
}
if (myButton4.fallingEdge()) {
//STOPP = 1;
}
if (debouncedState == LOW && myButton4.currentDuration() > 1000 && taste_blockieren == 0){
menu_ebene = 1;
taste_blockieren = 1; //dient dazu nicht gleich wieder in die Funktion zu springen bevor taste losgelassen
settings_position = 0;
lcd.setCursor(0, 0);
lcd.print(">Zeit1 ");
lcd.setCursor(0, 1);
lcd.print(" Zeit2 ");
lcd.setCursor(0, 2);
lcd.print(" Zeit3 ");
}
if (myButton4.risingEdge()) {
taste_blockieren = 0;
}
}
if (menu_ebene == 1){
if (myButton1.fallingEdge()) {
if(settings_position < 2){
settings_position ++;
}
lcd.setCursor(0,settings_position);
lcd.print(">");
lcd.setCursor(0,(settings_position-1));
lcd.print(" ");
}
if (myButton2.fallingEdge()) {
if(settings_position > 0){
settings_position --;
}
lcd.setCursor(0,settings_position);
lcd.print(">");
lcd.setCursor(0,(settings_position+1));
lcd.print(" ");
}
if (myButton3.fallingEdge()) {
}
if (myButton4.fallingEdge()) {
STOPP = 1;
}
if (debouncedState == LOW && myButton4.currentDuration() > 1000 && taste_blockieren == 0){
menu_ebene = 0;
taste_blockieren = 1;
lcd.setCursor(0, 0);
lcd.print(" Ventil1");
lcd.setCursor(0, 1);
lcd.print(" Ventil2");
lcd.setCursor(0, 2);
lcd.print(" Ventil3");
}
if (myButton4.risingEdge()) {
taste_blockieren = 0;
menu_ebene = 2;
lcd.setCursor(13, settings_position);
lcd.print("-");
delay (500);
}
}
if (menu_ebene == 2){
if (myButton1.fallingEdge()) {
}
if (myButton2.fallingEdge()) {
}
if (myButton3.fallingEdge()) {
}
if (myButton4.fallingEdge()) {
}
if (debouncedState == LOW && myButton4.currentDuration() > 1000 && taste_blockieren == 0){
menu_ebene = 0;
taste_blockieren = 1;
lcd.setCursor(0, 0);
lcd.print(" Ventil1");
lcd.setCursor(0, 1);
lcd.print(" Ventil2");
lcd.setCursor(0, 2);
lcd.print(" Ventil3");
}
if (myButton4.risingEdge()) {
taste_blockieren = 0;
menu_ebene = 1;
lcd.setCursor(13, settings_position);
lcd.print("-");
delay (500);
}
}
Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken und mir kann jemand erklären wieso die erkennung des langen Tastendruck startet obwohl ich den Taster losgelassen habe (und des nur in dem einen Fall). Hab des jetzt alles schon 3 mal neu geschrieben und anderst aufgebaut aber komm einfach nicht dahinter. Vielleicht hab ich mich auch einfach irgendwo verrant und übersehe eine Kleinigkeit. Aber die Buttons werden ja bei jedem Durchlauf neu geupdatet und der Teil vom Code ist in jeder Eben der Selbe ![]()
Ich bedanke mich schon mal im Voraus. Falls es Unklarheiten oder Verbesserungsvorschläge gibt, bitte Bescheid sagen ![]()
Grüße
Simon