5. Przykładowy program #2: Usypianie/Budzenie po przez wbudowany Watchdog
Ten program z kolei będzie działać, na takiej zasadzie, że przez 7 sekund będzie się wykonywać program, a następnie będzie przechodzić na 40 sekund w stan uśpienia, skąd zostanie wybudzony i program się znowu powtórzy.
Schemat:
Program:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include "LowPower.h" //dodaj biliotekę obsługującą oszczędzenie energii void setup() { Serial.begin(9600); //ustaw transmisję UART na 9600 baud } void loop() { delay(200); Serial.println("Tutaj wykonuje swoj program przez 7 sekund a potem ide spac"); delay(7000); Serial.println("Ide spac na 40 sekund"); delay(100); uspij40s(); //przejdź do klasy uspij40s } void uspij40s() { for(int i =0; i<=4;i++) // wykonaj pętle for 5 razy LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //przełącz mikrokontroler w tryb Power-down na 8 sekund, //wyłączając ADC i BoD Serial.println("Wstalem po 40 sekundach"); //wyślij informację na UART o zmianie trybu pracy mikrokontrolera } |
Tutaj zasada działania jest podobna jak w poprzednim przykładzie, lecz tutaj nie korzystamy z zewnętrznych przerwań, a z wbudowanego Watchdoga. Ten element mikrokontrolera pozwala na wyprowadzenie układu (zresetowanie) w momencie, gdy przez dłuższą chwilę będzie on zawieszony. W ATMega328/168 maksymalny czas „zawieszenia” wynosi 8 sekund po czym praca układu jest wznawiana. W pętli głównej programu wykonujemy nasz główny program, w tym przypadku informacja na UART z 7 sekundowym opóźnieniem. Następnie program przechodzi do klasy uspij40s, w której to jest wykonywane uśpienie mikrokontrolera na czas 40 sekund. Aby tego dokonać to musimy ten program wykonać 5 razy co w efekcie da nam 40 sekund „snu” mikrokontrolera. Nie możemy wpisać bezpośrednio SLEEP_40S bo taka funkcja nam się po pierwsze nie skompiluje, a po drugie czas watchdoga to dokładnie 8 sekund. Dlatego więc musimy parokrotnie powtarzać program, aby uzyskać potrzebny przez nas czas. Po wykonaniu 5-krotnie funkcji LowPower.powerDown(), program przechodzi do pętli głównej programu i tak w kółko (do momentu rozładowania baterii ;) ). Ważne aby przy korzystaniu z takiej metody usypiania mikrokontrolera, przeniesienie do klasy „usypiania” było na samym końcu wykonywanego programu.
Efekt pracy programu:
Podsumowanie
Dzisiejsza część kursu jest dosyć treściwa, a zarazem ciekawa. Mam nadzieję, że rozwialiśmy wszelkie problemy związane z oszczędzaniem energii przez Arduino. Zatem po tej części kursu powinieneś umieć:
- Rozróżniać tryby zasilania dla mikrokontrolera ATMega328
- Wykazać różnicę w poborze energii pomiędzy Arduino UNO i ATMega328
- Zaimplementować oszczędzenie energii w trybie zewnętrznego przerwania
- Zaimplementować oszczędzenie energii z wykorzystaniem Watchdoga
Materiały do tej części kursu:
Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij ?Lubię to!? bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )
