Strömförbrukning är en kritisk fråga för en enhet som kör kontinuerligt länge utan att vara avstängd. Så för att övervinna detta problem kommer nästan varje styrenhet med ett viloläge, vilket hjälper utvecklare att utforma elektroniska prylar för optimal strömförbrukning. Viloläge sätter enheten i energisparläge genom att stänga av den oanvända modulen.
Tidigare har vi förklarat Deep-sleep-läge i ESP8266 för energibesparing. Idag lär vi oss om Arduino Sleep Modes och visar strömförbrukning med Ammeter. Ett Arduino-viloläge kallas också Arduino Power Save-läge eller Arduino Standby-läge.
Arduino sömnlägen
Vilolägen låter användaren stoppa eller stänga av oanvända moduler i mikrokontrollen vilket avsevärt minskar strömförbrukningen. Arduino UNO, Arduino Nano och Pro-mini levereras med ATmega328P och den har en Brown-out Detector (BOD) som övervakar matningsspänningen vid viloläget.
Det finns sex vilolägen i ATmega328P:
För att gå in i något av viloläget måste vi aktivera sömnbiten i Sleep Mode Control Register (SMCR.SE). Därefter väljer valt bitar för viloläge viloläget bland viloläge, ADC-brusreducering, avstängning, energisparläge, standby och externt viloläge.
En intern eller extern Arduino avbryter eller en Återställning kan väcka Arduino från viloläge.
Viloläge
För att gå in i viloläge, skriv SM-bitarna på styrenheten '000'. Detta läge stoppar CPU men låter SPI, 2-tråds seriellt gränssnitt, USART, Watchdog, räknare, analog komparator fungera. Idle-läge stoppar i princip CLK CPU och CLK FLASH. Arduino kan väckas när som helst med hjälp av extern eller intern avbrott.
Arduino-kod för viloläge:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Det finns ett bibliotek för att ställa in olika lågeffektlägen i arduino. Så ladda ner och installera först biblioteket från den givna länken och använd ovanstående kod för att sätta Arduino i viloläge. Genom att använda ovanstående kod kommer Arduino att sova i åtta sekunder och vakna automatiskt. Som du kan se i koden att viloläget stänger av alla timers, SPI, USART och TWI (2-tråds gränssnitt).
ADC-brusreduceringsläge
För att använda detta viloläge, skriv SM-biten till '001'. Läget stoppar CPU men tillåter ADC, extern avbrott, USART, 2-tråds seriellt gränssnitt, Watchdog och räknare att fungera. ADC-brusreduceringsläge stoppar i princip CLK CPU, CLK I / O och CLK FLASH. Vi kan väcka styrenheten från ADC-brusreduceringsläget med följande metoder:
- Extern återställning
- Återställning av vakthundens system
- Watchdog Interrupt
- Brun ut-återställning
- 2-tråds matchning av seriellt gränssnittsadress
- Extern nivåavbrott på INT
- Avbryt stiftbyte
- Timer / Counter interrupt
- SPM / EEPROM redo avbrott
Avstängningsläge
Avstängningsläge stoppar alla genererade klockor och tillåter endast användning av asynkrona moduler. Det kan aktiveras genom att skriva SM-bitarna till '010'. I det här läget stängs den externa oscillatorn AV, men 2-tråds seriellt gränssnitt, vakthund och extern avbrott fortsätter att fungera. Den kan inaktiveras med endast en av metoderna nedan:
- Extern återställning
- Återställning av vakthundens system
- Watchdog Interrupt
- Brun ut-återställning
- 2-tråds matchning av seriellt gränssnittsadress
- Extern nivåavbrott på INT
- Avbryt stiftbyte
Arduino-kod för avstängning av periodiskt läge:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Koden används för att slå på avstängningsläget. Genom att använda ovanstående kod kommer Arduino att sova i åtta sekunder och vakna automatiskt.
Vi kan också använda avstängningsläget med ett avbrott, där Arduino går i viloläge men bara vaknar när ett externt eller internt avbrott tillhandahålls.
Arduino-kod för avstängningsläge:
void loop () { // Tillåt väckningspinne att utlösa avbrott vid låg. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Inaktivera extern stiftavbrott på väckningsstiftet. detachInterrupt (0); // Gör något här }
Energisparläge
För att gå in i energisparläget måste vi skriva SM-stift till '011'. Detta viloläge liknar avstängningsläget, bara med ett undantag, dvs om timern / räknaren är aktiverad kommer den att förbli i körläge även vid sömn. Enheten kan väckas med hjälp av timeröverflödet.
Om du inte använder tiden / räknaren rekommenderas att du använder avstängningsläge istället för energisparläge.
Standbyläge
Standby-läget är identiskt med Power-Down-läget, den enda skillnaden mellan dem är den externa oscillatorn som körs i det här läget. För att aktivera detta läge skriv SM-stift till '110'.
Utökat vänteläge
Detta läge liknar energisparläget endast med ett undantag att oscillatorn fortsätter att köra. Enheten går in i utökat vänteläge när vi skriver SM-stift till '111'. Enheten tar sex klockcykler för att vakna från det utökade vänteläget.
Nedan följer kraven för detta projekt efter anslutning av kretsen enligt kretsschemat. Ladda upp koden för viloläge till Arduino med Arduino IDE. Arduino går in i viloläge. Kontrollera sedan strömförbrukningen i USB-amperet. Annars kan du också använda en klämmätare för samma.
Komponenter krävs
- Arduino UNO
- DHT11 temperatur- och luftfuktighetssensor
- USB-amperemätare
- Bakbord
- Anslutande ledningar
För att lära dig mer om att använda DHT11 med Arduino, följ länken. Här använder vi USB-amperet för att mäta spänningen som konsumeras av Arduino i viloläge.
USB-amperemätare
USB-amperet är en plug and play-enhet som används för att mäta spänningen och strömmen från vilken USB-port som helst. Dongeln ansluts mellan USB-strömförsörjningen (datorns USB-port) och USB-enheten (Arduino). Denna enhet har ett motstånd på 0,05 ohm i linje med strömkabeln genom vilken den mäter värdet på den ström som dras. Enheten levereras med fyra sju segment skärm, som direkt visar värdena för ström och spänning som förbrukas av den anslutna enheten. Dessa värden vänds i intervall var tredje sekund.
Specifikation:
- Driftspänningsområde: 3,5V till 7V
- Maximalt strömvärde: 3A
- Kompakt storlek, lätt att bära
- Ingen extern leverans behövs
Ansökan:
- Testar USB-enheter
- Kontroll av lastnivåer
- Felsökning av batteriladdare
- Fabriker, elektronikprodukter och personligt bruk
Kretsschema
I ovanstående inställning för att visa Arduino Deep sleep-lägen är Arduino ansluten till USB-amperet. Sedan ansluts USB-amperet till USB-porten på den bärbara datorn. Datastift på DHT11-sensorn är ansluten till D2-stiftet på Arduino.
Kodförklaring
Den kompletta koden för projektet med en video ges i slutet.
Koden börjar med att inkludera biblioteket för DHT11-sensorn och LowPower- biblioteket. För att ladda ner Low Power-biblioteket, följ länken. Sedan har vi definierat Arduino-stiftnumret till vilket datapinnen för DHT11 är ansluten och skapat ett DHT-objekt.
#omfatta
I tomrumsfunktionen har vi initierat seriekommunikationen med hjälp av serial.begin (9600), här är 9600 baudhastigheten. Vi använder Arduinos inbyggda LED som en indikator för viloläget. Så vi har ställt in stiftet som utgång och digital skrivning låg.
ogiltig installation () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
I tomrumsfunktionen gör vi den inbyggda lysdioden HÖG och avläser temperatur- och luftfuktighetsdata från sensorn. Här DHT.read11 (); kommandot läser data från sensorn. När data har beräknats kan vi kontrollera värdena genom att spara dem i valfri variabel. Här har vi tagit två variabler för flyttyp 't' och 'h' . Följaktligen skrivs temperatur- och fuktighetsdata ut seriellt på den seriella monitorn.
void loop () { Serial.println ("Få data från DHT11"); fördröjning (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperatur; flyta h = DHT. luftfuktighet; Serial.print ("Temperatur ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Luftfuktighet ="); Serial.print (h); Serial.println ("%"); fördröjning (2000);
Innan vi aktiverar viloläget skriver vi ut "Arduino: - Jag går för en tupplur" och gör den inbyggda LED-lampan låg. Därefter aktiveras Arduino-viloläge med kommandot som nämns nedan i koden.
Nedanstående kod möjliggör viloläget för viloläge för Arduino och ger en sömn på åtta sekunder. Det gör ADC, Timers, SPI, USART, 2-trådsgränssnitt till OFF-tillstånd.
Sedan väcker det automatiskt Arduino från viloläge efter 8 sekunder och skriver ut "Arduino: - Hej jag vaknade precis".
Serial.println ("Arduino: - Jag går för en tupplur"); fördröjning (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 jag vaknade just"); Serial.println (""); fördröjning (2000); }
Så genom att använda den här koden vaknar Arduino bara i 24 sekunder på en minut och förblir i viloläge under resten av de 36 sekunderna, vilket avsevärt minskar strömmen som förbrukas av Arduino väderstation.
Om vi använder Arduino i viloläge kan vi därför fördubbla enhetens körtid.