Spotřeba energie je kritickým problémem pro zařízení, které běží nepřetržitě po dlouhou dobu, aniž by bylo vypnuto. K překonání tohoto problému je téměř každý řadič vybaven režimem spánku, který vývojářům pomáhá navrhovat elektronické přístroje pro optimální spotřebu energie. Režim spánku přepne zařízení do režimu úspory energie vypnutím nepoužívaného modulu.
Dříve jsme vysvětlili režim hlubokého spánku v ESP8266 pro úsporu energie. Dnes se seznámíme s režimy spánku Arduino a předvedeme spotřebu energie pomocí ampérmetru. Režim spánku Arduino se také označuje jako režim úspory energie Arduino nebo pohotovostní režim Arduino.
Režimy spánku Arduino
Režimy spánku umožňují uživateli zastavit nebo vypnout nepoužívané moduly v mikrokontroléru, což výrazně snižuje spotřebu energie. Arduino UNO, Arduino Nano a Pro-mini jsou dodávány s ATmega328P a mají detektor Brown-out (BOD), který monitoruje napájecí napětí v době režimu spánku.
V ATmega328P je šest režimů spánku:
Pro vstup do některého z režimů spánku musíme povolit bit spánku v kontrolním registru režimu spánku (SMCR.SE). Poté bity pro výběr režimu spánku vyberte režim spánku mezi nečinností, redukcí šumu ADC, vypnutím, úsporným režimem, pohotovostním režimem a externím pohotovostním režimem.
Interní nebo externí Arduino přeruší nebo Reset může probudit Arduino z režimu spánku.
Klidový režim
Pro vstup do režimu nečinnosti zadejte SM bity řadiče „000“. Tento režim zastaví CPU, ale umožní provoz SPI, 2vodičového sériového rozhraní, USART, Watchdog, čítače, analogový komparátor. Klidový režim v zásadě zastaví CLK CPU a CLK FLASH. Arduino lze kdykoli probudit pomocí externího nebo interního přerušení.
Kód Arduino pro režim nečinnosti:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
K dispozici je knihovna pro nastavení různých režimů nízké spotřeby v arduinu. Nejprve si tedy stáhněte a nainstalujte knihovnu z daného odkazu a pomocí výše uvedeného kódu přepněte Arduino do klidového režimu spánku. Použitím výše uvedeného kódu přejde Arduino do osmisekundového spánku a automaticky se probudí. Jak vidíte v kódu, že klidový režim vypne všechny časovače, SPI, USART a TWI (2vodičové rozhraní).
Režim redukce šumu ADC
Chcete-li použít tento režim spánku, zapište bit SM na '001'. Režim zastaví CPU, ale umožní provoz ADC, externího přerušení, USART, 2vodičového sériového rozhraní, Watchdogu a čítačů. Režim redukce šumu ADC v zásadě zastaví procesory CLK, CLK I / O a CLK FLASH. Ovladač můžeme probudit z režimu redukce šumu ADC následujícími způsoby:
- Externí reset
- Hlídací pes Reset systému
- Hlídací pes je přerušen
- Brown-out reset
- Shoda dvouvodičového sériového rozhraní
- Přerušení externí úrovně na INT
- Přerušení výměny kolíku
- Přerušení časovače / čítače
- Přerušení připraveno na SPM / EEPROM
Režim vypnutí
Režim vypnutí zastaví všechny generované hodiny a umožní pouze provoz asynchronních modulů. Lze jej povolit zápisem bitů SM na „010“. V tomto režimu se externí oscilátor vypne, ale 2vodičové sériové rozhraní, hlídací pes a externí přerušení nadále fungují. Lze jej deaktivovat pouze jednou z níže uvedených metod:
- Externí reset
- Hlídací pes Reset systému
- Hlídací pes je přerušen
- Brown-out reset
- Shoda dvouvodičového sériového rozhraní
- Přerušení externí úrovně na INT
- Přerušení výměny kolíku
Arduino kód pro periodické vypínání:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kód se používá k zapnutí režimu vypnutí. Použitím výše uvedeného kódu přejde Arduino do osmisekundového spánku a automaticky se probudí.
Můžeme také použít režim vypnutí s přerušením, kdy Arduino přejde do režimu spánku, ale probudí se, pouze když je k dispozici externí nebo interní přerušení.
Arduino kód pro režim přerušení napájení:
void loop () { // Umožnit probuzení kolíku spustit přerušení na nízké úrovni. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Zakázat přerušení externího kolíku na kolíku probuzení. detachInterrupt (0); // Udělejte něco zde }
Režim úspory energie
Pro vstup do úsporného režimu musíme napsat SM pin na '011'. Tento režim spánku je podobný režimu vypnutí, pouze s jednou výjimkou, tj. Pokud je povolen časovač / čítač, zůstane v provozním stavu i v době spánku. Zařízení lze probudit pomocí přetečení časovače.
Pokud nepoužíváte čas / čítač, doporučujeme místo úsporného režimu použít režim vypnutí.
Pohotovostní režim
Pohotovostní režim je totožný s režimem vypnutí, jediným rozdílem mezi nimi je externí oscilátor, který v tomto režimu běží. Pro aktivaci tohoto režimu napište SM pin na '110'.
Rozšířený pohotovostní režim
Tento režim je obdobou režimu úspory energie pouze s jednou výjimkou, že oscilátor běží dál. Když zapíšeme pin SM na „111“, zařízení přejde do režimu rozšířeného pohotovostního režimu. Zařízení se probudí z prodlouženého pohotovostního režimu šesti hodinovými cykly.
Níže jsou uvedeny požadavky na tento projekt po připojení obvodu podle schématu zapojení. Nahrajte kód režimu spánku do Arduina pomocí Arduino IDE. Arduino přejde do režimu nečinnosti. Poté zkontrolujte proudový odběr do USB ampérmetru. Jinak můžete také použít klešťový měřič.
Požadované komponenty
- Arduino UNO
- Snímač teploty a vlhkosti DHT11
- USB ampérmetr
- Nepájivá deska
- Připojení vodičů
Chcete-li se dozvědět více o používání DHT11 s Arduinem, klikněte na odkaz. Zde používáme USB ampérmetr k měření napětí spotřebovaného Arduinem v režimu spánku.
USB ampérmetr
USB ampérmetr je zařízení typu plug and play, které se používá k měření napětí a proudu z libovolného portu USB. Klíč se zapojuje mezi napájecí zdroj USB (port USB počítače) a zařízení USB (Arduino). Toto zařízení má rezistor 0,05 ohmů zapojený do napájecího kolíku, kterým měří hodnotu odebíraného proudu. Zařízení je dodáváno se čtyřmi sedmi segmentovými displeji, které okamžitě zobrazují hodnoty proudu a napětí spotřebovaného připojeným zařízením. Tyto hodnoty se mění v intervalu každé tři sekundy.
Specifikace:
- Rozsah provozního napětí: 3,5 V až 7 V.
- Maximální jmenovitý proud: 3A
- Kompaktní velikost, snadno se nosí
- Není potřeba žádné externí napájení
Aplikace:
- Testování zařízení USB
- Kontrola úrovní zatížení
- Ladění nabíječek baterií
- Továrny, elektronické výrobky a osobní použití
Kruhový diagram
Ve výše uvedeném nastavení pro demonstraci režimů hlubokého spánku Arduino je Arduino zapojeno do USB ampérmetru. Poté je USB ampérmetr zapojen do USB portu notebooku. Datový kolík senzoru DHT11 je připojen k kolíku D2 Arduina.
Vysvětlení kódu
Celý kód projektu s videem je uveden na konci.
Kód začíná zahrnutím knihovny pro snímač DHT11 a knihovny LowPower . Pro stažení knihovny s nízkou spotřebou energie klikněte na odkaz. Poté jsme definovali číslo kolíku Arduino, ke kterému je datový kolík DHT11 připojen, a vytvořili jsme objekt DHT.
#zahrnout
Ve funkci nastavení neplatnosti jsme zahájili sériovou komunikaci pomocí serial.begin (9600), zde je 9600 přenosová rychlost. Jako indikátor spánkového režimu používáme integrovanou LED diodu Arduino. Takže jsme nastavili pin jako výstup a digitální zápis je nízký.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, VÝSTUP); digitalWrite (LED_BUILTIN, LOW); }
Ve funkci void loop vytváříme vestavěnou LED HIGH a načítáme údaje o teplotě a vlhkosti ze snímače. Zde DHT.read11 (); příkaz čte data ze snímače. Jakmile jsou data vypočítána, můžeme zkontrolovat hodnoty jejich uložením do libovolné proměnné. Zde jsme vzali dvě proměnné typu float 't' a 'h' . Proto jsou data o teplotě a vlhkosti vytištěna sériově na sériovém monitoru.
void loop () { Serial.println ("Získat data z DHT11"); zpoždění (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT.vlhkost; Serial.print ("Teplota ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Vlhkost ="); Sériový tisk (h); Serial.println ("%"); zpoždění (2000);
Před aktivací režimu spánku tiskneme „Arduino: - Jdu si zdřímnout“ a vytváříme vestavěnou LED Low. Poté je režim spánku Arduino povolen pomocí příkazu uvedeného níže v kódu.
Níže uvedený kód umožňuje nečinný periodický režim spánku Arduina a poskytuje spánek osm sekund. Přepne ADC, časovače, SPI, USART, 2vodičové rozhraní do stavu VYPNUTO.
Poté se automaticky probudí Arduino z režimu spánku po 8 sekundách a vytiskne „Arduino: - Hej, právě jsem se probudil“.
Serial.println ("Arduino: - Jdu si zdřímnout"); zpoždění (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, právě jsem se probudil"); Serial.println (""); zpoždění (2000); }
Použitím tohoto kódu se tedy Arduino probudí pouze 24 sekund za minutu a zůstane v režimu spánku po zbytek 36 sekund, což výrazně sníží spotřebu energie meteorologické stanice Arduino.
Pokud tedy používáme Arduino s režimem spánku, můžeme přibližně zdvojnásobit dobu běhu zařízení.