// Pin-Konfiguration
const int buttonPin = 19; // Taster an Pin 19
const int ledPin = 25; // LED an Pin 25
volatile bool ledState = false; // Zustand der LED
/*Eine Variable sollte als
volatile
deklariert werden, wenn sie von irgendwo anders geändert werden kann außer in dem Codeteil, in dem sie auftaucht.
Beispiele dafür sind Threads, die parallel ausgeführt werden. Im Arduino kann das nur bei Interrupts vorkommen,
in sogennanten Interrupt Service Routinen.
Quelle: https://docs.arduino.cc/language-reference/de/variablen/variable-scope-qualifiers/volatile/
// HTL - Anichstraße - Biomedizin und Gesundheitstechnik v1.0 Dez.24
*/
// Variablen für den Modus
char mode;
// Interrupt-Service-Routine (ISR): toggelt den ledState
void IRAM_ATTR handleButtonInterrupt() {
// ISR: LED-Zustand umschalten
ledState = !ledState;
}
void setup() {
Serial.begin(115200);
// Pin-Modi festlegen
pinMode(buttonPin, INPUT_PULLUP); // Taster mit Pull-Up-Widerstand
pinMode(ledPin, OUTPUT); // LED als Ausgang
// Modusauswahl: Polling oder Interrupt
Serial.println("Wähle den Modus:");
Serial.println("1: Polling");
Serial.println("2: Interrupt");
while (!Serial.available()); // Warten auf Nutzereingabe
mode = Serial.read();
if (mode == '1') {
Serial.println("Polling-Modus gestartet...");
} else if (mode == '2') {
Serial.println("Interrupt-Modus gestartet...");
attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonInterrupt, FALLING);
} else {
Serial.println("Ungültige Eingabe. Starten Sie das Programm neu.");
while (true);
}
}
void loop() {
if (mode == '1') {
// Polling-Modus: Taster wird in der Schleife abgefragt. Beim Interrupt Modus ist dies in
// diesem Beispiel nicht notwendig.
if (digitalRead(buttonPin) == LOW) { // Taster wird in jedem loop Duchlauf abgefragt
delay(50); // Entprellung
ledState = !ledState; // LED-Zustand umschalten
}
}
digitalWrite(ledPin, ledState); //LED ein- oder ausschalten
delay(1000); // 1s warten zum Aufzeigen des Unterschieds zwichen Polling und Interrupt
// -> Druck wird bei Interrupt immer erkannt, da sogar das delay unterbrochen wird.
}