Możesz to zrobić za pomocą zewnętrznych przerwań. Większość Arduinos obsługuje to jednak tylko na ograniczonej liczbie pinów. Aby uzyskać szczegółowe informacje, zobacz dokumentację na attachInterrupt()
.
Zakładając, że używasz Uno, możesz to zrobić w następujący sposób:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Wywoła się pinChanged()
za każdym razem, gdy zostanie wykryta zmiana w zewnętrznym przerwaniu 0. Na Uno, które odpowiada pinowi GPIO 2. Numeracja zewnętrznych przerwań jest inna na innych płytach, dlatego ważne jest sprawdzenie odpowiedniej dokumentacji.
Istnieją jednak ograniczenia tego podejścia. Funkcja niestandardowa pinChanged()
jest używana jako procedura obsługi przerwań (ISR). Oznacza to, że reszta kodu (wszystko w środku loop()
) jest tymczasowo zatrzymywana podczas wykonywania połączenia. Aby zapobiec zakłóceniu ważnych terminów, powinieneś dążyć do jak najszybszego uzyskania ISR.
Ważne jest również, aby pamiętać, że żadne inne zakłócenia nie będą działać podczas twojego ISR. Oznacza to, że wszystko zależne od przerwań (takie jak rdzeń delay()
i millis()
funkcje) może nie działać poprawnie w nim.
Na koniec, jeśli twój ISR musi zmienić dowolne zmienne globalne w szkicu, zwykle powinny być zadeklarowane jako volatile
, np .:
volatile int someNumber;
Jest to ważne, ponieważ informuje kompilator, że wartość może się nieoczekiwanie zmienić, dlatego należy uważać, aby nie używać żadnych nieaktualnych kopii / pamięci podręcznych.