KursyPoradnikiInspirujące DIYForum

Kurs Arduino II – #4 – przerwania, kontaktron, czujnik PIR

Kurs Arduino II – #4 – przerwania, kontaktron, czujnik PIR

Pisząc rozbudowane programy łatwo doprowadzić do sytuacji, w której układ nie reaguje od razu np. na wciśnięcie przycisku. Wtedy najlepiej użyć przerwań, które zostały opisane w tym artykule tak, aby każdy zrozumiał ideę ich stosowania.

Najpierw jednak kilka słów o sensorach znanych z alarmów: kontaktronach oraz czujnikach ruchu.

Czujniki alarmowe: kontaktrony

Pierwszym, bardzo prostym czujnikiem alarmowym jest kontaktron. Stosowany przy drzwiach oraz oknach. Składa się z dwóch części: odpowiednio uformowanej blaszki (wewnątrz szklanej rurki) oraz magnesu przymocowanego do drzwi/okna.

Zbliżenie na kontaktron.

Zbliżenie na kontaktron (obwód zamknięty po zbliżeniu magnesu).

Po zbliżeniu magnesu do rurki, wewnętrzne blaszki stykają się i prąd płynie od jednego, do drugiego wyprowadzenia czujnika. Z punktu widzenia Arduino sytuacja jest więc analogiczna do używania zwykłych przycisków.

W praktyce kontaktrony do zastosowań alarmowych sprzedawane są w obudowach ułatwiających ich montaż - taki właśnie czujnik dodawany jest do zestawów Forbota. Montuje się je w poniższy sposób (magnes na okno, a kontaktron na ramę). Nawet minimalne rozchylenia okna rozłącza obwód i uruchamia alarm:

Praktyczne wykorzystanie kontaktronu.

Praktyczne wykorzystanie czujnika.

Zdecydowanie więcej informacji na temat samych kontaktronów oraz ich charakterystyki znaleźć można w 3 części kursu elektroniki (poziom 2).

Kontaktron w praktyce

Pora sprawdzić zachowanie czujnika w praktyce. W tym celu podłączamy prosty obwód testowy. Standardowa dioda RGB posłuży jako wskaźnik stanu alarmu. Jeśli okno/drzwi będą zamknięte, to dioda powinna świecić w kolorze zielonym, a w przeciwnym przypadku na czerwono.

Gotowe zestawy do kursów Forbota

 Komplet elementów  Gwarancja pomocy  Wysyłka w 24h

Części do wykonania ćwiczeć z kursu Arduino (poziom 2) dostępne są w formie gotowych zestawów! W komplecie m.in. diody programowalne, termometry analogowe i cyfrowe, wyświetlacze 7-segmentowe oraz czujnik ruchu (PIR).

Zamów w Botland.com.pl »

Spis połączeń:

  • LED_R przez rezystor 1k, do pinu 10,
  • LED_G przez rezystor 1k, do pinu 11,
  • LED_B przez rezystor 1k, do pinu 12,
  • wspólna katoda diody do masy,
  • jedno wyprowadzenie kontaktronu do pinu 0,
  • drugie wyprowadzenie kontaktronu do masy.

Podłączenie na płytce może wyglądać tak, jak na poniższym zdjęciu. Dla wygody przykręciłem kontaktron do sklejki wykorzystując śrubkę M3 z zestawu oraz gotowy otwór w podstawie.

Podłączenie kontaktronu do Arduino.

Podłączenie kontaktronu do Arduino.

Wyjątkowo prosta zasada działania czujnika pozwala na zastosowanie równie prostego programu. Oprócz niezbędnego minimum (konfiguracji pinów) zajmujemy się sprawdzaniem stanu czujnika:

W efekcie uzyskaliśmy prosty alarm, który reaguje na stan kontaktronu:

Jak widać na powyższym zdjęciu, obie części kontaktronu nie muszą znajdować się idealnie blisko siebie. Dopuszczalny jest pewien margines, dzięki któremu montaż na oknach/drzwiach staje się zdecydowanie łatwiejszy.

Zadanie domowe 4.1

Wykorzystaj buzzer bez generatora (omówiony podczas poprzedniego odcinka kursu) i napisz program, który będzie uruchamiał alarm dźwiękowy natychmiast po rozchyleniu kontaktronu. Jego ponowne zetknięcie (np. poprzez zamknięcie drzwi) nie powinno wyłączać sygnału dźwiękowego.

Czujniki alarmowe: wykrywanie ruchu, PIR

Czujniki ruchu PIR (ang. Passive Infra Red), to właśnie z takimi sensorami większość z nas kojarzy systemy alarmowe. Z punktu widzenia osoby korzystającej z gotowego czujnika będzie on prostym urządzeniem, które odpowiednio zmienia stan swojego wyjścia w momencie wykrycia ruchu.

Alarmowe czujniki ruchu - PIR.

Alarmowe czujniki ruchu - PIR.

Nie będziemy dokładnie wnikać w zasadę jego działania. Warto jednak wiedzieć, że najprostsze z tych sensorów bazują na pomiarze promieniowania podczerwonego (czyli mierzą temperaturę) otoczenia. W związku z tym za ruch zostanie też uznany np. powiew ciepłego powietrza. Trochę "mądrzejsze" rozwiązania kosztują odpowiednio więcej.

Dla ciekawostki warto jeszcze wiedzieć jak wygląda sam sensor, który znajduje się przeważnie za specjalną soczewką (wewnątrz obudowy czujnika):

Sensor ruchu PIR.

Sensor ruchu (PIR).

HC-SR501 - popularny czujnik PIR

W przypadku projektów hobbystycznych konstruktorzy najchętniej sięgają po bardzo tani moduł czujnika PIR o oznaczeniu HC-SR501. Właśnie nim będziemy się teraz zajmować. Najważniejsze informacje na temat tego modułu:

  • dopuszczalne napięcie zasilania: 5-20 V,
  • pobór prądu: od 40 uA w stanie czuwania, do 150 uA,
  • wygnał na wyjściu: 0 / 3,3V,
  • zasięg regulowany: 3-7 m,
  • kąt widzenia: 120º.

Jak widać czujnik ten możemy zasilać prosto z Arduino, ponieważ pracuje poprawnie już od 5 V, co więcej pobiera on stosunkowo bardzo mały prąd, więc nie wpłynie na działanie reszty układu (tak, jak miało to miejsce np. podczas używania serwomechanizmu). Bez problemu można go również wykorzystać w konstrukcjach zasilanych z baterii.

Aby czujnik można było łatwiej wykorzystywać podczas majsterkowania producent dostarcza całość bez obudowy. Oczywiście w komplecie znajdziemy odpowiednią plastikową soczewkę, bez której praca czujnika nie byłaby możliwa.

Od spodu widoczne są 3 interesujące nas elementy:

  1. Potencjometr (Tx) do regulacji czasu trwania stanu wysokiego po wykryciu obiektu.
  2. Potencjometr (Sx) do regulacji czułości sensora.
  3. Złącze - zasilanie oraz sygnał wyjściowy.
PIR HC-SR501 - potencjometry.

PIR HC-SR501 - potencjometry.

Moduł HC-SR501 będzie działał praktycznie od razu po wyjęciu z opakowania. Domyślnie całość pracuje w trybie retriggering. Tryb ten oznacza, że w momencie wykrycia ruchu na wyjściu pojawi się stan wysoki i będzie on utrzymywany przez określony czas (Tx), a każde ponowne wykrycie ruchu będzie powodowało ponowne odliczanie czasu (Tx) od zera.

Podczas pracy w trybie, non-retriggering, na wyjściu otrzymamy stan wysoki tylko raz, później wyjście czujnika przejdzie w stan niski - niezależnie od wykrywania kolejnych ruchów w trakcie.

Działanie czujnika w wybranym przez nas trybie (retriggering) będzie zbliżone do sposobu w jaki pracuje opisany wcześniej kontaktron. Stan wysoki na wejściu Arduino będzie oznaczał wykrycie ruchu. Za pomocą potencjometru Tx możliwe jest dodatkowo regulowanie jak długo ma utrzymywać się stan wysoki po jednorazowym wykryciu ruchu.

Zakres regulacji czasu oraz zasięgu czujnika będzie się minimalnie różnił dla każdego egzemplarza. Dla pewności warto wykonać testy własnego modułu.

HC-SR501 w praktyce

Na początku czujnik ruchu wykorzystamy w sposób analogiczny do kontaktronu. Podłączenie diody RGB pozostaje bez zmian. Dodałem jedynie czujnik PIR podłączając go następująco:

  • Vcc → 5V na płytce stykowej,
  • OUT → pin nr 2 w Arduino,
  • GND → masa na płytce stykowej.

Mimo wlutowanych złącz (goldpinów) czujnika nie włożymy bezpośrednio do płytki stykowej. Można poradzić sobie z tym na różne sposoby. Ja wykorzystałem połączenie przewodów męsko-męskich oraz żeńsko-żeńskich - zgodnie z poniższym zdjęciem. Dzięki temu jedną żeńską stronę wpiąłem w moduł, a drugą (męską) bezpośrednio w płytkę stykową. Oba typy przewodów znajdują się w zestawach Forbota do kursu Arduino poziom II.

Połączenie przewodów w celu uzyskania przejściówki z PIR do płytki stykowej.

Połączenie przewodów w celu uzyskania przejściówki z PIR do płytki stykowej.

Cały układ ostatecznie wyglądał następująco:

Podłączenie czujnika PIR do Arduino.

Podłączenie czujnika PIR do Arduino.

Na początek nie trzeba przejmować się potencjometrami do regulacji czasu impulsu oraz zasięgu. Wystarczy skręcić je do skrajnej pozycji zgodnie z poniższym zdjęciem. Wtedy najłatwiej będzie zaobserwować efekt działania układu.

Ustawienie potencjometrów do testów.

Ustawienie potencjometrów do testów.

Program działa analogicznie do wcześniejszego:

Po wykryciu ruchu dioda zmienia kolor z zielonego na czerwony i po chwili wraca do zielonego. Zachęcam do testów z zasięgiem czujnika, ponieważ jest całkiem duży!

Należy pamiętać, że czujniki PIR swoim zasięgiem obejmują znaczny obszar. Ich rozdzielczość nie pozwoli na wykrycie np. "kiwnięcia palcem w rogu pokoju". Raczej należy używać je w sytuacjach, gdy konieczna jest reakcja na przejście osoby itd.

Zadanie domowe 4.2

Napisz program, który po wykryciu ruchu będzie odgrywał krótką melodyjkę. Urządzenie takie można postawić np. przy drzwiach w celu informowania o nowej osobie wchodzącej do pokoju.

Przerwania na Arduino

Same czujniki alarmowe, nie wymagają nowych umiejętności programistycznych. Można je bardzo prosto wykorzystać w swoich projektach. Korzystając z okazji, że cześć sprzętowa jest taka prosta będziemy mogli spokojnie zająć się przerwaniami na Arduino, czyli zupełnie nowym zagadnieniem.

Najpierw informacja dla osób obytych w temacie. Mam świadomość, że przerwania są tematem znacznie bardziej rozbudowanym. W dalszym opisie starałem się jednak uogólnić część informacji i wprowadzić tylko te, które mają odniesienie do Arduino. Nie chcę zasypywać czytelników teorią, z której na początku i tak nie skorzystają.

Czym są przerwania zewnętrzne?

Przerwania, to mechanizm, który pozwala pod wpływem zewnętrznego sygnału natychmiast przerwać wykonywaną część programu i przejść do konkretnej funkcji. Przykładowo, niezależnie od tego, co robi program po rozwarciu kontaktronu musimy odnotować alarm.

Pozornie wystarczy zwykła pętla sprawdzająca stan wejścia. Jednak nie zawsze możemy sobie pozwolić, aby program zajmował się wyłącznie sprawdzaniem czujnika. Czasami potrzebna będzie komunikacja z komputerem (UART) lub sterowanie innymi częściami systemu, to wszystko zajmuje cenny czas, podczas którego moglibyśmy przegapić sygnał od czujnika alarmowego.

Przerwania w życiu codziennym

Dla zobrazowania problemu posłużę się przykładem "życiowym". Spodziewasz się ważnej paczki na tyle ważnej, że specjalnie zostajesz w domu i czekasz na kuriera. Jak to w takich sytuacjach bywa akurat przestał działać domofon, a kurier nie ma Twojego numeru. Jednocześnie spędzając dzień w domu chciałbyś zrobić coś innego - np. ugotować zupę.

Plan na dziś: gotujemy zupę!

Plan na dziś: gotujemy zupę! Źródło zdjęcia: https://foodiesfeed.com/

Wersja 1 (bez przerwań). Przez cały dzień musisz regularnie podchodzić do okna i sprawdzać, czy może kurier już przyjechał(?). Kroisz jedną marchewkę, dodajesz do zupy i idziesz wyjrzeć przez okno. Kroisz kolejną marchewkę i znów do okna. Nie dość, że musisz przerywać oba zadania, to, co gorsze, kurier może przyjechać w momencie gdy kroisz warzywa.

Wersja 2 (z przerwaniami). Tym razem nie masz zamiaru, co chwilę chodzić do okna. Dlatego uśmiechasz się do starszej sąsiadki, która cały dzień patrzy przez okno (każdy chyba taką ma)...

Sąsiadka na stanowisku! Źródło zdjęcia: https://stocksnap.io/photo/PI8ULXYD4C

Sąsiadka na stanowisku! Źródło zdjęcia: https://stocksnap.io/

Prosisz ją, aby w momencie zauważenie kuriera zapukała do Ciebie przez ścianę. Od tej pory poświęcasz się całkowicie krojeniu marchewki. Cały dzień na spokojnie, bez chodzenia do okna. Nagle słyszysz pukanie w ścianę - dla Ciebie to bardzo ważny sygnał - pojawiło się "coś", co należy zrobić dokładnie w tej chwili. Kurier podjechał i czeka, to zadanie jest krytyczne czasowo.

Gdy ją odbierzesz i wrócisz do mieszkania będziesz mógł kontynuować robienie zupy, tam gdzie zakończyłeś. Dzięki pomocy sąsiadki, która przerwała Twoją pracę, mogłeś poświęcić się innym zadaniom, a co ważne nie było możliwości, abyś przegapił przyjazd kuriera.

Przerwania w świecie mikrokontrolerów

Powyższy opis, celowo oderwany jest od programowania, ale zauważmy, że:

  1. Gotowanie zupy → regularna praca programu (np. sygnalizacja stanu urządzenia, komunikacja z komputerem, sterowanie podzespołami).
  2. Przyjazd kuriera  → zadanie krytyczne czasowo, np. wykrycie alarmu przez czujnik PIR lub wciśnięcie przycisku przez użytkownika. Wszystko, co wymaga zareagowania "tu i teraz". Nikt nie chce, aby urządzenie zauważało wciśnięcie przycisku dopiero po 5 sek.
  3. Sąsiadka → mechanizm obsługujący przerwania.
  4. Pukanie w ścianę  → zgłoszenie przerwania.
  5. Odebranie paczki  → obsługa przerwania.

Mam nadzieję, że jest już zrozumiałe w jakich sytuacjach będzie to pomocne i jakie niesie korzyści. Dla pewności, zalety przerwań:

  1. Mamy "pomocnika" , który zajmuje się obserwowaniem wejścia (czujnika) w tle.
  2. Pomocnik ten pracuje równolegle do mikrokontrolera realizującego program.
  3. Nie musimy "marnować" czasu na częste sprawdzanie czujnika.
  4. Wykorzystanie przerwania gwarantuje obsługę zdarzenia dokładnie wtedy, gdy będzie taka potrzeba. Nawet jeśli konieczne będzie przerwania wykonywanego fragmentu programu.

Kiedy przerwanie przyda się w praktyce?

Spróbujmy teraz pokazać w praktyce na Arduino, kiedy przerwanie może być potrzebne. Wróćmy do wcześniejszego przykładu, gdzie kolor diody zależał od stanu kontaktronu:

Główna pętla programu jest krótka, a jej jedynym zadaniem jest sprawdzanie stanu kontaktronu. Nie ma możliwości, aby taki program nie wychwycił rozwarcia kontaktronu. Wystarczy jednak prosta zmiana programu, aby sytuacja wygląda zupełnie inaczej...

Rozbudujmy program, tak, aby obieg pętli trwał stosunkowo długo. Efekt taki uzyskamy dodając kontrolkę - niech miganie diody wbudowanej w Arduino (pin 13) sygnalizuje prace "alarmu":

Sprawdźmy jak teraz spisze się program! Alarm nie działa już dobrze. Całość reaguje na zmiany czujnika różnie - czasami od razu, czasami dopiero po 4 sekundach, a czasami wcale.

W przypadku systemu alarmowego coś takiego nie może się wydarzyć. O ile włączenie alarmu po kilku sekundach jesteśmy w stanie zaakceptować o tyle całkowity brak reakcji dyskwalifikuje takie rozwiązanie. Jeśli złodziej wszedłby szybko przez okno, to nasz system nawet nie zdążyłby tego zauważyć.

Czy alarm zdąży zauważyć szybkiego złodzieja?

Czy alarm zdąży zauważyć szybkiego złodzieja?

Pora zaimplementować wreszcie przerwanie i usprawnić działanie programu!

Przerwania w Arduino

Na początku w funkcji setup() należy dokonać deklaracji przerwania. Skorzystamy z dość długiego polecenia attachInterrupt, którego składnia wygląda następująco:

Zagadnienie jest dość złożone, więc każdy argument omówiłem szerzej, jako osobny podpunkt.

Pin przerwania - digitalPinToInterrupt(PIN)

Pierwszym argumentem funkcji deklarującej przerwanie jest podanie pinu, który ma być użyty w roli przerwania zewnętrznego. Przerwania są mechanizmem wbudowanym w mikrokontrolery - nie jest to tylko zabieg programistyczny.

W przypadku UNO przerwania możemy obsłużyć wyłącznie na pinach nr 2 oraz 3. Inne płytki obsługują przerwania w innych ilościach/na innych pinach. Dlaczego wewnątrz argumentów funkcji attachInterrupt numer pinu podajemy przez kolejną funkcję, czyli digitalPinToInterrupt?

Piny i ich numeracja, to jedno, a kolejne przerwania i ich numeracja, to co innego. Moim zdaniem dokładne wiadomości na ten temat nie są potrzebne na tym etapie  Wystarczy spojrzeć na tabelę:

Numeracja przerwań w Arduino.

Numeracja przerwań w Arduino.

Jak widać na płytce Arduino UNO przerwanie oznaczone jako int.0 występuje na pinie nr 2, ale już w przypadku Arduino Leonardo int.0 znajdziemy na pinie 3. Nie będę teraz wnikał dlaczego tak jest.

Tutaj pojawia się miejsce dla funkcji digitalPinToInterrupt, która po prostu, aby nie trzeba było pamiętać numerów przerwań, dopasuje numer samodzielnie na podstawie podanego przez nas pinu oraz typu płytki Arduino wybranej w kompilatorze.

W przypadku Arduino UNO mamy tutaj dwie możliwości:

Funkcja wywoływana w przerwaniu

Gdy mikrokontroler otrzyma informację o przerwaniu zewnętrznym przerwie aktualne zadanie i wykona kod, który znajdzie się w napisanej przez nas funkcji. To właśnie jej nazwa jest drugim argumentem attachInterrupt().

Będzie to zwykła funkcja, taka jakich wiele pisaliśmy podczas I poziomu kursu Arduino. Nie może ona jednak przyjmować żadnych argumentów, ani żadnych zwracać. Przykładowo, jeśli przerwanie od pinu 2 miałoby ustawiać zmienną alarm na 1, należałoby zrobić to następująco:

Żadnego czekania, trudnych obliczeń, warunków czekających na inne sygnały itd. Nie będę teraz pisał więcej na ten temat, bo znacznie łatwiej będzie zrozumieć to w praktyce.

Kiedy ma być zgłaszane przerwanie (REAKCJA_NA)?

Wiemy już, który pin ma działać jako przerwanie zewnętrzne oraz jaki kod ma się wykonać. Jako ostatni parametr funkcji attachInterrupt musimy podać informację "na co" ma reagować mechanizm od przerwań. Do wyboru mamy:

  • LOW - wywołanie przerwania zawsze, gdy na wejściu panuje stan niski.
  • CHANGE - wywołanie przy zmianie wartości na pinie (z wysokiego na niski i odwrotnie).
  • RISING - wywołanie, gdy następuje zmiana wartości ze stanu niskiego na wysoki.
  • FALLING - wywołanie, gdy następuje zmiana wartości ze stanu wysokiego na niski.
Zbocze rosnące i opadające.

Zbocze rosnące i opadające.

Możliwość wywoływania przerwań w momencie pojawienia się zbocza rosnącego lub opadającego ułatwia pisanie programów w wielu sytuacjach!

Przerwania Arduino w praktyce

Pora na pierwszy program, który wykorzysta przerwanie. Na początek zajmiemy się sprawdzaniem stanu czujnika PIR, bo jest już podpięty do pinu obsługującego przerwanie.

Pierwszy program z wykorzystaniem przerwania może wyglądać tak:

Na pierwszy rzut oka kod ten nie powinien nic robić, ponieważ w głównej pętli loop() nie ma żadnej instrukcji. Wystarczy załadować program, aby przekonać się, że jest inaczej. Po wykryciu zmiany stanu logicznego na wyjściu czujnika (z niskiego na wysoki) zapala się dioda czerwona.

Wykorzystaliśmy przerwanie wyzwalane zboczem rosnącym (RISING), ponieważ interesuje nas sytuacja, gdy wyjście czujnika zmienia stan z niskiego 0 V, na stan wysoki 3.3 V, czyli rośnie.

Wykrycie ruchu - dioda świeci na czerwono.

Wykrycie ruchu - dioda świeci na czerwono.

Jest to o tyle ciekawe, że nigdzie "wprost" programowo nie sprawdzamy stanu czujnika! Robi to za nas sprzętowo mechanizm odpowiadający za przerwania, który reaguje na zmianę stanu czujnika.

Co więcej działanie tego mechanizmu nie będzie wrażliwe, na rzeczy umieszczone w pętli głównej. Dla przykładu możemy tam dodać miganie diodą (podłączoną do pinu nr 13), co normalnie spowodowałoby opóźnione reakcje na sygnał z czujnika:

Zadanie domowe 4.3

Napisz program korzystający z przerwań, który uruchomi alarm (świecenie diody czerwonej) nie natychmiast po wykryciu ruchu przez czujnik, ale dopiero, gdy ruch ten ustanie.

Przekazywanie informacji "z" funkcji przerwania

Tak jak wspomniałem wcześniej, funkcja odpowiedzialna za obsługę przerwania nie może zwracać żadnej wartości przez standardowy mechanizm return. Można to oczywiście "obejść", korzystając np. ze zmiennych globalnych. Trzeba jednak pamiętać, aby wszystkie zmienne globalne używane wewnątrz funkcji przerwań były zadeklarowane ze specjalnym przedrostkiem - volatile.

Spróbujmy stworzyć program, który będzie zliczał ile razy czujnik PIR wykrył ruch i od tego uzależnijmy kolor diody RGB. W tym celu wystarczy w odpowiednim przerwaniu zwiększać wartość zmiennej, która będzie zliczała ilość zboczy rosnących.

Działanie programu w praktyce jest zgodne z przewidywaniami. Kolor diody zmienia się razem ze wzrostem liczby informującej o sytuacjach, w których czujnik PIR wykrył ruch.

Zadanie domowe 4.4

Napisz program korzystający z przerwań, który po każdym wykryciu ruchu przez czujnik PIR zmieni stan diody na przeciwny. Czyli: pierwsze wykrycie - świeci, drugie wykrycie nie świeci itd.

Czego nie może zawierać funkcja od przerwania?

Korzystanie z przerwań może ułatwić nam życie podczas realizacji wielu projektów. Jednak równie łatwo wpaść w pułapkę. Nieumiejętne wykorzystanie przerwań może doprowadzić do sytuacji, w której program będzie zachowywał się bardzo dziwnie, a znalezienie przyczyny będzie trudne.

Dlatego pisząc funkcje, które będą wywoływane przez przerwania należy pamiętać, aby:

  1. Absolutnie nie umieszczać w nich opóźnień (delay, delayMicroseconds itd).
  2. Nie wykonywać w ich wnętrzu operacji, które trwają długo.
  3. Operacje wykonywane wewnątrz przerwania powinny być ekstremalnie krótkie. Tak jak powyżej - inkrementacja zmiennej i koniec. Nie zajmujemy się już nawet włączeniem odpowiedniej diody. To możemy zrobić normalnie w pętli - krytyczny czasowo był tylko fakt odnotowania ruchu przez czujnik PIR.

Na szczęście w przypadku Arduino funkcja delay() nawet nie zadziała, jeśli umieścimy ją wewnątrz funkcji przerwania. Jednak delayMicroseconds() będzie działała poprawnie, ale nie powinniśmy jej używać do sztucznego wywołania dłuższych opóźnień w programie.

Dlaczego jest to takie ważne? Jeśli wykonanie funkcji z przerwania trwałoby np. 5 sekund (czyli stanowczo za długo), to każde wystąpienie przerwania wprowadzi takie opóźnienie w cały program.

Długi czas wykonywania przerwań to droga do kłopotów!

Długi czas wykonywania przerwań to droga do kłopotów!

Pamiętaj, że całą zaletą omawianego mechanizmu jest fakt, że mikrokontroler przerywa aktualną pracę, aby wykonać funkcję z przerwania. Jeśli w pętli głównej zmienialibyśmy stan diody, co sekundę, to każde wywołanie przerwania zamrażałoby ją na dodatkowe 5 sekund.

Czyli w pętli byłby widoczny poniższy kod, a dioda migałaby różnie - czasami jej stan zmieniałby się co 1 sekundę, a czasami co 6 sekund (delay(1000) + czas przerwania):

Oczywiście od powyższych reguł można robić wyjątki, jednak dopiero wtedy, gdy ma się obycie z tematem przerwań i świadomość, co dokładnie będzie się działo po takich zmianach. Jednak na 99,99%, jeśli zaczynasz przygodę z programowaniem i jesteś przekonany, że w przerwaniu musisz wprowadzić opóźnienie, to jesteś w błędzie - ten problem na pewno da się rozwiązać inaczej.

Kiedy stosować przerwania?

  • Gdy reakcja na sygnał z zewnątrz jest krytyczna czasowo (np. wykrycie alarmu).
  • Gdy program jest bardzo rozbudowany (wiele funkcji, pętli, opóźnień), a dodatkowo cały czas musimy reagować np. na przyciski/czujniki.

Kiedy nie stosować przerwań?

  • Gdy program jest stosunkowo krótki lub nie posiada opóźnień, więc jesteśmy w stanie sprawdzać wszystkie wejścia na bieżąco.
  • Gdy zbieranie informacji z wejść/czujników nie jest krytyczne czasowo.

Podsumowanie

Wykorzystywanie przerwań w Arduino nie jest trudne, to tylko kilka linijek kodu więcej. Trudne jest jednak robienie tego poprawnie i w sposób świadomy. Polecam pobawić się przerwaniami i poeksperymentować. Szczególnie ważne jest zrozumienie czym różni się wyzwalanie przerwań zboczami (rosnące/malejące) od wyzwalania stanem. Kolejne informacje na temat przerwań będę starał się przekazywać w praktyce podczas dalszych artykułów.

Czy wpis był pomocny? Oceń go:

Średnia ocena 4.8 / 5. Głosów łącznie: 213

Nikt jeszcze nie głosował, bądź pierwszy!

Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!

Nawigacja kursu

Nie chcesz przeoczyć kolejnych części kursu? Skorzystaj z poniższego formularza i zapisz się na powiadomienia o nowych artykułach!

Autor kursu: Damian (Treker) Szymański

alarm, arduino, czujnik, kontaktron, kursArduino2, PIR, przerwania

Trwa ładowanie komentarzy...