X

Kurs ESP - Przerwania

Przerwanie to mechanizm pozwalający na przerwanie wykonywanej części programu i przejście do konkretnej funkcji programu. Może to nastąpić np. po naciśnięciu klawisza. Pozwala to uniknąć sytuacji w której program oczekuje naciśnięcia klawisza określony czas.

podstawowe funkcje

volatile byte interruptCounter = 0; // Zmienna odpowiadająca za przechowanie liczby przerwań
attachInterrupt(digitalPinToInterrupt(D7), handleInterrupt, FALLING); //Deklaracja pinu odpowiadającego za przerwanie oraz wyzwolenie funkcji.
void handleInterrupt() { // Funkcja wyzwalana po wykryciu przerwania
    interruptCounter++;
}

void loop() {
    Serial.print(interruptCounter);
    delay(6000);
}

Program

Program realizuje płynną zmianę barwy poprzez moduł diody RGB. Po naciśnięci klawisza musi:

  • dokończyć pełne przejście,
  • uruchomić się sekwencja kolorów R->G->B każdy kolor po sekundzie,
  • ponownie uruchomić płynne przejście kolorów.
     

Schemat

Przerwania

Kod programu

#define blue D1
#define green D2
#define red D3
#define InterruptPin D7

volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;

void setup() {
    Serial.begin(9600);
    pinMode(red, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(blue, OUTPUT);

    pinMode(InterruptPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(InterruptPin), handleInterrupt, FALLING);

}

void handleInterrupt() {
    interruptCounter++;
}

void loop() {
    if (interruptCounter > 0) {
        rgbSequences();
    }
    interruptCounter = 0;
    int i = 128;
    for (i = 100; i < 1023; i++) {
        analogWrite(red, i);
        analogWrite(green, i);
        analogWrite(blue, 1023 - i);
        delay(2);
    }

    for (i = 1023; i > 100; i--) {
        analogWrite(red, i);
        analogWrite(green, i);
        analogWrite(blue, 1023 - i);
        delay(2);
    }
    Serial.println(interruptCounter);
}

void rgbSequences()
{
    analogWrite(red, 0);
    analogWrite(green, 0);
    analogWrite(blue, 0);
    delay(1000);
    analogWrite(red, 1023);
    delay(1000);
    analogWrite(red, 0);
    analogWrite(green, 1023);
    delay(1000);
    analogWrite(green, 0);
    analogWrite(blue, 1023);
    delay(1000);
}