Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Ten 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życiem FALLING

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);
  }
}
quiz iconSprawdź się

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()

Poćwicz samodzielnie: Edytor online Arduino