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
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);
}