#include <Arduino.h>
#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 100 // Entprellzeit in ms
volatile unsigned long lastIncrementTime = 0;
volatile unsigned long lastResetTime = 0;
volatile bool incrementRequest = false;
volatile bool resetRequest = false;
byte counter = 0; // Zähler (0-15)
// Funktion zur Aktualisierung der LEDs
void updateLEDs(byte value) {
digitalWrite(LED_PIN_0, value & 0x01);
digitalWrite(LED_PIN_1, (value >> 1) & 0x01);
digitalWrite(LED_PIN_2, (value >> 2) & 0x01);
digitalWrite(LED_PIN_3, (value >> 3) & 0x01);
// Binärdarstellung ausgeben
Serial.print("LED-Zustand: ");
Serial.print((value >> 3) & 0x01);
Serial.print((value >> 2) & 0x01);
Serial.print((value >> 1) & 0x01);
Serial.print((value >> 0) & 0x01);
Serial.print(" (Dezimal: ");
Serial.print(value);
Serial.println(")");
}
// ISR für Inkrement-Taster
void handleIncrement() {
if (millis() - lastIncrementTime > DEBOUNCE_DELAY) {
incrementRequest = true;
lastIncrementTime = millis();
}
}
// ISR für Reset-Taster
void handleReset() {
if (millis() - lastResetTime > DEBOUNCE_DELAY) {
resetRequest = true;
lastResetTime = millis();
}
}
void setup() {
// Serielle Kommunikation initialisieren
Serial.begin(9600);
Serial.println("System gestartet");
Serial.println("Warte auf Tastendruck...");
// LED-Pins konfigurieren
pinMode(LED_PIN_0, OUTPUT);
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
// Taster-Pins konfigurieren
pinMode(TASTERPIN, INPUT_PULLUP);
pinMode(RESET_TASTERPIN, INPUT_PULLUP);
// Initialen LED-Zustand setzen
updateLEDs(counter);
// Interrupts initialisieren
attachInterrupt(digitalPinToInterrupt(TASTERPIN), handleIncrement, FALLING);
attachInterrupt(digitalPinToInterrupt(RESET_TASTERPIN), handleReset, FALLING);
}
void loop() {
// Inkrement-Anforderung verarbeiten
if (incrementRequest) {
counter = (counter + 1) % 16; // Zähler erhöhen (mit Überlauf)
Serial.print("Taster gedrückt - Neuer Zählerstand: ");
Serial.println(counter);
updateLEDs(counter);
incrementRequest = false;
}
// Reset-Anforderung verarbeiten
if (resetRequest) {
counter = 0; // Zähler zurücksetzen
Serial.println("Reset-Taster gedrückt - Zähler zurückgesetzt");
updateLEDs(counter);
resetRequest = false;
}
}