Menu
CoddyTech

OPADAJĄCE, NARASTAJĄCE i ZMIANA

Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 13 z 18.

Uno ma dwa piny, które mogą wywołać przerwanie: pin 2 i pin 3. Przycisk, który wymaga przerwania, musi być podłączony do jednego z nich. Wewnątrz układu są to przerwanie 0 i przerwanie 1, więc użyj digitalPinToInterrupt(), aby zamienić pin na jego numer. attachInterrupt(3, ...) żąda przerwania 3, którego Uno nie ma, więc nic się nie dzieje.

Ostatni argument attachInterrupt() określa, na jaką zmianę reagować:

  • FALLING: pin zmienia stan z HIGH na LOW (przy podciąganiu — naciśnięcie)
  • RISING: pin zmienia stan z LOW na HIGH (zwolnienie przycisku)
  • CHANGE: dowolna z tych zmian

Przy CHANGE procedura ISR uruchamia się zarówno po naciśnięciu, jak i po zwolnieniu przycisku. Odczytuje pin, aby ustalić, która z tych sytuacji nastąpiła:

void onChange() {
  if (digitalRead(buttonPin) == LOW) {
    // przycisk został wciśnięty
  } else {
    // przycisk został zwolniony
  }
}

attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);
challenge icon

Wyzwanie

Łatwy

Przycisk jest podłączony do pinu 3, a loop() zajmuje się wolnym zadaniem. Spraw, aby dioda LED na pinie 13 natychmiast reagowała na przycisk:

  • w onChange() odczytaj stan przycisku: LOW zapala diodę LED, a HIGH ją wyłącza
  • podłącz onChange() do pinu przycisku za pomocą CHANGE

Naciśnij Run, przytrzymaj i puść przycisk, a następnie naciśnij Check.

Spróbuj swoich sił

const int ledPin = 13;
const int buttonPin = 3;

// Uruchamia się za każdym razem, gdy zmienia się stan pinu przycisku.
void onChange() {
  // zaświeć diodę LED, gdy przycisk jest wciśnięty, i zgaś ją, gdy jest zwolniony
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // tutaj przypisz onChange() do pinu przycisku
}

void loop() {
  // powolne zadanie: pozostaw je bez zmian
  Serial.println("working");
  delay(2000);
}
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