#include <Arduino.h>
// Pin-Definitionen
#define TASTERPIN 2 // Taster für Inkrement (Interrupt 0)
#define RESET_TASTERPIN 3 // Taster für Reset (Interrupt 1)
#define LED_PIN_0 9 // LSB (Bit 0)
#define LED_PIN_1 8 // Bit 1
#define LED_PIN_2 7 // Bit 2
#define LED_PIN_3 6 // MSB (Bit 3)
#define DEBOUNCE_DELAY 150 // Entprellzeit in Millisekunden
// Globale Variablen
volatile bool incrementRequest = false; // Signal für Inkrement-Anforderung
volatile bool resetRequest = false; // Signal für Reset-Anforderung
volatile unsigned long lastDebounceTimeIncrement = 0; // Zeitstempel für Entprellung Inkrement-Taster
volatile unsigned long lastDebounceTimeReset = 0; // Zeitstempel für Entprellung Reset-Taster
byte counter = 0; // Zähler (0-15), speichert aktuellen Stand
// Funktion zur Aktualisierung der LEDs basierend auf dem Zählerwert
void updateLEDs(byte value) {
// Setze jede LED entsprechend ihres Bits im Wert (LSB zuerst)
digitalWrite(LED_PIN_0, value & 0x01); // Bit 0 (LSB)
digitalWrite(LED_PIN_1, (value >> 1) & 0x01); // Bit 1
digitalWrite(LED_PIN_2, (value >> 2) & 0x01); // Bit 2
digitalWrite(LED_PIN_3, (value >> 3) & 0x01); // Bit 3 (MSB)
// Gib Binärdarstellung und Dezimalwert über serielle Schnittstelle aus
Serial.print("LED-Zustand: ");
Serial.print((value >> 3) & 0x01); // MSB
Serial.print((value >> 2) & 0x01);
Serial.print((value >> 1) & 0x01);
Serial.print((value >> 0) & 0x01); // LSB
Serial.print(" (Dezimal: ");
Serial.print(value);
Serial.println(")");
}
// Interrupt-Service-Routine für Inkrement-Taster (FALLING Flanke)
void handleIncrement() {
// Aktuelle Zeit erfassen
unsigned long currentTime = millis();
// Prüfe ob genug Zeit seit dem letzten gültigen Tastendruck vergangen ist
if (currentTime - lastDebounceTimeIncrement > DEBOUNCE_DELAY) {
incrementRequest = true; // Setze Anforderungsflag
lastDebounceTimeIncrement = currentTime; // Aktualisiere Zeitstempel
}
}
// Interrupt-Service-Routine für Reset-Taster (FALLING Flanke)
void handleReset() {
// Aktuelle Zeit erfassen
unsigned long currentTime = millis();
// Prüfe ob genug Zeit seit dem letzten gültigen Tastendruck vergangen ist
if (currentTime - lastDebounceTimeReset > DEBOUNCE_DELAY) {
resetRequest = true; // Setze Anforderungsflag
lastDebounceTimeReset = currentTime; // Aktualisiere Zeitstempel
}
}
void setup() {
// Serielle Kommunikation initialisieren (9600 Baud)
Serial.begin(9600);
Serial.println("System gestartet - Bereit für Eingaben");
// LED-Pins als Ausgänge konfigurieren
pinMode(LED_PIN_0, OUTPUT);
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
// Taster-Pins als Eingänge mit Pullup-Widerstand konfigurieren
pinMode(TASTERPIN, INPUT_PULLUP);
pinMode(RESET_TASTERPIN, INPUT_PULLUP);
// Initialen LED-Zustand setzen (Zähler = 0)
updateLEDs(counter);
// Interrupts konfigurieren (FALLING Flanke = Taster gedrückt)
attachInterrupt(digitalPinToInterrupt(TASTERPIN), handleIncrement, FALLING);
attachInterrupt(digitalPinToInterrupt(RESET_TASTERPIN), handleReset, FALLING);
}
void loop() {
// Verarbeite Inkrement-Anforderung
if (incrementRequest) {
counter = (counter + 1) % 16; // Erhöhe Zähler mit Überlauf bei 16
Serial.print("Inkrement-Taster gedrückt - Neuer Stand: ");
Serial.println(counter);
updateLEDs(counter); // Aktualisiere LED-Anzeige
incrementRequest = false; // Zurücksetzen des Flags
}
// Verarbeite Reset-Anforderung
if (resetRequest) {
counter = 0; // Setze Zähler auf 0 zurück
Serial.println("Reset-Taster gedrückt - Zähler zurückgesetzt");
updateLEDs(counter); // Aktualisiere LED-Anzeige
resetRequest = false; // Zurücksetzen des Flags
}
}