Spotreba energie je kritickým problémom zariadenia bežiaceho nepretržite po dlhú dobu bez vypnutia. Na prekonanie tohto problému je teda takmer každý radič vybavený režimom spánku, ktorý vývojárom pomáha navrhovať elektronické prístroje pre optimálnu spotrebu energie. Režim spánku prepne zariadenie do režimu úspory energie vypnutím nepoužívaného modulu.
Predtým sme v ESP8266 vysvetlili režim hlbokého spánku pre úsporu energie. Dnes sa dozvieme o režimoch spánku Arduino a ukážeme spotrebu energie pomocou ampérmetra. Režim spánku Arduino sa tiež označuje ako režim úspory energie Arduino alebo pohotovostný režim Arduino.
Režimy spánku Arduino
Režimy spánku umožňujú užívateľovi zastaviť alebo vypnúť nepoužívané moduly v mikrokontroléri, čo výrazne znižuje spotrebu energie. Arduino UNO, Arduino Nano a Pro-mini sú dodávané s procesorom ATmega328P a majú detektor Brown-out (BOD), ktorý monitoruje napájacie napätie v režime spánku.
V ATmega328P je šesť režimov spánku:
Pre vstup do niektorého z režimov spánku musíme povoliť bit spánku v riadiacom registri režimu spánku (SMCR.SE). Potom bity pre výber režimu spánku vyberú režim spánku medzi nečinnosťou, redukciou šumu ADC, vypnutím, úsporným režimom, pohotovostným režimom a externým pohotovostným režimom.
Interné alebo externé prerušenie Arduina alebo resetovanie môže Arduino prebudiť z režimu spánku.
Režim nečinnosti
Pre vstup do pohotovostného režimu napíšte bity SM radiča „000“. Tento režim zastaví procesor, ale umožní fungovanie SPI, dvojvodičového sériového rozhrania, USART, Watchdog, počítadiel, analógového komparátora. Pohotovostný režim v podstate zastaví procesor CLK a CLK FLASH. Arduino je možné kedykoľvek prebudiť použitím externého alebo interného prerušenia.
Arduino kód pre režim nečinnosti:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
K dispozícii je knižnica pre nastavenie rôznych režimov nízkej spotreby v arduino. Najprv si teda stiahnite a nainštalujte knižnicu z daného odkazu a pomocou vyššie uvedeného kódu prepnite Arduino do pohotovostného režimu spánku. Použitím vyššie uvedeného kódu prejde Arduino do spánku na osem sekúnd a automaticky sa prebudí. Ako je vidieť v kóde, že pohotovostný režim vypne všetky časovače, SPI, USART a TWI (dvojvodičové rozhranie).
Režim redukcie šumu ADC
Ak chcete použiť tento režim spánku, napíšte bit SM na „001“. Režim zastaví CPU, ale umožní činnosť ADC, externého prerušenia, USART, dvojvodičového sériového rozhrania, Watchdogu a počítadiel. Režim redukcie šumu ADC v podstate zastaví CLK CPU, CLK I / O a CLK FLASH. Ovládač môžeme prebudiť z režimu redukcie šumu ADC nasledujúcimi spôsobmi:
- Externý reset
- Watchdog Reset systému
- Prerušenie strážneho psa
- Brown-out Reset
- Zhoda adresy dvojvodičového sériového rozhrania
- Prerušenie externej úrovne na INT
- Prerušenie výmeny špendlíka
- Prerušenie časovača / počítadla
- Prerušenie pripravené na SPM / EEPROM
Režim vypnutia
Režim vypnutia zastaví všetky vygenerované hodiny a umožní iba prevádzku asynchrónnych modulov. Môže sa povoliť zápisom bitov SM na „010“. V tomto režime sa externý oscilátor vypne, ale 2-vodičové sériové rozhranie, strážny pes a externé prerušenie naďalej fungujú. Dá sa deaktivovať iba jednou z metód uvedených nižšie:
- Externý reset
- Watchdog Reset systému
- Prerušenie strážneho psa
- Brown-out Reset
- Zhoda adresy dvojvodičového sériového rozhrania
- Prerušenie externej úrovne na INT
- Prerušenie výmeny špendlíka
Arduino kód pre periodické vypnutie:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kód sa používa na zapnutie režimu vypnutia. Použitím vyššie uvedeného kódu prejde Arduino do spánku na osem sekúnd a automaticky sa prebudí.
Môžeme tiež použiť režim vypnutia s prerušením, kedy Arduino prejde do režimu spánku, ale prebudí sa až po poskytnutí externého alebo interného prerušenia.
Arduino kód pre režim prerušenia napájania:
void loop () { // Povoliť prebudeniu PIN spustiť prerušenie na nízkej hodnote. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Zakáže prerušenie externého kolíka na kolíku prebudenia. detachInterrupt (0); // niečo tu urobte }
Úsporný režim
Pre vstup do úsporného režimu musíme napísať SM pin na '011'. Tento režim spánku je obdobou režimu vypínania, iba s jednou výnimkou, tj. Ak je povolený časovač / počítadlo, zostane v prevádzke aj v čase spánku. Zariadenie je možné prebudiť pomocou pretečenia časovača.
Ak nepoužívate čas / počítadlo, namiesto úsporného režimu sa odporúča použiť režim vypnutia.
Pohotovostný režim
Pohotovostný režim je identický s režimom vypnutia, rozdiel medzi nimi je iba v tom, že v tomto režime pracuje externý oscilátor. Pre aktiváciu tohto režimu napíšte SM pin na '110'.
Rozšírený pohotovostný režim
Tento režim je obdobou režimu úspory energie iba s jednou výnimkou, že je oscilátor stále v prevádzke. Keď napíšeme pin SM na „111“, zariadenie prejde do režimu predĺženého pohotovostného režimu. Prebudenie zariadenia z predĺženého pohotovostného režimu bude trvať šesť cyklov hodín.
Ďalej sú uvedené požiadavky na tento projekt po pripojení obvodu podľa schémy zapojenia. Nahrajte kód režimu spánku do Arduina pomocou Arduino IDE. Arduino prejde do pohotovostného režimu spánku. Potom skontrolujte prúdový odber do USB ampérmetra. Inak môžete na to isté použiť aj kliešťový merač.
Súčasti sú povinné
- Arduino UNO
- Snímač teploty a vlhkosti DHT11
- USB ampérmeter
- Nepál
- Pripojenie drôtov
Ak sa chcete dozvedieť viac o používaní DHT11 s Arduinom, kliknite na odkaz. Tu používame USB ampérmeter na meranie napätia spotrebovaného Arduinom v režime spánku.
USB ampérmeter
USB ampérmeter je zariadenie typu plug and play, ktoré sa používa na meranie napätia a prúdu z ľubovoľného portu USB. Kľúč sa pripája medzi napájací zdroj USB (port USB počítača) a zariadenie USB (Arduino). Toto zariadenie má rezistor 0,05 ohmov zapojený do napájacieho kolíka, cez ktorý meria hodnotu odoberaného prúdu. Zariadenie sa dodáva so štyrmi sedem segmentovým displejom, ktorý okamžite zobrazuje hodnoty prúdu a napätia spotrebovaného pripojeným zariadením. Tieto hodnoty sa menia v intervale každé tri sekundy.
Špecifikácia:
- Rozsah prevádzkového napätia: 3,5 V až 7 V.
- Maximálny prúdový prúd: 3A
- Kompaktná veľkosť, ľahko sa prenáša
- Nie je potrebné žiadne externé napájanie
Prihláška:
- Testovanie zariadení USB
- Kontrola úrovní zaťaženia
- Ladenie nabíjačiek batérií
- Továrne, elektronické výrobky a osobné použitie
Schéma zapojenia
Vo vyššie uvedenom nastavení na demonštráciu režimov hlbokého spánku Arduino je Arduino zapojené do USB ampérmetra. Potom je USB ampérmeter zapojený do USB portu notebooku. Dátový kolík snímača DHT11 je pripojený k kolíku D2 Arduina.
Vysvetlenie kódu
Celý kód projektu s videom je uvedený na konci.
Kód začína zahrnutím knižnice pre snímač DHT11 a knižnice LowPower . Pre stiahnutie knižnice Low Power kliknite na odkaz. Potom sme definovali číslo kolíka Arduino, ku ktorému je pripojený dátový kolík DHT11, a vytvorili sme objekt DHT.
#include
Vo funkcii nastavenia neplatnosti sme zahájili sériovú komunikáciu pomocou serial.begin (9600), tu je 9600 prenosová rýchlosť. Ako indikátor režimu spánku používame zabudovanú LED diódu Arduino. Takže sme nastavili kolík ako výstup a digitálny zápis bol nízky.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, VÝSTUP); digitalWrite (LED_BUILTIN, LOW); }
Vo funkcii prázdnej slučky vytvárame zabudovanú LED diódu VYSOKÁ a načítame údaje o teplote a vlhkosti zo snímača. Tu DHT.read11 (); príkazom je načítanie údajov zo senzora. Po výpočte údajov môžeme hodnoty skontrolovať ich uložením do ľubovoľnej premennej. Tu sme vzali dve premenné typu float 't' a 'h' . Údaje o teplote a vlhkosti sa preto tlačia sériovo na sériový monitor.
void loop () { Serial.println ("Získať údaje z DHT11"); oneskorenie (1 000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; plavák h = DHT.vlhkosť; Serial.print ("Teplota ="); Sériová tlač (t); Serial.print ("C -"); Serial.print ("Vlhkosť ="); Sériová tlač (h); Serial.println ("%"); meškanie (2000);
Pred povolením režimu spánku tlačíme „Arduino: - Idem na zdřímnutí“ a vstavaná LED Low. Potom je režim spánku Arduino povolený pomocou príkazu uvedeného nižšie v kóde.
Nižšie uvedený kód umožňuje nečinný režim periodického spánku Arduina a poskytuje spánok osem sekúnd. Prepne dvojvodičové rozhranie ADC, časovače, SPI, USART do stavu VYPNUTÉ.
Potom sa automaticky prebudí Arduino z režimu spánku po 8 sekundách a vytlačí „Arduino: - Hej, práve som sa zobudil“.
Serial.println ("Arduino: - idem si zdriemnuť"); oneskorenie (1 000); 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áve som sa zobudil"); Serial.println (""); meškanie (2000); }
Použitím tohto kódu sa teda Arduino zobudí iba 24 sekúnd za minútu a zostane v režime spánku po zvyšok 36 sekúnd, čo výrazne zníži energiu spotrebovanú meteorologickou stanicou Arduino.
Ak teda používame Arduino s režimom spánku, môžeme zhruba zdvojnásobiť dobu chodu zariadenia.