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

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

Kiedy po raz pierwszy zacząłeś nauka rozwoju dla Arduino , prawdopodobnie zbudowałeś produkt, który działa trochę tak:





Połączony z Arduino byłby pojedynczym światłem LED. To wyłączałoby się i wyłączało co sekundę i będzie trwało, dopóki Arduino nie zostanie wyłączone. To jest program „Hello World” firmy Arduino i doskonale ilustruje, jak zaledwie kilka linijek kodu może stworzyć coś namacalnego.





Mogę się też założyć, że użyłeś opóźnienie() funkcja pozwalająca na zdefiniowanie odstępów czasu pomiędzy włączaniem i wyłączaniem światła. Ale o to chodzi: chociaż opóźnienie jest przydatne do podstawowych demonstracji działania Arduino, naprawdę nie powinieneś używać go w prawdziwym świecie. Oto dlaczego – i czego powinieneś użyć zamiast tego.





Jak działa funkcja Delay()?

Sposób, w jaki opóźnienie() działa funkcja jest dość prosta. Akceptuje pojedynczy argument będący liczbą całkowitą (lub liczbą). Liczba ta reprezentuje czas (mierzony w milisekundach), przez który program powinien czekać, aż przejdzie do następnego wiersza kodu.

Ale problem polega na tym, że opóźnienie() Funkcja nie jest dobrym sposobem na skłonienie programu do oczekiwania, ponieważ jest to tak zwana funkcja „blokująca”.



wyszukuj i pobieraj muzykę za darmo

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

Aby zilustrować, dlaczego funkcje blokujące są złe, wyobraź sobie dwóch różnych szefów kuchni w kuchni: Henry blokuje , oraz Eduardo bez blokowania . Obaj wykonują tę samą pracę, ale na szalenie różne sposoby.

Kiedy Henry robi śniadanie, zaczyna od włożenia dwóch bułek do tostera. Kiedy w końcu? pingi , a chleb wyskakuje złotobrązowo, Henry kładzie go na talerzu i rozbija dwa jajka na patelnię. Znowu stoi, gdy olej pęka, a białka zaczynają twardnieć. Kiedy skończą, nakłada je na talerz i zaczyna smażyć dwie plastry 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 się opieka, on już zaczął smażyć jajka i bekon. Zamiast czekać, aż jeden przedmiot skończy się gotować, zanim przejdzie do następnego, gotuje wiele przedmiotów jednocześnie . Końcowy rezultat jest taki, że Eduardo potrzebuje mniej czasu na zrobienie śniadania niż Henry – a zanim Henry Blocking skończy, tosty i jajka wystygły.

To głupia analogia, ale ilustruje to, o co chodzi.





Bloking funkcje uniemożliwiają programowi wykonanie czegokolwiek innego, dopóki dane zadanie nie zostanie zakończone. Jeśli chcesz wiele działania aby wydarzyło się w tym samym czasie, po prostu nie możesz użyć opóźnienie() .

W szczególności, jeśli Twoja aplikacja wymaga ciągłego pobierania danych z podłączonych czujników, powinieneś uważać, aby nie używać opóźnienie() funkcja, ponieważ zatrzymuje się absolutnie wszystko .

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

Poznaj Millisa()

ten milis() funkcja wykonuje jedno zadanie. Po wywołaniu zwraca (jako a długie datatype) liczba milisekund, które upłynęły od pierwszego uruchomienia programu. Dlaczego to jest przydatne?

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

Przyjrzyjmy się teraz, jak to działa z Arduino.

Ten program - która jest mocno oparta na jeden z oficjalnej dokumentacji Arduino - działa poprzez odjęcie poprzedniego zarejestrowanego czasu od czasu bieżącego. Jeżeli pozostała część (tzn. czas, jaki upłynął od ostatniego zarejestrowania czasu) jest większa niż interwał (w tym przypadku 1000 milisekund), program aktualizuje poprzednim razem zmienna do aktualnego czasu i włącza lub wyłącza diodę LED.

jak nagrać wideo ze strony internetowej

A ponieważ jest to kod nieblokujący, każdy kod znajdujący się poza tym pierwszym oświadczenie if powinien działać normalnie.

Proste, prawda? Zwróć uwagę, jak stworzyliśmy zmienną Obecny czas jako an bez znaku długie. jakiś bez znaku wartość oznacza po prostu, że nigdy nie może być ujemna; robimy to, aby maksymalna liczba, jaką możemy przechowywać, była większa. Domyślnie zmienne liczbowe są podpisane, co oznacza, że ​​jeden „bit” pamięci dla tej zmiennej jest używany do przechowywania, czy wartość jest dodatnia, czy ujemna. Określając, że będzie to tylko pozytywne, mamy dodatkowy bit do zabawy.

Przerwania

Do tej pory poznaliśmy jeden sposób podejścia do synchronizacji w naszym programie Arduino, który jest lepszy niż opóźnienie() . Ale jest inny, znacznie lepszy sposób, ale bardziej złożony: przerywa . Mają one tę zaletę, że pozwalają precyzyjnie określić czas programu Arduino i szybko reagować na dane wejściowe, ale w krótkim czasie asynchroniczny sposób.

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

Kiedy przerwanie jest wyzwalane, albo zatrzymuje program, albo wywołuje funkcję, powszechnie znaną jako an Obsługa przerwań lub Procedura przerwania usługi . Gdy to zostanie zakończone, program wraca do tego, do czego zmierzał.

Układ AVR zasilający Arduino obsługuje tylko przerwania sprzętowe. Dzieje się tak, gdy pin wejściowy przechodzi z wysokiego na niski lub gdy jest wyzwalany przez wbudowane zegary Arduino.

Brzmi tajemniczo. Nawet mylące. Ale tak nie jest. Aby zobaczyć, jak działają i zobaczyć kilka przykładów ich użycia w prawdziwym świecie, trafiłem na dokumentację Arduino .

Nie daj się zablokować

Za pomocą mili() co prawda wymaga trochę dodatkowej pracy w porównaniu z używaniem opóźnienie() . Ale zaufaj mi, twoje programy ci za to podziękują, a bez tego nie możesz wykonywać wielozadaniowości na Arduino.

Jeśli chcesz zobaczyć przykład milis() używany w prawdziwym projekcie Arduino, sprawdź Arduino Night Light i Sunrise Alarm Jamesa Bruce'a.

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

Kredyty fotograficzne: Arduino (Daniel Spiess) , Szef (Ollie Svenson)

Udział Udział Ćwierkać E-mail Czy warto uaktualnić do systemu Windows 11?

Windows został przeprojektowany. Ale czy to wystarczy, aby przekonać Cię do przejścia z Windows 10 na Windows 11?

Czytaj dalej
Powiązane tematy
  • majsterkowanie
  • Programowanie
  • Arduino
O autorze Mateusz Hughes(386 opublikowanych artykułów)

Matthew Hughes jest programistą i pisarzem z Liverpoolu w Anglii. Rzadko można go znaleźć bez filiżanki mocnej czarnej kawy w dłoni i absolutnie uwielbia swojego Macbooka Pro i swój aparat. Możesz przeczytać jego bloga na http://www.matthewhughes.co.uk i śledzić go na Twitterze pod adresem @matthewhughes.

jak powiększyć komputer Mac za pomocą gładzika
Więcej od Matthew Hughesa

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować