Poraba energije je kritična težava za napravo, ki deluje neprekinjeno dlje časa, ne da bi bila izklopljena. Da bi rešili to težavo, ima skoraj vsak krmilnik način spanja, ki razvijalcem pomaga pri oblikovanju elektronskih pripomočkov za optimalno porabo energije. Način spanja preklopi napravo v način varčevanja z energijo tako, da izklopi neuporabljeni modul.
Prej smo v ESP8266 za varčevanje z energijo razložili način globokega spanja. Danes se bomo seznanili z načini mirovanja Arduino in prikazali porabo energije z uporabo ampermetra. Način spanja Arduino se imenuje tudi način Arduino Power Save ali Arduino Standby Mode.
Načini spanja Arduino
Načini mirovanja omogočajo uporabniku, da ustavi ali izklopi neuporabljene module v mikrokrmilniku, kar znatno zmanjša porabo energije. Arduino UNO, Arduino Nano in Pro-mini so opremljeni z ATmega328P in vgrajenim Brown-out detektorjem (BOD), ki nadzira napajalno napetost v načinu spanja.
V ATmega328P je šest načinov spanja:
Za vstop v kateri koli način spanja moramo omogočiti bit spanja v registru za nadzor spanja (SMCR.SE). Nato biti za izbiro načina mirovanja izberejo način mirovanja v stanju pripravljenosti, zmanjšanju šuma ADC, izklopu, varčevanju z energijo, stanju pripravljenosti in zunanjem stanju pripravljenosti.
Notranji ali zunanji Arduino prekine ali ponastavitev lahko Arduino prebudi iz stanja spanja.
V stanju pripravljenosti
Za vstop v način mirovanja v stanju pripravljenosti zapišite SM-bit brskalnika '000'. Ta način ustavi CPU, vendar omogoča delovanje SPI, dvožičnega serijskega vmesnika, USART, Watchdoga, števcev in analognega primerjalnika. V stanju pripravljenosti v bistvu ustavi CPU CLK in CLK FLASH. Arduino lahko kadar koli prebudite z zunanjo ali notranjo prekinitvijo.
Koda Arduino za način mirovanja:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Obstaja knjižnica za nastavitev različnih načinov nizke porabe v arduinu. Torej najprej prenesite in namestite knjižnico z dane povezave in z zgornjo kodo Arduino preklopite v način mirovanja. Z uporabo zgornje kode bo Arduino zaspal osem sekund in se samodejno prebudil. Kot lahko vidite v kodi, način mirovanja izklopi vse časovnike, SPI, USART in TWI (dvožični vmesnik).
Način za zmanjšanje šuma ADC
Za uporabo tega načina spanja napišite bit SM na '001'. Način ustavi CPU, vendar omogoča delovanje ADC, zunanje prekinitve, USART, dvožičnega serijskega vmesnika, Watchdoga in števcev. Način ADC za zmanjšanje šuma v bistvu ustavi CPU CLK, CLK I / O in CLK FLASH. Krmilnik lahko iz načina ADC za zmanjšanje šuma zbudimo na naslednje načine:
- Zunanja ponastavitev
- Ponastavitev sistema Watchdog
- Watchdog Interrupt
- Ponastavitev Brown-out
- Ujemanje naslova dvožičnega serijskega vmesnika
- Prekinitev zunanje ravni na INT
- Prekinitev zamenjave zatiča
- Prekinitev časovnika / števca
- Prekinitev SPM / EEPROM
Način izklopa
Način izklopa ustavi vse ustvarjene ure in omogoča samo delovanje asinhronih modulov. To lahko omogočite tako, da SM bitov zapišete v '010'. V tem načinu se zunanji oscilator izklopi, vendar dvožični serijski vmesnik, nadzorni pas in zunanja prekinitev še naprej delujejo. Onemogoči ga lahko samo eden od spodnjih načinov:
- Zunanja ponastavitev
- Ponastavitev sistema Watchdog
- Watchdog Interrupt
- Ponastavitev Brown-out
- Ujemanje naslova dvožičnega serijskega vmesnika
- Prekinitev zunanje ravni na INT
- Prekinitev zamenjave zatiča
Koda Arduino za periodični način izklopa:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Koda se uporablja za vklop načina izklopa. Z uporabo zgornje kode bo Arduino zaspal osem sekund in se samodejno prebudil.
Način izklopa lahko uporabimo tudi s prekinitvijo, kjer Arduino preide v stanje spanja, vendar se zbudi šele, ko je zagotovljena zunanja ali notranja prekinitev.
Koda Arduino za način prekinitve izklopa:
void loop () { // Dovoli, da se zatič sproži, da sproži prekinitev pri nizkem. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Onemogoči zunanjo prekinitev zatiča na budečem zatiču. detachInterrupt (0); // Naredi nekaj tukaj }
Način za varčevanje z energijo
Za vstop v način varčevanja z energijo moramo zatič SM napisati na '011'. Ta način spanja je podoben načinu izklopa, le z eno izjemo, tj. Če je časovnik / števec omogočen, ostane v stanju delovanja tudi med spanjem. Napravo lahko zbudite z uporabo prelivanja časovnika.
Če ne uporabljate ure / števca, je priporočljivo, da namesto načina varčevanja z energijo uporabite način izklopa.
Stanje pripravljenosti
V stanju pripravljenosti je enak načinu izklopa, edina razlika med njimi je zunanji oscilator, ki deluje v tem načinu. Če želite omogočiti ta način, zapišite SM pin na '110'.
Razširjeni način pripravljenosti
Ta način je podoben načinu varčevanja z energijo, le z eno izjemo, da oscilator še naprej deluje. Naprava bo prešla v način razširjenega stanja pripravljenosti, ko SM zapišemo na '111'. Iz razširjenega stanja pripravljenosti se naprava preklopi v šest urnih ciklov.
Spodaj so zahteve za ta projekt, po priključitvi vezja v skladu s shemo vezja. Naložite kodo načina spanja v Arduino z uporabo Arduino IDE. Arduino bo prešel v način mirovanja v prostem teku. Nato preverite trenutno porabo v ampermetru USB. V nasprotnem primeru lahko za isto uporabite tudi merilnik spone.
Potrebne komponente
- Arduino UNO
- DHT11 Senzor temperature in vlage
- USB ampermeter
- Breadboard
- Povezovanje žic
Če želite izvedeti več o uporabi DHT11 z Arduino, sledite povezavi. Tu uporabljamo USB-ampermeter za merjenje napetosti, ki jo porabi Arduino v načinu spanja.
USB ampermeter
USB ampermeter je naprava plug and play, ki se uporablja za merjenje napetosti in toka iz vseh vrat USB. Dongle se priključi med napajalnikom USB (vrata USB računalnika) in napravo USB (Arduino). Ta naprava ima upor 0,05 ohma v liniji z napajalnim zatičem, skozi katerega meri vrednost porabljenega toka. Naprava ima štiri sedemsegmentne zaslone, ki takoj prikažejo vrednosti toka in napetosti, ki jih porabi priključena naprava. Te vrednosti se spremenijo v intervalu vsake tri sekunde.
Specifikacija:
- Območje delovne napetosti: 3,5 V do 7 V
- Največja nazivna moč: 3A
- Kompaktna velikost, enostavna za nošenje
- Zunanja oskrba ni potrebna
Uporaba:
- Testiranje naprav USB
- Preverjanje ravni obremenitve
- Odpravljanje napak polnilcev baterij
- Tovarne, elektronski izdelki in osebna uporaba
Shema vezja
V zgornji nastavitvi za prikaz načinov globokega spanja Arduino je Arduino priključen na USB ampermeter. Nato je USB ampermeter priključen na vrata USB prenosnika. Podatkovni zatič senzorja DHT11 je pritrjen na zatič D2 Arduina.
Razlaga kode
Na koncu je podana celotna koda projekta z video posnetkom.
Koda se začne z vključitvijo knjižnice za senzor DHT11 in knjižnice LowPower . Za prenos knjižnice Low Power sledite povezavi. Nato smo definirali številko pin Arduino, na katero je povezan podatkovni zatič DHT11, in ustvarili objekt DHT.
#include
V funkciji void setup smo sprožili serijsko komunikacijo z uporabo serial.begin (9600), tu je 9600 hitrost prenosa. Kot indikator načina spanja uporabljamo vgrajeno LED-diodo Arduino. Torej, pin smo nastavili kot izhod, digitalno pisanje pa nizko.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, IZHOD); digitalWrite (LED_BUILTIN, LOW); }
V funkciji void loop izvajamo vgrajeno LED HIGH in odčitavanje podatkov o temperaturi in vlažnosti s senzorja. Tukaj je DHT.read11 (); ukaz je branje podatkov s senzorja. Ko so podatki izračunani, lahko vrednosti preverimo tako, da jih shranimo v katero koli spremenljivko. Tu smo vzeli dve spremenljivki tipa float 't' in 'h' . Tako se podatki o temperaturi in vlažnosti serijsko natisnejo na serijski monitor.
void loop () { Serial.println ("Pridobi podatke iz DHT11"); zamuda (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 plovec t = DHT.temperature; plovec h = DHT.vlažnost; Serial.print ("Temperatura ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Vlažnost ="); Serial.print (h); Serial.println ("%"); zamuda (2000);
Preden omogočimo način spanja, natisnemo "Arduino: - grem na dremež" in vgradni LED nizko. Po tem je način mirovanja Arduino omogočen z uporabo spodnjega ukaza v kodi.
Spodnja koda omogoča nedejavni način periodičnega spanja Arduina in daje spanje osem sekund. ADC, časovnike, SPI, USART, dvožični vmesnik spremeni v stanje IZKLOP.
Nato po 8 sekundah samodejno zbudi Arduino iz spanja in natisne »Arduino: - Hej, pravkar sem se zbudil«.
Serial.println ("Arduino: - grem na dremež"); zamuda (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, pravkar sem se zbudil"); Serial.println (""); zamuda (2000); }
Tako se bo Arduino z uporabo te kode zbudil le za 24 sekund v minuti in bo ostal v stanju mirovanja preostalih 36 sekund, kar znatno zmanjša porabo energije vremenske postaje Arduino.
Če torej Arduino uporabljamo v načinu spanja, lahko približno podvojimo čas delovanja naprave.