Naciśnięcie, które umyka pętli
Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 12 z 18.
Szkic bywa zajęty powolnym zadaniem lub długim delay(). Pętla, która odczytuje przycisk tylko między zadaniami, przeoczy naciśnięcie, które zaczyna się i kończy w trakcie jednego z nich.
Przerwanie rozwiązuje ten problem: gdy stan pinu się zmienia, płytka przerywa to, co robi, uruchamia wybraną przez ciebie funkcję, a następnie kontynuuje. Układ sam monitoruje pin, nawet podczas delay().
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() przyjmuje trzy argumenty: przerwanie dla pinu (digitalPinToInterrupt(buttonPin) je znajduje), funkcję do uruchomienia oraz moment jej wywołania. FALLING oznacza moment, w którym pin zmienia stan z HIGH na LOW: przy podciąganiu do góry jest to moment naciśnięcia przycisku.
Ta funkcja nazywa się procedurą obsługi przerwania, czyli ISR. Powinna być krótka: bez delay() i bez Serial.
Wyzwanie
ŁatwyTen alarm sprawdza przycisk tylko raz na 2 sekundy, więc szybkie naciśnięcie zostaje pominięte. Spraw, by naciśnięcie natychmiast zapalało diodę LED:
- napisz ISR,
onPress(), który włącza diodę LED - w
setup()przypisz ją do pinu przycisku z użyciemFALLING
Pozostaw powolne zadanie w loop(). Dioda LED pozostaje włączona po naciśnięciu, jak w alarmie. Naciśnij Run, dotknij przycisku, a następnie naciśnij Check.
Spróbuj swoich sił
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// podłącz przerwanie tutaj
}
void loop() {
// powolne zadanie: pozostaw je bez zmian
Serial.println("working");
delay(2000);
// przycisk jest sprawdzany tylko raz na 2 sekundy,
// więc krótkie naciśnięcie zostaje przeoczone
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Odmierzanie czasu bez delay()
1millis()
Zegar millis()Czas w typie unsigned longMiganie bez opóźnieniaDwie diody LED, dwa tempaMiganie podczas przełączania przyciskiemŚwiatło na czas4Precyzyjne odmierzanie czasu
Pomiar za pomocą micros()Gdy licznik millis() się przepełniaStoper z przyciskiem3Przerwania
Naciśnięcie, które umyka pętliOPADAJĄCE, NARASTAJĄCE i ZMIANAWspółdzielenie z volatileZliczanie naciśnięć za pomocą przerwańPoćwicz samodzielnie: Edytor online Arduino