Zużycie energii jest krytycznym problemem dla urządzenia działającego nieprzerwanie przez długi czas bez wyłączania. Aby rozwiązać ten problem, prawie każdy kontroler jest wyposażony w tryb uśpienia, który pomaga programistom w projektowaniu elektronicznych gadżetów pod kątem optymalnego zużycia energii. Tryb uśpienia przełącza urządzenie w tryb oszczędzania energii poprzez wyłączenie nieużywanego modułu.
Wcześniej wyjaśniliśmy tryb głębokiego uśpienia w ESP8266 dla oszczędzania energii. Dziś dowiemy się o trybach uśpienia Arduino i zademonstrujemy zużycie energii za pomocą amperomierza. Tryb uśpienia Arduino jest również nazywany trybem oszczędzania energii Arduino lub trybem gotowości Arduino.
Tryby uśpienia Arduino
Tryby uśpienia pozwalają na zatrzymanie lub wyłączenie nieużywanych modułów w Mikrokontrolerze, co znacznie zmniejsza zużycie energii. Arduino UNO, Arduino Nano i Pro-mini są dostarczane z ATmega328P i mają detektor Brown-Out (BZT), który monitoruje napięcie zasilania w czasie trybu uśpienia.
ATmega328P posiada sześć trybów uśpienia:
Aby wejść w którykolwiek z trybów uśpienia, musimy włączyć bit uśpienia w rejestrze sterowania trybem uśpienia (SMCR.SE). Następnie bity trybu uśpienia wybierają tryb uśpienia spośród bezczynności, redukcji szumów ADC, wyłączenia, oszczędzania energii, czuwania i zewnętrznego czuwania.
Wewnętrzne lub zewnętrzne przerwanie Arduino lub reset może wybudzić Arduino z trybu uśpienia.
Tryb czuwania
Aby wejść w bezczynny tryb uśpienia, wpisz bity SM sterownika '000'. Ten tryb zatrzymuje procesor, ale pozwala na działanie SPI, 2-przewodowego interfejsu szeregowego, USART, Watchdog, liczników, komparatora analogowego. Tryb bezczynności w zasadzie zatrzymuje CLK CPU i CLK FLASH. Arduino można obudzić w dowolnym momencie za pomocą zewnętrznego lub wewnętrznego przerwania.
Kod Arduino dla trybu uśpienia bezczynności:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Istnieje biblioteka do ustawiania różnych trybów niskiego poboru mocy w arduino. Więc najpierw pobierz i zainstaluj bibliotekę z podanego linku i użyj powyższego kodu, aby ustawić Arduino w Idle Sleep Mode. Korzystając z powyższego kodu, Arduino przejdzie w stan uśpienia na osiem sekund i automatycznie się obudzi. Jak widać w kodzie, tryb bezczynności wyłącza wszystkie timery, SPI, USART i TWI (interfejs 2-przewodowy).
Tryb redukcji szumów ADC
Aby użyć tego trybu uśpienia, wpisz bit SM jako „001”. Tryb zatrzymuje procesor, ale pozwala na działanie ADC, przerwania zewnętrznego, USART, 2-przewodowego interfejsu szeregowego, Watchdog i liczników. Tryb redukcji szumów ADC zasadniczo zatrzymuje procesor CLK, CLK I / O i CLK FLASH. Możemy wybudzić kontroler z trybu ADC Noise Reduction następującymi metodami:
- Reset zewnętrzny
- Reset systemu Watchdog
- Watchdog Interrupt
- Reset Brown-Out
- Zgodność adresu 2-przewodowego interfejsu szeregowego
- Przerwanie poziomu zewnętrznego na INT
- Przerwanie zmiany pinu
- Przerwanie timera / licznika
- Przerwanie gotowości SPM / EEPROM
Tryb wyłączenia
Tryb Power-Down zatrzymuje wszystkie generowane zegary i pozwala na działanie tylko modułów asynchronicznych. Można ją włączyć, zapisując bity SM jako „010”. W tym trybie zewnętrzny oscylator wyłącza się, ale 2-przewodowy interfejs szeregowy, watchdog i zewnętrzne przerwanie nadal działają. Można go wyłączyć tylko jedną z poniższych metod:
- Reset zewnętrzny
- Reset systemu Watchdog
- Watchdog Interrupt
- Reset Brown-Out
- Zgodność adresu 2-przewodowego interfejsu szeregowego
- Przerwanie poziomu zewnętrznego na INT
- Przerwanie zmiany pinu
Kod Arduino dla trybu okresowego wyłączania zasilania:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kod służy do włączania trybu wyłączenia. Korzystając z powyższego kodu, Arduino przejdzie w stan uśpienia na osiem sekund i automatycznie się obudzi.
Możemy również skorzystać z trybu wyłączania zasilania z przerwaniem, w którym Arduino przejdzie w stan uśpienia, ale wybudzi się dopiero po zapewnieniu zewnętrznego lub wewnętrznego przerwania.
Kod Arduino dla trybu przerwania wyłączania zasilania:
void loop () { // Zezwól pinowi budzenia na wywołanie przerwania przy niskim poziomie. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Wyłącz zewnętrzne przerwanie kodu PIN na styku wybudzania. detachInterrupt (0); // Zrób coś tutaj }
Tryb oszczędzania energii
Aby wejść w tryb oszczędzania energii, musimy wpisać pin SM jako „011”. Ten tryb uśpienia jest podobny do trybu wyłączenia, tylko z jednym wyjątkiem, tj. Jeśli timer / licznik jest włączony, pozostanie w stanie pracy nawet w momencie uśpienia. Urządzenie można wybudzić za pomocą przepełnienia timera.
Jeśli nie używasz czasu / licznika, zaleca się użycie trybu wyłączenia zamiast trybu oszczędzania energii.
Tryb czuwania
Tryb czuwania jest identyczny z trybem wyłączenia, jedyną różnicą między nimi jest to, że zewnętrzny oscylator pracuje w tym trybie. Aby włączyć ten tryb, wpisz pin SM jako „110”.
Rozszerzony tryb gotowości
Ten tryb jest podobny do trybu oszczędzania energii tylko z jednym wyjątkiem, że oscylator nadal działa. Urządzenie przejdzie w tryb Extended Standby, gdy wpiszemy pin SM jako „111”. Wybudzenie urządzenia z rozszerzonego trybu czuwania zajmie sześć cykli zegara.
Poniżej znajdują się wymagania dla tego projektu, po podłączeniu obwodu zgodnie ze schematem obwodu. Prześlij kod trybu uśpienia do Arduino za pomocą Arduino IDE. Arduino przejdzie w bezczynny tryb uśpienia. Następnie sprawdź pobór prądu w amperomierzu USB. W przeciwnym razie możesz również użyć do tego miernika cęgowego.
Wymagane składniki
- Arduino UNO
- Czujnik temperatury i wilgotności DHT11
- Amperomierz USB
- Płytka prototypowa
- Podłączanie przewodów
Aby dowiedzieć się więcej o używaniu DHT11 z Arduino, kliknij łącze. Tutaj używamy amperomierza USB do pomiaru napięcia zużywanego przez Arduino w trybie uśpienia.
Amperomierz USB
Amperomierz USB to urządzenie typu plug and play służące do pomiaru napięcia i prądu z dowolnego portu USB. Klucz podłączany jest pomiędzy zasilaczem USB (port USB komputera) a urządzeniem USB (Arduino). To urządzenie ma rezystor 0,05ohm połączony z pinem zasilania, przez który mierzy wartość pobieranego prądu. Urządzenie wyposażone jest w cztery siedmiosegmentowe wyświetlacze, które natychmiast wyświetlają wartości prądu i napięcia pobieranego przez podłączone urządzenie. Wartości te zmieniają się co trzy sekundy.
Specyfikacja:
- Zakres napięcia roboczego: od 3,5 V do 7 V.
- Maksymalny prąd znamionowy: 3A
- Kompaktowy rozmiar, łatwy do przenoszenia
- Nie jest potrzebne zewnętrzne zasilanie
Podanie:
- Testowanie urządzeń USB
- Sprawdzanie poziomów obciążenia
- Debugowanie ładowarek akumulatorów
- Fabryki, produkty elektroniczne i do użytku osobistego
Schemat obwodu
W powyższej konfiguracji, aby zademonstrować tryby głębokiego uśpienia Arduino, Arduino jest podłączony do amperomierza USB. Następnie amperomierz USB jest podłączany do portu USB laptopa. Pin danych czujnika DHT11 jest połączony z pinem D2 Arduino.
Objaśnienie kodu
Kompletny kod projektu wraz z filmem znajduje się na końcu.
Kod zaczyna się od włączenia biblioteki czujnika DHT11 i biblioteki LowPower . Aby pobrać bibliotekę Low Power, kliknij łącze. Następnie zdefiniowaliśmy numer pinu Arduino, do którego jest podłączony pin danych DHT11 i utworzyliśmy obiekt DHT.
#zawierać
W funkcji void setup zainicjowaliśmy komunikację szeregową za pomocą serial.begin (9600), tutaj 9600 jest szybkością transmisji. Używamy wbudowanej diody Arduino jako wskaźnika trybu uśpienia. Więc ustawiliśmy pin jako wyjście, a zapis cyfrowy jest niski.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
W funkcji void loop wykonujemy wbudowaną diodę LED HIGH oraz odczytujemy dane temperatury i wilgotności z czujnika. Tutaj DHT.read11 (); komenda odczytuje dane z czujnika. Po obliczeniu danych możemy sprawdzić wartości, zapisując je w dowolnej zmiennej. Tutaj wzięliśmy dwie zmienne typu float „t” i „h” . W związku z tym dane dotyczące temperatury i wilgotności są drukowane szeregowo na monitorze szeregowym.
void loop () { Serial.println ("Pobierz dane z DHT11"); opóźnienie (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT. wilgotność; Serial.print ("Temperatura ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Wilgotność ="); Serial.print (h); Serial.println ("%"); opóźnienie (2000);
Przed włączeniem trybu uśpienia drukujemy „Arduino: - idę na drzemkę” i robimy wbudowaną diodę LED Low. Następnie tryb uśpienia Arduino jest włączany za pomocą polecenia wymienionego poniżej w kodzie.
Poniższy kod włącza bezczynny okresowy tryb uśpienia Arduino i daje ośmiosekundowy sen. Przełącza ADC, Timery, SPI, USART, 2-przewodowy interfejs w stan OFF.
Następnie automatycznie wybudza Arduino ze snu po 8 sekundach i drukuje „Arduino: - Hej, właśnie się obudziłem”.
Serial.println ("Arduino: - Idę na drzemkę"); opóźnienie (1000); digitalWrite (LED_BUILTIN, LOW); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Hej, właśnie się obudziłem"); Serial.println (""); opóźnienie (2000); }
Dzięki temu kodowi Arduino będzie budził się tylko na 24 sekundy na minutę i pozostanie w trybie uśpienia przez resztę 36 sekund, co znacznie obniży pobór mocy przez stację pogodową Arduino.
Dlatego jeśli używamy Arduino w trybie uśpienia, możemy w przybliżeniu podwoić czas działania urządzenia.