Projektant systemu wbudowanego musi się zmierzyć z problemem nadania odpowiedniego tempa wykonywania swojego programu. Czy dotyczy to zapalenia diody LED, czy obsługi przekaźnika, oczekujemy działania w określonym czasie. Platforma Arduino umożliwia wykorzystanie dwóch metod odmierzania czasu w programie.
Funkcja delay() – czym jest i do czego służy
Jest to funkcja, która po wywołaniu zatrzymuje działanie programu na podaną jako argument liczbę ms. Oto przykład jej zastosowania:
Linia 1. digitalWrite otwórz nawias okrągły ledPin przecinek HIGH zamknij nawias okrągły średnik.
Linia 2. delay otwórz nawias okrągły 100 zamknij nawias okrągły średnik.
Linia 3. digitalWrite otwórz nawias okrągły ledPin przecinek LOW zamknij nawias okrągły średnik.
Jak widać w powyższym przykładzie, po przejściu w stan wysoki pinu ledPin następuje odczekanie 100 ms, po czym pin ledPin przechodzi w stan niski.
Ważne!
Pamiętaj, że mikrokontroler (po wywołaniu funkcji) oczekuje na jej zakończenie, będąc w stanie zablokowanym – czyli w stanie bezczynności.
Funkcja delay() – ćwiczenie
Co nam będzie potrzebne:
przewody połączeniowe męsko‑męskie,
Arduino Uno,
rezystor 100 Ωomega,
dioda LED,
kabel USB typu A‑B do podłączenia do komputera.
Układ budujemy zgodnie z następującym schematem:
RJAWh0GDLf8ZX
Wykonanie połączeń na płytce stykowej:
Przygotuj potrzebne elementy:
RGfTOp05FSouk
Podłącz kabel USB i umieść diodę LED w płytce stykowej.
RjiaBF0gUo55d
Rezystor 100 Ωomega połącz z anodą diody LED.
R196rIC9RLdav
Przewodem połączeniowym podłącz GND z Arduino do katody diody LED.
R1Tfg46LwNCuu
Za pomocą przewodu połączeniowego podłącz pin numer 8 z Arduino do rezystora.
R1b28InKwgQXo
Układ jest gotowy do pracy.
Pisanie programu
Otwieramy i zapisujemy nowy sketch w Arduino IDE.
W funkcji setup() określamy tryb pracy pinu numer 8 – pin sterujący LED jako wyjście:
Do anody diody dodaj rezystor o wartości 100 Ωomega.
RDEJ70U4CXxal
Podłącz katodę diody LED z pinem GND Arduino.
RcSby3QqnilQe
Wolną nóżkę rezystora podepnij pod pin D8 Arduino.
RfdsZZs17dI80
Przejdźmy teraz do pisania kodu. W tym celu klikamy na przycisk Kod, z listy rozwijanej wybieramy Tekst, potwierdzamy chęć zmiany widoku i czyścimy zawartość.
Przepisz kod, dopasuj widok okna i uruchom symulację.
R1tHfj48uPwfm
Film z działania programu.
R1Q1wnjk8vHnK
Polecenie 1
Zmodyfikuj program tak, aby dioda migała co 2 sekundy.
Rolvnuzq3Vg00
Linia 1. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. pinMode otwórz nawias okrągły 8 przecinek OUTPUT zamknij nawias okrągły średnik.
Linia 3. zamknij nawias klamrowy.
Linia 4. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. digitalWrite otwórz nawias okrągły 8 przecinek HIGH zamknij nawias okrągły średnik.
Linia 6. delay otwórz nawias okrągły 2000 zamknij nawias okrągły średnik.
Linia 7. digitalWrite otwórz nawias okrągły 8 przecinek LOW zamknij nawias okrągły średnik.
Linia 8. delay otwórz nawias okrągły 2000 zamknij nawias okrągły średnik.
Linia 9. zamknij nawias klamrowy.
Funkcja millis() – czym jest i do czego służy
Jest to funkcja, która po wywołaniu zwraca liczbę ms, jaka upłynęła od momentu włączenia zasilania układu. Służy do określania zależności czasowych pomiędzy poszczególnymi instrukcjami/działaniami programu. Przykład zastosowania:
Linia 1. unsigned long czasOdStartu znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
Jak widać w powyższym przykładzie, do zmiennej czasOdStartu typu unsigned longzmienna typu unsigned longunsigned long przypisywana jest wartość ms zwrócona przez funkcję millis(). Należy pamiętać, że po przepełnieniu się zmiennej zliczanie zaczyna się od 0.
Funkcja millis() – ćwiczenie
Co nam będzie potrzebne:
przewody połączeniowe męsko‑męskie,
Arduino Uno,
rezystor 100 Ωomega,
dioda LED,
kabel USB typu A‑B do podłączenia do komputera.
Układ budujemy zgodnie z następującym schematem:
RwyFEZPXtZfsL
Wykonanie połączeń na płytce stykowej:
Przygotuj potrzebne elementy.
R15HsphjoPmkm
Podłącz kabel USB oraz umieść diodę LED w płytce stykowej.
RXJtLjo3N8sQc
Rezystor 100 Ωomega połącz z anodą diody LED.
RGixQHL7gjlfL
Przewodem połączeniowym podłącz GND z Arduino do katody diody LED.
RGWejgC43s2DK
Za pomocą przewodu połączeniowego podłącz pin numer 8 z Arduino do rezystora.
Rsw1EGlUkcARZ
Układ jest gotowy do pracy.
Pisanie programu
Otwieramy i zapisujemy nowy sketch w Arduino IDE.
Na początku przygotowujemy zmienne do przechowywania czasu aktualnego oraz czasu ostatniej zmiany.
Linia 1. unsigned long currentTime średnik prawy ukośnik prawy ukośnik czas aktualny.
Linia 2. unsigned long lastTime średnik prawy ukośnik prawy ukośnik czas ostatniej zmiany LED.
W funkcji setup() określamy tryb pracy pinu numer 8 – pin sterujący LED jako wyjście.
Określamy początkowy czas, od którego rozpoczynamy działanie programu.
Linia 1. lastTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
W pętli głównej rozpisujemy algorytm naszego programu:
– sprawdzamy aktualny czas, który minął od startu zasilania:
Linia 1. currentTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
– wykorzystując instrukcję warunkową, sprawdzamy, czy różnica czasu ostatniego oraz aktualnego jest większa od zadanego przez nas czasu oczekiwania:
Linia 1. if otwórz nawias okrągły otwórz nawias okrągły currentTime minus lastTime zamknij nawias okrągły zamknij nawias ostrokątny znak równości 1000 zamknij nawias okrągły.
– jeśli czas, który minął, jest niewystarczający, wracamy do początku algorytmu; w przeciwnym wypadku ustawiamy stan diody LED na przeciwny względem stanu odczytanego z pinu wyjściowego:
– zapisujemy czas, w którym zmieniliśmy stan diody; ten czas będziemy teraz porównywać, sprawdzając, ile czasu minęło od ostatniej zmiany stanu:
Linia 1. lastTime znak równości currentTime średnik.
Gotowy program wygląda następująco:
Linia 1. unsigned long currentTime średnik prawy ukośnik prawy ukośnik czas aktualny.
Linia 2. unsigned long lastTime średnik prawy ukośnik prawy ukośnik czas ostatniej zmiany LED.
Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. pinMode otwórz nawias okrągły 8 przecinek OUTPUT zamknij nawias okrągły średnik.
Linia 5. lastTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. zamknij nawias klamrowy.
Linia 7. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. currentTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 9. if otwórz nawias okrągły otwórz nawias okrągły currentTime minus lastTime zamknij nawias okrągły zamknij nawias ostrokątny znak równości 1000 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. digitalWrite otwórz nawias okrągły 8 przecinek wykrzyknik digitalRead otwórz nawias okrągły 8 zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 11. lastTime znak równości currentTime średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
Wgrywamy program i sprawdzamy jego działanie.
Uruchom poniższy film, by zobaczyć prezentację działania programu.
RC2kZUH2gSEJ5
Zróbmy symulację funkcji millis(), za pomocą środowiska
Nie musimy modyfikować naszego połączenia. Wystarczy przepisać kod dla funkcji millis().
RNyu3iWSF2FQi
Film z działania programu.
RFvChRf8Io15L
Polecenie 2
Zmodyfikuj program tak, aby dioda migała co 2 sekundy.
RE6kXttviPGjT
Linia 1. unsigned long currentTime średnik prawy ukośnik prawy ukośnik czas aktualny.
Linia 2. unsigned long lastTime średnik prawy ukośnik prawy ukośnik czas ostatniej zmiany LED.
Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. pinMode otwórz nawias okrągły 8 przecinek OUTPUT zamknij nawias okrągły średnik.
Linia 5. lastTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. zamknij nawias klamrowy.
Linia 7. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. currentTime znak równości millis otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 9. if otwórz nawias okrągły otwórz nawias okrągły currentTime minus lastTime zamknij nawias okrągły zamknij nawias ostrokątny znak równości 2000 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. digitalWrite otwórz nawias okrągły 8 przecinek wykrzyknik digitalRead otwórz nawias okrągły 8 zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 11. lastTime znak równości currentTime średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
Ciekawostka
Czy wiesz, że funkcja delay() do swojego działania wykorzystuje wewnątrz funkcję millis()?
Funkcja delay() sprawdza najpierw, ile czasu minęło od uruchomienia Arduino, a następnie tak długo sprawdza, ile minęło czasu, aż zadany przez nas czas opóźnienia zostanie osiągnięty.
Słownik
biblioteka
biblioteka
zbiór funkcji, zazwyczaj dostarczany do większości shieldów w celu ułatwienia pisania kodu; pozwala wykorzystać dany komponent bez potrzeby pisania poszczególnych funkcji
zmienna typu unsigned long
zmienna typu unsigned long
jeden z typów zmiennych występujących w Arduino; zmienna tego typu jest liczbą dodatnią o maksymalnej wartości 2Indeks górny 3232-1
instrukcja warunkowa
instrukcja warunkowa
instrukcja, która wykonuje swoją zawartość tylko wtedy, gdy warunek podany w argumencie instrukcji jest prawdziwy
przepełnienie zmiennej
przepełnienie zmiennej
gdy wartość zmiennej osiąga maksimum, zostaje zresetowana do wartości minimalnej