Strømforbruk er et kritisk problem for en enhet som kjører kontinuerlig i lang tid uten å være slått av. Så for å overvinne dette problemet kommer nesten hver kontroller med en hvilemodus, som hjelper utviklere å designe elektroniske dingser for optimalt strømforbruk. Hvilemodus setter enheten i strømsparingsmodus ved å slå av den ubrukte modulen.
Tidligere har vi forklart dyp-hvilemodus i ESP8266 for strømsparing. I dag vil vi lære om Arduino Sleep Modes og demonstrere strømforbruk ved å bruke Ammeter. En Arduino-hvilemodus blir også referert til som Arduino Power Save-modus eller Arduino Standby-modus.
Arduino sovemodus
Hvilemodus lar brukeren stoppe eller slå av ubrukte moduler i mikrokontrolleren, noe som reduserer strømforbruket betydelig. Arduino UNO, Arduino Nano og Pro-mini leveres med ATmega328P og den har en Brown-out Detector (BOD) som overvåker forsyningsspenningen når den er i hvilemodus.
Det er seks hvilemoduser i ATmega328P:
For å gå inn i hvilken som helst av hvilemodus, må vi aktivere hvilemodus i Sleep Mode Control Register (SMCR.SE). Deretter velger du bitene for hvilemodus for å velge hvilemodus blant inaktiv, ADC-støyreduksjon, strøm ned, strømsparing, standby og ekstern standby.
En intern eller ekstern Arduino avbryter eller en Reset kan vekke Arduino fra hvilemodus.
Inaktiv modus
For å gå inn i hvilemodus, skriv SM-bitene til kontrolleren '000'. Denne modusen stopper CPU, men lar SPI, 2-leder serielt grensesnitt, USART, Watchdog, tellere, analog komparator fungere. Hvilemodus stopper i utgangspunktet CLK CPU og CLK FLASH. Arduino kan vekkes når som helst ved å bruke ekstern eller intern avbrudd.
Arduino-kode for inaktiv hvilemodus:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Det er et bibliotek for å sette forskjellige moduser for lavt strømforbruk i arduino. Så last ned og installer først biblioteket fra den gitte lenken, og bruk koden ovenfor for å sette Arduino i hvilemodus. Ved å bruke ovennevnte kode vil Arduino sove i åtte sekunder og våkne automatisk. Som du kan se i koden at hvilemodus slår av alle tidtakere, SPI, USART og TWI (2-leder grensesnitt).
ADC Støyreduksjonsmodus
For å bruke denne hvilemodus, skriv SM-biten til '001'. Modusen stopper CPU, men tillater ADC, ekstern avbrudd, USART, 2-leders serielt grensesnitt, Watchdog og tellere å fungere. ADC-støyreduksjonsmodus stopper i utgangspunktet CLK CPU, CLK I / O og CLK FLASH. Vi kan vekke kontrolleren fra ADC Noise Reduction- modus på følgende måter:
- Ekstern tilbakestilling
- Tilbakestilling av vakthund
- Vakthund avbryter
- Brun ut-tilbakestilling
- 2-tråds seriell grensesnitt adresse samsvar
- Eksternt nivå avbrudd på INT
- Pin endring avbryt
- Timer / Counter avbrudd
- SPM / EEPROM klar avbrudd
Slå av modus
Avstengingsmodus stopper alle genererte klokker og tillater bare drift av asynkrone moduler. Det kan aktiveres ved å skrive SM-bitene til '010'. I denne modusen slås den eksterne oscillatoren AV, men 2-leders serielt grensesnitt, vakthund og ekstern avbrudd fortsetter å fungere. Den kan deaktiveres med bare en av metodene nedenfor:
- Ekstern tilbakestilling
- Tilbakestilling av vakthund
- Vakthund avbryter
- Brun ut-tilbakestilling
- 2-tråds seriell grensesnitt adresse samsvar
- Eksternt nivå avbrudd på INT
- Pin endring avbryt
Arduino-kode for nedstengning av periodisk modus:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Koden brukes til å slå på strømmen. Ved å bruke ovennevnte kode vil Arduino sove i åtte sekunder og våkne automatisk.
Vi kan også bruke avstengingsmodus med et avbrudd, der Arduino vil gå i dvale, men bare våkner når en ekstern eller intern avbrudd er gitt.
Arduino-kode for avbruddsavbruddsmodus:
void loop () { // Tillat at wake up pin utløser avbrudd på lav. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Deaktiver avbryting av ekstern pin på wake up pin. detachInterrupt (0); // Gjør noe her }
Strømsparer modus
For å gå inn i strømsparingsmodus må vi skrive SM-pinnen til '011'. Denne hvilemodus ligner på avstengingsmodus, bare med ett unntak, dvs. hvis tidsuret / telleren er aktivert, vil den forbli i kjørende tilstand selv på søvntiden. Enheten kan vekkes opp ved å bruke timeroverløpet.
Hvis du ikke bruker tiden / telleren, anbefales det å bruke avstengingsmodus i stedet for strømsparingsmodus.
Standby-modus
Standby-modus er identisk med Power-Down-modus. Den eneste forskjellen mellom dem er den eksterne oscillatoren som kjører i denne modusen. For å aktivere denne modusen, skriv SM-pinnen til '110'.
Utvidet ventemodus
Denne modusen ligner på strømsparingsmodus bare med ett unntak at oscillatoren fortsetter å kjøre. Enheten vil gå inn i utvidet standby-modus når vi skriver SM-pinnen til '111'. Enheten vil ta seks tidssykluser for å våkne fra utvidet standby-modus.
Nedenfor er kravene til dette prosjektet etter tilkobling av kretsen i henhold til kretsskjemaet. Last opp hvilemoduskoden til Arduino ved hjelp av Arduino IDE. Arduino vil gå i hvilemodus. Kontroller deretter strømforbruket i USB-amperemeteret. Ellers kan du også bruke en klemmemåler til det samme.
Komponenter kreves
- Arduino UNO
- DHT11 temperatur- og fuktighetssensor
- USB-amperemeter
- Brettbrett
- Koble ledninger
For å lære mer om bruk av DHT11 med Arduino, følg lenken. Her bruker vi USB-amperemeter for å måle spenningen som brukes av Arduino i hvilemodus.
USB-amperemeter
USB-amperemeter er en plug and play-enhet som brukes til å måle spenning og strøm fra hvilken som helst USB-port. Dongelen kobles mellom USB-strømforsyningen (datamaskinens USB-port) og USB-enheten (Arduino). Denne enheten har en 0,05 ohm motstand på linje med strømpinnen som den måler verdien av strømmen som trukkes gjennom. Enheten leveres med fire syv segmentskjermbilder, som umiddelbart viser verdiene for strøm og spenning som forbrukes av den tilkoblede enheten. Disse verdiene snur i et intervall på hvert tredje sekund.
Spesifikasjon:
- Driftsspenningsområde: 3,5V til 7V
- Maksimal strømstyrke: 3A
- Kompakt størrelse, enkel å bære
- Ingen ekstern forsyning nødvendig
Applikasjon:
- Testing av USB-enheter
- Kontrollere lastnivåer
- Feilsøking av batteriladere
- Fabrikker, elektronikkprodukter og personlig bruk
Kretsdiagram
I ovennevnte oppsett for å demonstrere Arduino Deep sleep-modus, er Arduino koblet til USB-amperemetre. Deretter kobles USB-amperemeteret til USB-porten på den bærbare datamaskinen. Datapinnen til DHT11-sensoren er festet til D2-pinnen på Arduino.
Kode Forklaring
Den komplette koden for prosjektet med en video er gitt på slutten.
Koden starter med å inkludere biblioteket for DHT11-sensoren og LowPower- biblioteket. Følg lenken for å laste ned Low Power-biblioteket. Så har vi definert Arduino-pin-nummeret som datapinnen til DHT11 er koblet til, og opprettet et DHT-objekt.
#inkludere
I ugyldighetsoppsettfunksjonen har vi startet seriell kommunikasjon ved å bruke serial.begin (9600), her er 9600 baudrate. Vi bruker Arduinos innebygde LED som en indikator for hvilemodus. Så vi har satt pinnen som utgang, og digital skriving lav.
ugyldig oppsett () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
I void loop- funksjonen lager vi den innebygde LEDEN HIGH og leser temperatur- og fuktighetsdataene fra sensoren. Her DHT.read11 (); kommandoen er å lese dataene fra sensoren. Når data er beregnet, kan vi sjekke verdiene ved å lagre dem i en hvilken som helst variabel. Her har vi tatt to flyt-variabler 't' og 'h' . Derfor blir temperatur- og fuktighetsdataene skrevet ut serielt på den serielle skjermen.
void loop () { Serial.println ("Få data fra DHT11"); forsinkelse (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperatur; flyte h = DHT. luftfuktighet; Serial.print ("Temperatur ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Fuktighet ="); Serial.print (h); Serial.println ("%"); forsinkelse (2000);
Før vi aktiverer hvilemodus, skriver vi ut "Arduino: - Jeg går for en lur" og gjør den innebygde LED lav. Etter det er Arduino hvilemodus aktivert ved å bruke kommandoen nevnt nedenfor i koden.
Nedenfor koden aktiveres den inaktiv periodiske hvilemodus til Arduino og gir en søvn på åtte sekunder. Det gjør ADC, tidtakere, SPI, USART, 2-leders grensesnitt til OFF-tilstand.
Deretter vekker den automatisk Arduino fra søvn etter 8 sekunder og skriver ut "Arduino: - Hei, jeg våknet nettopp".
Serial.println ("Arduino: - Jeg går for 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: - Hei jeg nettopp våknet"); Serial.println (""); forsinkelse (2000); }
Så ved å bruke denne koden vil Arduino bare våkne i 24 sekunder på et minutt og vil forbli i hvilemodus i resten av de 36 sekundene, noe som reduserer kraften som forbrukes av Arduino værstasjon betydelig.
Derfor, hvis vi bruker Arduino med hvilemodus, kan vi omtrent doble enhetens kjøretid.