Hier sind einige häufige Probleme und deren mögliche Lösungen:

  • Der Interrupt wird nicht ausgelöst: Überprüft die Pin-Nummer und die Verkabelung.
  • Mehrfache Auslösung bei einem Tastendruck: Implementiert eine Entprellung wie im folgenden Code gezeigt:
// Taster-Interrupt mit Entprellung (ISR-sicher)
const int buttonPin = 4;
const int ledPin = 2;

volatile bool buttonPressed = false;    // Flag für den Taster
bool ledState = false;
unsigned long lastHandledTime = 0;
const unsigned long debounceDelay = 50;

void IRAM_ATTR handleButtonPress() {
  buttonPressed = true;  // Nur das Flag setzen, keine Logik in der ISR
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);    // Taster-Pin mit internem Pullup-Widerstand
  pinMode(ledPin, OUTPUT);             // LED als Ausgang
  attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING);  // Interrupt bei fallender Flanke
}

void loop() {
  if (buttonPressed) {
    unsigned long currentTime = millis();
    if ((currentTime - lastHandledTime) > debounceDelay) {
      ledState = !ledState;           // LED-Zustand umschalten
      lastHandledTime = currentTime;  // Zeit merken
    }
    buttonPressed = false;            // Flag zurücksetzen
  }

  digitalWrite(ledPin, ledState);     // LED anpassen
}

// Erklärung: 
// Die ISR setzt nur ein Flag. Die eigentliche Entprellung und Verarbeitung 
// passiert im loop(). Das macht den Code ISR-sicher und verhindert Probleme 
// mit millis() oder digitalWrite() im Interrupt.
  • Die LED reagiert nicht: Stellt sicher, dass die LED-Pin-Nummer korrekt ist und die LED richtig herum eingesetzt ist.
  • Der Code kompiliert nicht: Überprüft, ob alle benötigten Bibliotheken installiert sind und die Syntax korrekt ist.
...zur Antwort

Bei der Arbeit mit Interrupts sollten einige wichtige Punkte beachtet werden:

  • Haltet ISRs so kurz wie möglich, um andere Aufgaben nicht zu blockieren.
  • Vermeidet komplexe Berechnungen oder langwierige Operationen in ISRs.
  • Benutzt volatile Variablen für die Kommunikation zwischen ISRs und dem Hauptprogramm.
  • Seid vorsichtig mit der Verwendung von Funktionen wie delay() in ISRs.
  • Beachtet mögliche Race Conditions zwischen ISRs und dem Hauptprogramm.
...zur Antwort

Lesen Sie wiederholt einen Sensorwert ein, bis er einen bestimmten Schwellenwert überschreitet

Schleifenform: DO-WHILE

Begründung: Da der Sensorwert mindestens einmal ausgelesen werden muss, bevor die Bedingung überprüft wird, eignet sich die DO-WHILE-Schleife.

int sensorWert;
do {
    sensorWert = analogRead(sensorPin);
    Serial.println(sensorWert);
    delay(500);
} while (sensorWert < schwellenwert);
...zur Antwort