Sie können dazu externe Interrupts verwenden. Die meisten Arduinos unterstützen dies jedoch nur mit einer begrenzten Anzahl von Pins. Ausführliche Informationen finden Sie in der Dokumentation zu attachInterrupt()
.
Angenommen, Sie verwenden ein Uno, könnten Sie dies folgendermaßen tun:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Dies wird pinChanged()
immer dann aufgerufen, wenn eine Änderung am externen Interrupt 0 festgestellt wird. Auf der Uno entspricht dies dem GPIO-Pin 2. Die Nummerierung der externen Interrupts unterscheidet sich auf anderen Karten, daher ist es wichtig, die entsprechende Dokumentation zu überprüfen.
Diesem Ansatz sind jedoch Grenzen gesetzt. Die benutzerdefinierte pinChanged()
Funktion wird als Interrupt Service Routine (ISR) verwendet. Das bedeutet, dass der Rest des Codes (alles in loop()
) vorübergehend angehalten wird, während der Aufruf ausgeführt wird. Um zu verhindern, dass wichtige Timings gestört werden, sollten Sie versuchen, ISRs so schnell wie möglich zu machen.
Es ist auch wichtig zu beachten, dass während Ihres ISR keine anderen Interrupts ausgeführt werden. Das bedeutet, dass alles, was auf Interrupts angewiesen ist (wie der Kern delay()
und die millis()
Funktionen), möglicherweise nicht richtig funktioniert.
Wenn Ihr ISR globale Variablen in der Skizze ändern muss, sollten diese normalerweise wie folgt deklariert volatile
werden:
volatile int someNumber;
Dies ist wichtig, da der Compiler darauf hingewiesen wird, dass sich der Wert unerwartet ändern kann. Daher sollte darauf geachtet werden, keine veralteten Kopien / Caches zu verwenden.