Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Pomiar czasu w Arduino

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
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Wykonanie połączeń na płytce stykowej:

Przygotuj potrzebne elementy:

RGfTOp05FSouk
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Podłącz kabel USB i umieść diodę LED w płytce stykowej.

RjiaBF0gUo55d
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Rezystor 100 omega połącz z anodą diody LED.

R196rIC9RLdav
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Przewodem połączeniowym podłącz GND z Arduino do katody diody LED.

R1Tfg46LwNCuu
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Za pomocą przewodu połączeniowego podłącz pin numer 8 z Arduino do rezystora.

R1b28InKwgQXo
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

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:

Linia 1. pinMode otwórz nawias okrągły 8 przecinek OUTPUT zamknij nawias okrągły średnik.

W pętli głównej rozpisujemy algorytm naszego programu:

– zapalamy diodę:

Linia 1. digitalWrite otwórz nawias okrągły 8 przecinek HIGH zamknij nawias okrągły średnik.

– czekamy 1000 ms:

Linia 1. delay otwórz nawias okrągły 1000 zamknij nawias okrągły średnik.

– gasimy diodę:

Linia 1. digitalWrite otwórz nawias okrągły 8 przecinek LOW zamknij nawias okrągły średnik.

– czekamy 1000 ms:

Linia 1. delay otwórz nawias okrągły 1000 zamknij nawias okrągły średnik.

Gotowy program wygląda następująco:

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 1000 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 1000 zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy.

Wgrywamy program i sprawdzamy jego działanie.

Uruchom poniższy film, by zobaczyć prezentację działania programu.

RTFqlJM9IMULg
Film przedstawia moduł Arduino Uno z podpiętym kablem USB, diodę LED wpiętą w płytkę stykową oraz rezystor wpięty w płytkę stykową tak, że jest on połączony jedną nóżką z anodą diody. Katoda diody połączona jest przewodem z masą GND na płytce Arduino Uno. Drugim przewodem połączono wolną nóżkę rezystora z pinem D8. Po uruchomieniu programu, dioda świeci na czerwono.

Zróbmy symulację funkcji delay(), za pomocą środowiska Tinkercad.

Zaloguj się na swoje konto na https://www.tinkercad.com/

R1BSyMkpJ2J2M
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Dodaj do głównego okna symulatora płytkę stykową.

RGXNAV1uDeUPY
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Dodaj moduł Arduino Uno do okna symulacji.

R113X4BVf7tqq
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Do płytki stykowej dodaj diodę LED.

R19QAw2FYQtnm
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Do anody diody dodaj rezystor o wartości 100 omega.

RDEJ70U4CXxal
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Podłącz katodę diody LED z pinem GND Arduino.

RcSby3QqnilQe
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Wolną nóżkę rezystora podepnij pod pin D8 Arduino.

RfdsZZs17dI80
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

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
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Film z działania programu.

R1Q1wnjk8vHnK
Film z działania programu przedstawia okno przeglądarki z otwartą stroną tinkercad. Pod adresem strony znajduje się pasek tytułowy "0936 Arduino – odliczanie czasu". Poniżej znajduje się pasek narzędzi. Od lewej: Obrót w prawo, kosz, cofanie, do przodu, komentarz, po prawo na pasku znajdują się następujące przyciski: Zaznaczony na niebiesko (czyli wybrany) Kod, Uruchom symulację, Eksportuj, Udostępnij. Poniżej główną część okna zajmuje pole robocze, w którym umieszczono płytkę stykową oraz moduł Arduino Uno R3 z kablem USB. W płytkę stykową wpięto diodę LED oraz rezystor 100 omów w taki sposób, że jedna nóżka rezystora jest połączona z anodą diody, czyli są wpięte w ten sam wiersz. Przewodem połączono katodę diody z masą GND. Wolną nóżkę rezystora połączono przewodem z pinem D8. Po prawo znajduje się pole z kodem. Nad polem z listy wybrano Tekst. Kod jest następujący: 1. void setup() { 2. pinMode (8, OUTPUT); 3. } 4. void loop() { 5. digitalWrite (8, HIGH); 6. delay (1000); 7. digitalWrite (8, LOW); 8. delay (1000); 9. } Po wybraniu przycisku Uruchom symulację znajdującego się w górnej lewej części okna, dioda zaczyna świecić na czerwono przez sekundę i gaśnie na sekundę. Cykl powtarza się kilkukrotnie.
Polecenie 1

Zmodyfikuj program tak, aby dioda migała co 2 sekundy.

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
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Wykonanie połączeń na płytce stykowej:

Przygotuj potrzebne elementy.

R15HsphjoPmkm
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Podłącz kabel USB oraz umieść diodę LED w płytce stykowej.

RXJtLjo3N8sQc
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Rezystor 100 omega połącz z anodą diody LED.

RGixQHL7gjlfL
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Przewodem połączeniowym podłącz GND z Arduino do katody diody LED.

RGWejgC43s2DK
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Za pomocą przewodu połączeniowego podłącz pin numer 8 z Arduino do rezystora.

Rsw1EGlUkcARZ
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

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.

Linia 1. pinMode otwórz nawias okrągły 8 przecinek OUTPUT zamknij nawias okrągły średnik.

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:

Linia 1. 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.

– 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
Film z działania programu przedstawia moduł Arduino Uno, podpięty do niego kabel USB oraz diodę LED wpiętą w płytkę stykową. Wolna nóżka rezystora jest podpięta przewodem do pinu D8. Po uruchomieniu programu dioda świeci na czerwono przez jedną sekundę, po czym gaśnie na jedną sekundę. Cykl powtarza się kilkukrotnie.

Zróbmy symulację funkcji millis(), za pomocą środowiska

Nie musimy modyfikować naszego połączenia. Wystarczy przepisać kod dla funkcji millis().

RNyu3iWSF2FQi
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Film z działania programu.

RFvChRf8Io15L
Film przedstawia działanie układu w programie Tinkercad.
Polecenie 2

Zmodyfikuj program tak, aby dioda migała co 2 sekundy.

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 32-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