Consumul de energie este o problemă critică pentru un dispozitiv care funcționează continuu pentru o lungă perioadă de timp, fără a fi oprit. Deci, pentru a depăși această problemă, aproape fiecare controler vine cu un mod de repaus, care îi ajută pe dezvoltatori să proiecteze gadgeturi electronice pentru un consum optim de energie. Modul de repaus pune dispozitivul în modul de economisire a energiei prin oprirea modulului neutilizat.
Anterior am explicat modul Deep-sleep în ESP8266 pentru economisirea energiei. Astăzi vom afla despre modurile de somn Arduino și vom demonstra consumul de energie folosind Ammetru. Un mod de repaus Arduino este denumit și modul de economisire a energiei Arduino sau modul de așteptare Arduino.
Moduri de somn Arduino
Modurile Sleep permit utilizatorului să oprească sau să oprească modulele neutilizate din microcontroler, ceea ce reduce semnificativ consumul de energie. Arduino UNO, Arduino Nano și Pro-mini sunt livrate cu ATmega328P și au un detector Brown-out (BOD) care monitorizează tensiunea de alimentare în momentul de veghe.
Există șase moduri de repaus în ATmega328P:
Pentru a intra în oricare dintre modurile de repaus, trebuie să activăm bitul de repaus în registrul de control al modului de repaus (SMCR.SE). Apoi, biții selectați modul de repaus selectează modul de repaus în modul Repaus, reducerea zgomotului ADC, Power-Down, Power-Save, Standby și Standby extern.
Un Arduino intern sau extern întrerupe sau o resetare poate trezi Arduino din modul de repaus.
Mod inactiv
Pentru a intra în modul Repaus, scrieți biții SM ai controlerului „000”. Acest mod oprește CPU-ul, dar permite SPI, interfață serială cu 2 fire, USART, Watchdog, contoare, comparator analogic să funcționeze. Modul de repaus oprește practic CPU CLK și CLK FLASH. Arduino poate fi trezit oricând folosind întreruperi externe sau interne.
Cod Arduino pentru modul Repaus:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Există o bibliotecă pentru setarea diferitelor moduri de consum redus în arduino. Deci, mai întâi descărcați și instalați biblioteca de pe linkul dat și utilizați codul de mai sus pentru a pune Arduino în modul Repaus. Folosind codul de mai sus, Arduino va intra în repaus de opt secunde și se va trezi automat. După cum puteți vedea în cod, modul inactiv oprește toate temporizatoarele, SPI, USART și TWI (interfață cu 2 fire).
Modul de reducere a zgomotului ADC
Pentru a utiliza acest mod de repaus, scrieți bitul SM în „001”. Modul oprește CPU-ul, dar permite funcționarea ADC, întreruperii externe, USART, interfeței seriale cu 2 fire, Watchdog și contoare. Modul ADC Noise Reduction reduce practic CPU CLK, CLK I / O și CLK FLASH. Putem trezi controlerul din modul de reducere a zgomotului ADC prin următoarele metode:
- Resetare externă
- Resetarea sistemului Watchdog
- Întreruperea câinelui de pază
- Resetați Brown-out
- Potrivirea adresei interfeței seriale cu 2 fire
- Întrerupere de nivel extern pe INT
- Întrerupere schimbare pin
- Timer / Counter întrerupere
- SPM / EEPROM gata întrerupere
Mod de oprire
Modul Power-Down oprește toate ceasurile generate și permite doar funcționarea modulelor asincrone. Poate fi activat scriind biții SM în „010”. În acest mod, oscilatorul extern se oprește, dar interfața serială cu 2 fire, câinele de pază și întreruperea externă continuă să funcționeze. Poate fi dezactivat doar prin una dintre metodele de mai jos:
- Resetare externă
- Resetarea sistemului Watchdog
- Întreruperea câinelui de pază
- Resetați Brown-out
- Potrivirea adresei interfeței seriale cu 2 fire
- Întrerupere de nivel extern pe INT
- Întrerupere schimbare pin
Cod Arduino pentru modul periodic de oprire:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Codul este utilizat pentru a activa modul de oprire. Folosind codul de mai sus, Arduino va intra în repaus de opt secunde și se va trezi automat.
Putem folosi și modul de oprire cu o întrerupere, unde Arduino va intra în repaus, dar se trezește doar când este asigurată o întrerupere externă sau internă.
Cod Arduino pentru modul de întrerupere a opririi:
void loop () { // Permiteți pinul de trezire să declanșeze întreruperea la minim. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Dezactivați întreruperea pinului extern pe pinul de trezire. detachInterrupt (0); // Fă ceva aici }
Modul de economisire a energiei
Pentru a intra în modul de economisire a energiei, trebuie să scriem pinul SM în „011”. Acest mod de repaus este similar cu modul de oprire, doar cu o singură excepție, adică dacă temporizatorul / contorul este activat, acesta va rămâne în stare de funcționare chiar și în momentul repausului. Dispozitivul poate fi trezit utilizând depășirea temporizatorului.
Dacă nu utilizați timpul / contorul, este recomandat să utilizați modul de oprire în loc de modul de economisire a energiei.
Mod de asteptare
Modul de așteptare este identic cu modul de oprire, singura diferență dintre acestea este oscilatorul extern care funcționează în acest mod. Pentru activarea acestui mod, scrieți pinul SM în „110”.
Mod de așteptare extins
Acest mod este similar cu modul de economisire a energiei numai cu o singură excepție că oscilatorul funcționează în continuare. Dispozitivul va intra în modul Extended Standby când scriem pinul SM în „111”. Dispozitivul va dura șase cicluri de ceas pentru a se trezi din modul de așteptare extins.
Mai jos sunt cerințele pentru acest proiect, după conectarea circuitului conform schemei de circuit. Încărcați codul modului de repaus în Arduino folosind Arduino IDE. Arduino va intra în modul de repaus. Apoi verificați consumul curent în ampermetru USB. Altfel, puteți utiliza și un clemmetru pentru același lucru.
Componente necesare
- Arduino UNO
- Senzor de temperatură și umiditate DHT11
- Amperimetru USB
- Breadboard
- Conectarea firelor
Pentru a afla mai multe despre utilizarea DHT11 cu Arduino, urmați linkul. Aici folosim ampermetru USB pentru a măsura tensiunea consumată de Arduino în modul de repaus.
Amperimetru USB
Amperimetrul USB este un dispozitiv plug and play utilizat pentru măsurarea tensiunii și curentului de pe orice port USB. Dongle-ul se conectează între sursa de alimentare USB (portul USB al computerului) și dispozitivul USB (Arduino). Acest dispozitiv are un rezistor de 0,05 ohm în linie cu știftul de putere prin care măsoară valoarea curentului tras. Dispozitivul vine cu patru afișaje pe șapte segmente, care afișează instantaneu valorile curentului și tensiunii consumate de dispozitivul atașat. Aceste valori răsucesc într-un interval de fiecare trei secunde.
Specificație:
- Gama de tensiune de funcționare: 3,5V până la 7V
- Curent maxim nominal: 3A
- Dimensiune compactă, ușor de transportat
- Nu este necesară furnizarea externă
Cerere:
- Testarea dispozitivelor USB
- Verificarea nivelurilor de încărcare
- Depanarea încărcătoarelor de baterii
- Fabrici, produse electronice și uz personal
Diagrama circuitului
În configurația de mai sus pentru a demonstra modurile de somn profund Arduino, Arduino este conectat la ampermetrul USB. Apoi, ampermetrul USB este conectat la portul USB al laptopului. Pinul de date al senzorului DHT11 este atașat pinului D2 al Arduino.
Explicarea codului
Codul complet al proiectului cu un videoclip este dat la sfârșit.
Codul începe prin includerea bibliotecii pentru senzorul DHT11 și biblioteca LowPower . Pentru descărcarea bibliotecii Low Power, urmați linkul. Apoi am definit numărul pinului Arduino la care este conectat pinul de date al DHT11 și am creat un obiect DHT.
#include
În funcția de configurare nulă , am inițiat comunicarea serial utilizând serial.begin (9600), aici 9600 este rata de transmisie. Folosim LED-ul încorporat al Arduino ca indicator pentru modul de repaus. Deci, am setat pinul ca ieșire și scrierea digitală scăzută.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
În funcția de buclă de gol , realizăm LED-ul încorporat HIGH și citim datele de temperatură și umiditate de la senzor. Aici, DHT.read11 (); comanda este citirea datelor de la senzor. Odată ce datele sunt calculate, putem verifica valorile salvându-le în orice variabilă. Aici, am luat două variabile de tip flotant „t” și „h” . Prin urmare, datele de temperatură și umiditate sunt tipărite în serie pe monitorul serial.
bucla void () { Serial.println ("Obțineți date de la DHT11"); întârziere (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; plutitor h = DHT.umiditate; Serial.print ("Temperatura ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Umiditate ="); Serial.print (h); Serial.println ("%"); întârziere (2000);
Înainte de a activa modul de repaus, imprimăm „Arduino: - Mă duc la o pui de somn” și fac LED-ul încorporat Low. După aceea, modul de repaus Arduino este activat utilizând comanda menționată mai jos în cod.
Codul de mai jos activează modul de repaus periodic inactiv al Arduino și oferă o repaus de opt secunde. Transformă ADC, Timers, SPI, USART, interfața cu 2 fire în starea OFF.
Apoi, trezește automat Arduino din repaus după 8 secunde și tipărește „Arduino: - Hei tocmai m-am trezit”.
Serial.println ("Arduino: - I am go for a Nap"); întârziere (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: - Hei tocmai m-am trezit"); Serial.println (""); întârziere (2000); }
Prin urmare, folosind acest cod, Arduino va fi trezit doar 24 de secunde într-un minut și va rămâne în modul de repaus pentru restul celor 36 de secunde, ceea ce reduce semnificativ puterea consumată de stația meteo Arduino.
Prin urmare, dacă folosim Arduino cu modul de repaus, putem dubla aproximativ durata de rulare a dispozitivului.