Funkcja opóźnienia Arduino i dlaczego nie należy jej używać

  • Peter Holmes
  • 0
  • 2416
  • 233
Reklama

Kiedy po raz pierwszy zacząłeś uczyć się, jak zacząć Pierwsze kroki z Arduino: Przewodnik dla początkujących Pierwsze kroki z Arduino: Przewodnik dla początkujących Arduino to platforma prototypowania elektroniki typu open source oparta na elastycznym, łatwym w użyciu sprzęcie i oprogramowaniu. Jest przeznaczony dla artystów, projektantów, hobbystów i wszystkich zainteresowanych tworzeniem interaktywnych obiektów lub środowisk. dla Arduino Co to jest Arduino i co możesz z tym zrobić? Co to jest Arduino i co możesz z tym zrobić? Arduino to niezwykłe małe urządzenie elektroniczne, ale jeśli nigdy wcześniej go nie używałeś, jakie dokładnie są i co możesz z tym zrobić? , prawdopodobnie zbudowałeś produkt, który działa trochę tak:

Do Twojego Arduino podłączone byłoby pojedyncze światło LED. Spowodowałoby to wyłączenie i wyłączenie co sekundę i potrwa do momentu wyłączenia Arduino. To jest “Witaj świecie” program Arduino i doskonale ilustruje, jak kilka linii kodu może stworzyć coś namacalnego.

Jestem również skłonny się założyć, że użyłeś opóźnienie() funkcja określająca odstępy między włączaniem i wyłączaniem światła. Ale o to chodzi: chociaż opóźnienie jest przydatne w przypadku podstawowych demonstracji działania Arduino, tak naprawdę nie powinieneś używać go w prawdziwym świecie. Oto dlaczego - i czego powinieneś użyć zamiast tego.

Jak działa opóźnienie ()

Sposób, w jaki opóźnienie() funkcja działa jest dość prosta. Przyjmuje jedną liczbę całkowitą Podstawy programowania komputerowego 101 - Zmienne i typy danych Podstawy programowania komputerowego 101 - Zmienne i typy danych Po wprowadzeniu i mówieniu trochę o programowaniu obiektowym przedtem i skąd pochodzi jego nazwa, myślałem, że nadszedł czas, aby przejść absolutne podstawy programowania w sposób inny niż język. Ten… (lub liczbowy) argument. Ta liczba reprezentuje czas (mierzony w milisekundach), jaki program powinien poczekać, aż przejdzie do następnego wiersza kodu.

Ale problem polega na tym, że opóźnienie() funkcja nie jest dobrym sposobem na zmuszenie twojego programu do czekania, ponieważ jest to tak zwane “bloking” funkcjonować.

Różnica między funkcjami blokującymi a nieblokującymi

Aby zilustrować, dlaczego funkcje blokowania są złe, chcę, abyś wyobraził sobie dwóch różnych szefów kuchni w kuchni: Henry Blocking, i Eduardo NonBlocking. Obaj wykonują tę samą pracę, ale na różne sposoby.

Kiedy Henry robi śniadanie, zaczyna od włożenia dwóch tostów chleba do tostera. Kiedy to w końcu pingi, a chleb wyskakuje na złoty kolor, Henry kładzie go na talerzu i rozbija dwa jajka na patelni. Znów stoi, gdy wytryskuje olej, a białka zaczynają twardnieć. Kiedy skończą, nakłada je na talerze i zaczyna smażyć dwa bekonu. Gdy będą wystarczająco chrupiące, zdejmuje je z patelni, kładzie na talerzu i zaczyna jeść.

Eduardo działa w nieco inny sposób. Podczas gdy jego chleb wznosi toast, zaczął już smażyć jajka i bekon. Zamiast czekać, aż jeden przedmiot zakończy gotowanie, zanim przejdzie do następnego, gotuje wiele przedmiotów jednocześnie. Efektem końcowym jest to, że Eduardo zajmuje mniej czasu na zrobienie śniadania niż Henry - i zanim Henry Blocking skończył, tosty i jajka ostygły.

To głupia analogia, ale ilustruje sens.

Bloking funkcje uniemożliwiają programowi wykonywanie jakichkolwiek innych czynności do czasu zakończenia określonego zadania. Jeśli chcesz wielu działania aby zdarzyć się w tym samym czasie, po prostu nie możesz użyć opóźnienie().

W szczególności, jeśli aplikacja wymaga ciągłego pozyskiwania danych z podłączonych czujników, należy zachować ostrożność, aby nie używać opóźnienie() funkcja, ponieważ wstrzymuje się całkowicie wszystko.

na szczęście, opóźnienie() nie jest jedynym sposobem, aby twój program czekał podczas kodowania dla Arduino.

Poznaj Millis ()

The millis () funkcja wykonuje jedno zadanie. Po wywołaniu zwraca (jako długi typ danych) liczba milisekund, które upłynęły od pierwszego uruchomienia programu. Dlaczego to takie przydatne?

Ponieważ używając odrobiny prostej matematyki, możesz łatwo “czas” aspekty twojego programu bez wpływu na jego działanie. Poniżej znajduje się podstawowa demonstracja działania millis (). Jak zobaczysz, program włączy światło LED na 1000 milisekund (jedną sekundę), a następnie wyłączy. Ale co najważniejsze, robi to w sposób nieblokujący.

Zobaczmy teraz, jak to działa z Arduino.

Ten program - który jest w dużej mierze oparty na jednym z oficjalnej dokumentacji Arduino - działa poprzez odjęcie poprzednio zarejestrowanego czasu od bieżącego czasu. Jeśli pozostała część (tj. Czas, który upłynął od ostatniego zarejestrowania czasu) jest większa niż interwał (w tym przypadku 1000 milisekund), program aktualizuje poprzednim razem zmienna do bieżącego czasu i albo włącza, albo wyłącza diodę LED.

A ponieważ jest to nieblokujący, każdy kod, który znajduje się poza tym pierwszym instrukcja if powinien działać normalnie.

Proste, prawda? Zwróć uwagę, jak stworzyliśmy zmienną Obecny czas jako niepodpisany długi. Na niepodpisany wartość oznacza po prostu, że nigdy nie może być ujemna; robimy to, aby maksymalna liczba, którą możemy przechowywać, była większa. Domyślnie zmienne liczbowe są podpisane, co oznacza jedną “kawałek” pamięci dla tej zmiennej służy do przechowywania, czy wartość jest dodatnia czy ujemna. Podając, że będzie to tylko pozytywne, mamy jeszcze jeden kawałek do zabawy.

Przerwania

Do tej pory dowiedzieliśmy się o jednym sposobie podejścia do pomiaru czasu w naszym programie Arduino, który jest lepszy niż opóźnienie(). Ale jest inny, znacznie lepszy sposób, ale bardziej złożony: przerywa. Zaletą tych funkcji jest precyzyjne określenie czasu programu Arduino i szybkie reagowanie na wejście zewnętrzne, ale w trybie asynchroniczny sposób.

Oznacza to, że działa on w połączeniu z programem głównym, stale czekając na wystąpienie zdarzenia, bez przerywania przepływu kodu. Pomaga to skutecznie reagować na zdarzenia, bez wpływu na wydajność procesora Arduino.

Wyzwolenie przerwania powoduje zatrzymanie programu lub wywołanie funkcji znanej powszechnie jako Przerwij obsługę lub Przerwać procedurę serwisową. Po zakończeniu tego programu program wraca do tego, co zamierzał.

Układ AVR zasilający Arduino obsługuje tylko przerwania sprzętowe. Występują one, gdy pin wejściowy zmienia się z wysokiego na niski lub gdy jest wyzwalany przez wbudowane timery Arduino.

Brzmi tajemniczo. Nawet mylące. Ale tak nie jest. Aby zobaczyć, jak działają i zobaczyć przykłady ich użycia w prawdziwym świecie, zapoznaj się z dokumentacją Arduino.

Nie daj się zablokować

Za pomocą millis () co prawda wymaga trochę dodatkowej pracy w porównaniu do używania opóźnienie(). Ale zaufaj mi, twoje programy będą ci za to wdzięczne i bez tego nie będziesz mógł wykonywać wielozadaniowości na Arduino.

Jeśli chcesz zobaczyć przykład millis () wykorzystane w prawdziwym projekcie Arduino, sprawdź Jamesa Bruce'a Arduino Night Light i Sunrise Alarm. Projekt Arduino Lampka nocna i alarm wschodu słońca Projekt Arduino Lampka nocna i alarm wschodu słońca Dzisiaj stworzymy budzik wschodzący, który delikatnie i powoli obudzi cię bez uciekania się do obraźliwej maszyny hałasującej.

Znalazłeś jakieś inne funkcje blokujące, których powinniśmy się wystrzegać? Daj mi znać w komentarzach poniżej, a my porozmawiamy.

Zdjęcie: Arduino (Daniel Spiess), szef kuchni (Ollie Svenson)




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.