4. Przykładowy program #1: Usypianie/Budzenie po przez zewnętrzne przerwanie
Zasada działania programu będzie następująca. Od momentu uruchomienia, po 5 sekundach mikrokontroler zmienia swój tryb na Power-down, w którym zostaje „na wieki” do momentu zaistnienia przerwania. Po przerwaniu wychodzi z tego trybu, a następnie po 5 sekundach znowu zmienia swój tryb.
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include "LowPower.h" //dodaj biliotekę obsługującą oszczędzenie energii int odliczanie = 5; //zmienna odpowiedzialna za odliczanie czasu //do uśpienia ATMegi void setup() { pinMode(2, INPUT); //ustaw pin 2 (INT0) jako wejście Serial.begin(9600); //ustaw transmisję UART na 9600 baud } void loop() { //odliczanie czasu Serial.print("Ide spac za: "); Serial.println(odliczanie); odliczanie--; //dekrementujemy (zmniejszamy) zmienną odliczanie o 1 delay(1000); //ustawiamy opóźnienie 1 sekundy if (odliczanie <= 0) { //jeżeli zmienna odliczanie jest mniejsza równa 0 Serial.println("Spie..."); //wyślij informację na UART, że układ przechodzi w stan snu delay(100); //odczekaj 0,1 sekundy na wyświetlenie informacji odliczanie = 5; //ustaw zmienną odliczanie na 5, aby po przebudzeniu można było //wykonywać odliczanie Spanie(); //przenieś wykonywanie programu do klasy Spanie } } void Spanie() { attachInterrupt(0, budzenie, LOW); //jeżeli na pinie 2 pojawi się stan niski to wybudź ATMegę //i przenieś do klasy budzenie LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); //wybieramy tryb Power-down i ustawiamy żeby ATMega spała //cały czas spała przy wyłączonom ADC i BoD do momentu wystąpienia //przerwania } void budzenie() { detachInterrupt(0); //ustawiamy debounce pinu 2, żeby układu nie "wybudził się" dwa razy Serial.println("Nie spie ;)"); //wyślij informację na UART o wybudzeniu } |
Na samym początku importujemy bibliotekę odpowiedzialną za tryby zasilania układu, a następnie definiujemy zmienną odliczanie, która to będzie przechowywać informacje o odliczanym czasie. Następnie w pętli startowej programu, ustawiam pin 2. (INT0) jako pin wejściowy oraz prędkości transmisji UART na 9600 baud. Następnie w pętli głównej programu realizowane jest odliczanie. Wartość początkowa to 5. Po sekundzie zmienna jest zmniejsza o 1. Następnie jeżeli zostanie spełniony warunek, że zmienna odliczanie jest mniejsza bądź równa 0 to ustaw zmienną odliczanie na 5 (aby po wyjściu z tryby Power-down można było znowu realizować odliczanie) i przejdź do klasy Spanie. W klasie Spanie ustawiamy „oczekiwanie” na przerwanie na pinie 2 (INT0) wywołane stanem niskim; po przerwaniu przejście do klasy budzenie. Teraz poniżej wybieram tryb zasilania mikrokontrolera- w naszym przypadku jest to tryb Power-down, w którym będzie układ cały czas, do momentu wystąpienia przerwania. Aby zaoszczędzić jak najwięcej prądu to wyłączyliśmy ADC i BoD. Teraz ważny moment. Może to wyglądać, że jesteśmy w martwym punkcie, ale jak wcześniej wspomniałem, zewnętrzne przerwanie ma bardzo wysoki priorytet, w związku z czym, gdy warunek przerwania zostanie spełniony (stan niski na pinie przerwania) to wykonywanie programu przeniesie się do klasy budzenie, skąd program „wychodzi” i przechodzi do pętli głównej programu. Po wyjściu z tego trybu zasilania, mikrokontroler wyśle na UART wiadomość „nie śpię ;)” po czym zacznie wykonywać znowu pętlę główną programu.
Po wgraniu programu powinniśmy otrzymać taki efekt: