Strømforbrug er et kritisk problem for en enhed, der kører kontinuerligt i lang tid uden at være slukket. Så for at overvinde dette problem kommer næsten hver controller med en dvaletilstand, som hjælper udviklere med at designe elektroniske gadgets til optimalt strømforbrug. Dvaletilstand sætter enheden i strømbesparende tilstand ved at slukke for det ubrugte modul.
Tidligere har vi forklaret Deep-sleep mode i ESP8266 til strømbesparelse. I dag vil vi lære om Arduino Sleep Modes og demonstrere strømforbrug ved hjælp af Ammeter. En Arduino-dvaletilstand kaldes også Arduino Power Save-tilstand eller Arduino Standby-tilstand.
Arduino søvntilstande
Dvaletilstand giver brugeren mulighed for at stoppe eller slukke for de ubrugte moduler i mikrocontrolleren, hvilket reducerer strømforbruget betydeligt. Arduino UNO, Arduino Nano og Pro-mini leveres med ATmega328P, og den har en Brown-out Detector (BOD), der overvåger forsyningsspændingen på tidspunktet for dvaletilstand.
Der er seks dvaletilstande i ATmega328P:
For at gå ind i en hvilken som helst af dvaletilstanden er vi nødt til at aktivere dvaletilstand i Sleep Mode Control Register (SMCR.SE). Derefter vælger bits til dvaletilstand slumretilstand blandt inaktiv, ADC-støjreduktion, Power-Down, Power-Save, Standby og Ekstern Standby.
En intern eller ekstern Arduino afbryder, eller en nulstilling kan vække Arduino fra dvaletilstand.
Inaktiv tilstand
For at gå ind i inaktiv dvaletilstand skal du skrive SM-bitene på controlleren '000'. Denne tilstand stopper CPU'en, men tillader, at SPI, 2-leder serielt interface, USART, Watchdog, tællere, analog komparator fungerer. Inaktiv tilstand standser dybest set CLK CPU og CLK FLASH. Arduino kan når som helst vækkes ved hjælp af ekstern eller intern afbrydelse.
Arduino-kode til inaktiv dvaletilstand:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Der er et bibliotek til indstilling af forskellige lavt strømtilstande i arduino. Så download og installer først biblioteket fra det givne link, og brug ovenstående kode til at sætte Arduino i inaktiv dvaletilstand. Ved at bruge ovenstående kode vil Arduino gå i dvale på otte sekunder og vågne automatisk. Som du kan se i koden, at inaktiv tilstand slukker for alle timerne, SPI, USART og TWI (2-leder interface).
ADC Støjreduktionstilstand
For at bruge denne dvaletilstand, skriv SM bit til '001'. Tilstanden stopper CPU'en, men tillader ADC, ekstern afbrydelse, USART, 2-leder serielt interface, Watchdog og tællere til at fungere. ADC-støjreduktionstilstand dybest set stopper CLK CPU, CLK I / O og CLK FLASH. Vi kan vække controlleren fra ADC-støjreduktionstilstand ved hjælp af følgende metoder:
- Ekstern nulstilling
- Nulstilling af Watchdog-system
- Watchdog Interrupt
- Brun-ud-nulstilling
- 2-leder serielt interface matcher
- Eksternt niveau afbrydelse på INT
- Pin-skift afbryd
- Timer / Counter afbrydelse
- SPM / EEPROM klar afbrydelse
Sluk-tilstand
Power-Down-tilstand stopper alle de genererede ure og tillader kun drift af asynkrone moduler. Det kan aktiveres ved at skrive SM-bitene til '010'. I denne tilstand slukkes den eksterne oscillator, men 2-leder serielt interface, vagthund og ekstern afbrydelse fungerer fortsat. Det kan kun deaktiveres ved hjælp af en af nedenstående metoder:
- Ekstern nulstilling
- Nulstilling af Watchdog-system
- Watchdog Interrupt
- Brun-ud-nulstilling
- 2-leder serielt interface matcher
- Eksternt niveau afbrydelse på INT
- Pin-skift afbryd
Arduino-kode til periodisk tilstand til nedlukning:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Koden bruges til at tænde for nedlukningstilstand. Ved at bruge ovenstående kode vil Arduino gå i dvale på otte sekunder og vågne automatisk.
Vi kan også bruge nedlukningstilstand med en afbrydelse, hvor Arduino går i dvale, men kun vågner, når der er tilvejebragt en ekstern eller intern afbrydelse.
Arduino-kode til Power-Down Interrupt Mode:
void loop () { // Tillad wake up pin at udløse afbrydelse ved lav. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Deaktiver ekstern pinafbrydelse på wake up pin. detachInterrupt (0); // Gør noget her }
Strømbesparende tilstand
For at gå ind i strømsparetilstand skal vi skrive SM-stiften til '011'. Denne dvaletilstand svarer til nedlukningstilstanden, kun med en undtagelse, dvs. hvis timeren / tælleren er aktiveret, forbliver den i kørende tilstand selv på søvntidspunktet. Enheden kan vækkes ved hjælp af timeroverløbet.
Hvis du ikke bruger tiden / tælleren, anbefales det at bruge Power-down-tilstand i stedet for strømbesparende tilstand.
Standbytilstand
Standbytilstanden er identisk med Power-Down-tilstand, den eneste forskel mellem dem er den eksterne oscillator, der kører i denne tilstand. For at aktivere denne tilstand, skriv SM-stiften til '110'.
Udvidet standbytilstand
Denne tilstand ligner kun strømbesparelsestilstanden med en undtagelse, at oscillatoren kører. Enheden går i udvidet standbytilstand, når vi skriver SM-stiften til '111'. Enheden tager seks urcyklusser for at vågne op fra den udvidede standbytilstand.
Nedenfor er kravene til dette projekt efter tilslutning af kredsløbet i henhold til kredsløbsdiagrammet. Upload sovekode til Arduino ved hjælp af Arduino IDE. Arduino går ind i inaktiv dvaletilstand. Kontroller derefter strømforbruget i USB-amperemeteret. Ellers kan du også bruge en klemmemåler til det samme.
Komponenter, der kræves
- Arduino UNO
- DHT11 temperatur- og fugtighedssensor
- USB-amperemeter
- Brødbræt
- Tilslutning af ledninger
For at lære mere om brug af DHT11 med Arduino, følg linket. Her bruger vi USB-amperemeter til at måle den spænding, der forbruges af Arduino i dvaletilstand.
USB-amperemeter
USB-amperemeter er en plug and play-enhed, der bruges til at måle spænding og strøm fra enhver USB-port. Donglen tilsluttes mellem USB-strømforsyningen (computerens USB-port) og USB-enheden (Arduino). Denne enhed har en 0,05 ohm modstand på linje med strømstiften, hvorigennem den måler værdien af den strøm, der trækkes. Enheden leveres med fire syv segmentdisplay, som straks viser værdierne for strøm og spænding, der forbruges af den tilsluttede enhed. Disse værdier vendes med et interval på hvert tredje sekund.
Specifikation:
- Driftsspændingsområde: 3,5V til 7V
- Maksimal strømværdi: 3A
- Kompakt størrelse, nem at bære
- Ingen ekstern forsyning nødvendig
Ansøgning:
- Test af USB-enheder
- Kontrol af belastningsniveauer
- Fejlretning af batteriopladere
- Fabrikker, elektronikprodukter og personlig brug
Kredsløbsdiagram
I ovenstående opsætning for at demonstrere Arduino Deep sleep-tilstande er Arduino tilsluttet USB-amperemeteret. Derefter tilsluttes USB-ammeteret til USB-porten på den bærbare computer. Datastift på DHT11-sensoren er fastgjort til D2-stiften på Arduino.
Kode Forklaring
Den komplette kode for projektet med en video er givet i slutningen.
Koden starter med at inkludere biblioteket til DHT11-sensoren og LowPower- biblioteket. Følg linket for at downloade Low Power-biblioteket. Derefter har vi defineret Arduino-pin-nummeret, som datatappen til DHT11 er tilsluttet, og oprettet et DHT-objekt.
#omfatte
I det tomrum setup funktion har vi igangsat den serielle kommunikation ved hjælp af serial.begin (9600), her den 9600 er baudrate. Vi bruger Arduinos indbyggede LED som en indikator for dvaletilstand. Så vi har indstillet stiften som output, og digital skrivning lav.
ugyldig opsætning () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
I ugyldig sløjfefunktion laver vi den indbyggede LED HIGH og læser temperatur- og fugtighedsdataene fra sensoren. Her DHT.read11 (); kommando læser data fra sensoren. Når data er beregnet, kan vi kontrollere værdierne ved at gemme dem i enhver variabel. Her har vi taget to float-type variabler 't' og 'h' . Derfor udskrives temperatur- og fugtighedsdataene serielt på den serielle skærm.
ugyldig loop () { Serial.println ("Hent data fra DHT11"); forsinkelse (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperatur; flyde h = DHT. luftfugtighed; Serial.print ("Temperatur ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Fugtighed ="); Serial.print (h); Serial.println ("%"); forsinkelse (2000);
Før vi aktiverer dvaletilstand, udskriver vi "Arduino: - Jeg går efter en lur" og gør den indbyggede LED lav. Derefter er Arduino-slumretilstand aktiveret ved hjælp af kommandoen nævnt nedenfor i koden.
Nedenstående kode muliggør Arduino 's inaktiv periodiske dvaletilstand og giver en dvale på otte sekunder. Det gør ADC, timere, SPI, USART, 2-leder interface til OFF-tilstand.
Derefter vækker det automatisk Arduino fra søvn efter 8 sekunder og udskriver "Arduino: - Hej jeg vågnede lige".
Serial.println ("Arduino: - Jeg går efter en lur"); forsinkelse (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 jeg vågnede lige op"); Serial.println (""); forsinkelse (2000); }
Så ved at bruge denne kode vågner Arduino kun i 24 sekunder på et minut og forbliver i dvaletilstand i resten af de 36 sekunder, hvilket reducerer den strøm, der forbruges af Arduino-vejrstationen betydeligt.
Derfor, hvis vi bruger Arduino med dvaletilstand, kan vi omtrent fordoble enhedens driftstid.