// Programm Taster PD5 // ESP32-S3 // Grundlage: Dannegger-Entprellung // 5 Taster / 5 Status-LEDs // 5 zusätzliche Test-LEDs // Kurzer Tastendruck: // Test-LED EIN // Langer Tastendruck: // Test-LED AUS // Taster LOW-aktiv // LED LOW-aktiv #define T1 17 #define T2 18 #define T3 3 #define T4 35 #define T5 21 // bisherige LEDs #define LED1 42 #define LED2 2 #define LED3 40 #define LED4 41 #define LED5 38 // zusätzliche Test-LEDs #define TEST1 14 #define TEST2 13 #define TEST3 10 #define TEST4 12 #define TEST5 11 const byte keyPins[5] = { T1, T2, T3, T4, T5 }; const byte ledPins[5] = { LED1, LED2, LED3, LED4, LED5 }; const byte testLED[5] = { TEST1, TEST2, TEST3, TEST4, TEST5 }; // Zeit für LONG PRESS const unsigned long LONG_TIME = 800; // Dannegger-Zustände byte keyState = 0; byte keyPress = 0; byte ct0 = 0; byte ct1 = 0; // Zeit des Tastendrucks unsigned long pressTime[5]; // LONG bereits ausgeführt? bool longDone[5]; unsigned long lastScan = 0; // -------------------------------------------------- // Taster einlesen und entprellen // -------------------------------------------------- void keyScan() { byte keys = 0; for (byte n = 0; n < 5; n++) { if (digitalRead(keyPins[n]) == LOW) keys |= (1 << n); } // Dannegger-Entprellung byte i = keyState ^ keys; ct0 = ~(ct0 & i); ct1 = ct0 ^ (ct1 & i); i &= ct0 & ct1; keyState ^= i; keyPress |= keyState & i; } // -------------------------------------------------- // SHORT PRESS // -------------------------------------------------- void kurzT1(){digitalWrite(TEST1, LOW);} void kurzT2(){digitalWrite(TEST2, LOW);} void kurzT3(){digitalWrite(TEST3, LOW);} void kurzT4(){digitalWrite(TEST4, LOW);} void kurzT5(){digitalWrite(TEST5, LOW);} // -------------------------------------------------- // LONG PRESS // -------------------------------------------------- void langT1(){ digitalWrite(TEST1, HIGH);} void langT2(){digitalWrite(TEST2, HIGH);} void langT3(){digitalWrite(TEST3, HIGH);} void langT4(){digitalWrite(TEST4, HIGH);} void langT5(){digitalWrite(TEST5, HIGH);} // Funktionen den Tastern zuordnen void (*kurz[5])() = { kurzT1, kurzT2, kurzT3, kurzT4, kurzT5 }; void (*lang[5])() = { langT1, langT2, langT3, langT4, langT5 }; // -------------------------------------------------- // SETUP // -------------------------------------------------- void setup() { for (byte n = 0; n < 5; n++) { pinMode(keyPins[n], INPUT_PULLUP); pinMode(ledPins[n], OUTPUT); digitalWrite(ledPins[n], HIGH); pinMode(testLED[n], OUTPUT); digitalWrite(testLED[n], HIGH); pressTime[n] = 0; longDone[n] = false; } } // -------------------------------------------------- // LOOP // -------------------------------------------------- void loop() { unsigned long now = millis(); // Taster alle 4 ms abfragen if (now - lastScan >= 4) { lastScan = now; keyScan(); } // Neuer Tastendruck if (keyPress) { byte keys = keyPress; keyPress = 0; for (byte n = 0; n < 5; n++) { if (keys & (1 << n)) { pressTime[n] = now; longDone[n] = false; // bisherige LED zeigt Tasterzustand digitalWrite(ledPins[n], LOW); } } } // LONG PRESS for (byte n = 0; n < 5; n++) { if ((keyState & (1 << n)) && !longDone[n] && (now - pressTime[n] >= LONG_TIME)) { lang[n](); longDone[n] = true; } } // RELEASE und SHORT PRESS for (byte n = 0; n < 5; n++) { if (!(keyState & (1 << n))) { if (pressTime[n] != 0) { // Nur wenn kein LONG PRESS erfolgte if (!longDone[n]) kurz[n](); pressTime[n] = 0; } // bisherige LED ausschalten digitalWrite(ledPins[n], HIGH); } } }