Stroomverbruik is een kritiek probleem voor een apparaat dat lange tijd continu draait zonder te zijn uitgeschakeld. Om dit probleem op te lossen, wordt bijna elke controller geleverd met een slaapmodus, die ontwikkelaars helpt bij het ontwerpen van elektronische gadgets voor een optimaal stroomverbruik. Slaapmodus zet het apparaat in de energiebesparende modus door de ongebruikte module uit te schakelen.
Eerder hebben we de diepe slaapmodus in ESP8266 voor energiebesparing uitgelegd. Vandaag zullen we leren over Arduino-slaapmodi en het stroomverbruik demonstreren met behulp van een ampèremeter. Een Arduino-slaapmodus wordt ook wel Arduino Power Save-modus of Arduino Standby-modus genoemd.
Arduino-slaapmodi
Met slaapmodi kan de gebruiker de ongebruikte modules in de microcontroller stoppen of uitschakelen, waardoor het stroomverbruik aanzienlijk wordt verminderd. Arduino UNO, Arduino Nano en Pro-mini worden geleverd met ATmega328P en hebben een Brown-out Detector (BOD) die de voedingsspanning bewaakt tijdens de slaapmodus.
Er zijn zes slaapmodi in ATmega328P:
Om naar een van de slaapmodi te gaan, moeten we de slaapbit inschakelen in het Sleep Mode Control Register (SMCR.SE). Vervolgens selecteren de bits voor de selectie van de slaapmodus de slaapmodus uit Inactief, ADC-ruisonderdrukking, Uitschakelen, Energiebesparing, Stand-by en Externe stand-by.
Een interne of externe Arduino wordt onderbroken of een reset kan de Arduino uit de slaapstand halen.
Inactieve modus
Om in de inactieve slaapstand te komen, schrijft u de SM-bits van de controller '000'. Deze modus stopt de CPU maar laat de SPI, 2-draads seriële interface, USART, Watchdog, tellers, analoge comparator werken. Inactieve modus stopt in feite de CLK CPU en CLK FLASH. Arduino kan op elk moment worden gewekt door externe of interne interrupt te gebruiken.
Arduino-code voor inactieve slaapmodus:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Er is een bibliotheek voor het instellen van verschillende energiebesparende modi in arduino. Dus download en installeer eerst de bibliotheek via de gegeven link en gebruik de bovenstaande code om de Arduino in de Idle Sleep Mode te zetten. Door de bovenstaande code te gebruiken, gaat de Arduino in een slaapstand van acht seconden en wordt hij automatisch wakker. Zoals je in de code kunt zien, schakelt de inactieve modus alle timers, SPI, USART en TWI (2-draads interface) uit.
ADC Ruisonderdrukkingsmodus
Om deze slaapmodus te gebruiken, schrijft u de SM-bit naar '001'. De modus stopt de CPU maar laat de ADC, externe interrupt, USART, 2-draads seriële interface, Watchdog en tellers werken. De ADC-ruisonderdrukkingsmodus stopt in feite de CLK CPU, CLK I / O en CLK FLASH. We kunnen de controller op de volgende manieren uit de ADC-ruisonderdrukkingsmodus halen :
- Externe reset
- Watchdog-systeemreset
- Waakhond onderbreken
- Brown-out Reset
- 2-draads seriële interface adresovereenkomst
- Externe niveau-onderbreking op INT
- Onderbreken van pincode
- Timer / teller onderbreken
- SPM / EEPROM gereed onderbreken
Uitschakelmodus
Power-Down-modus stopt alle gegenereerde klokken en staat alleen de werking van asynchrone modules toe. Het kan worden ingeschakeld door de SM-bits naar '010' te schrijven. In deze modus gaat de externe oscillator UIT, maar de 2-draads seriële interface, watchdog en externe interrupt blijven werken. Het kan worden uitgeschakeld door slechts een van de onderstaande methoden:
- Externe reset
- Watchdog-systeemreset
- Waakhond onderbreken
- Brown-out Reset
- 2-draads seriële interface adresovereenkomst
- Externe niveau-onderbreking op INT
- Onderbreken van pincode
Arduino-code voor periodieke modus voor uitschakelen:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
De code wordt gebruikt om de uitschakelmodus in te schakelen. Door de bovenstaande code te gebruiken, gaat de Arduino in een slaapstand van acht seconden en wordt hij automatisch wakker.
We kunnen ook de power-down-modus gebruiken met een interrupt, waarbij de Arduino in slaap valt, maar alleen wakker wordt als er een externe of interne interrupt wordt geleverd.
Arduino-code voor Power-Down Interrupt-modus:
void loop () { // Sta wake-up pin toe om interrupt op low te activeren. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Schakel externe pinonderbreking uit op de ontwaakpin. detachInterrupt (0); // Doe hier iets }
Energiebesparende modus
Om in de energiebesparende modus te komen, moeten we de SM-pin naar '011' schrijven. Deze slaapmodus is vergelijkbaar met de uitschakelmodus, met slechts één uitzondering: als de timer / teller is ingeschakeld, blijft deze actief, zelfs tijdens de slaapstand. Het apparaat kan worden gewekt door de timer overflow te gebruiken.
Als u de tijd / teller niet gebruikt, is het raadzaam de uitschakelmodus te gebruiken in plaats van de energiebesparende modus.
Standby modus
De standby-modus is identiek aan de Power-Down-modus, het enige verschil daartussen is dat de externe oscillator in deze modus blijft werken. Om deze modus in te schakelen, schrijft u de SM-pin naar '110'.
Uitgebreide stand-bymodus
Deze modus is vergelijkbaar met de energiebesparende modus, met als uitzondering dat de oscillator blijft draaien. Het apparaat gaat naar de uitgebreide stand-bymodus wanneer we de SM-pin naar '111' schrijven. Het apparaat heeft zes klokcycli nodig om uit de uitgebreide stand-bymodus te komen.
Hieronder staan de vereisten voor dit project, na het aansluiten van het circuit volgens het schakelschema. Upload de slaapmoduscode naar Arduino met Arduino IDE. Arduino gaat in de inactieve slaapstand. Controleer vervolgens het stroomverbruik in de USB-ampèremeter. Anders kunt u hiervoor ook een stroomtang gebruiken.
Componenten vereist
- Arduino UNO
- DHT11 Temperatuur- en vochtigheidssensor
- USB-ampèremeter
- Breadboard
- Verbindingsdraden
Volg de link voor meer informatie over het gebruik van DHT11 met Arduino. Hier gebruiken we een USB-ampèremeter om de spanning te meten die door Arduino wordt verbruikt in de slaapmodus.
USB-ampèremeter
USB-ampèremeter is een plug-and-play-apparaat dat wordt gebruikt om de spanning en stroom van elke USB-poort te meten. De dongle wordt aangesloten tussen de USB-voeding (computer USB-poort) en USB-apparaat (Arduino). Dit apparaat heeft een weerstand van 0,05 ohm in lijn met de voedingspin waardoor het de waarde van de opgenomen stroom meet. Het apparaat wordt geleverd met een display met vier zeven segmenten, die onmiddellijk de waarden weergeven van stroom en spanning die door het aangesloten apparaat worden verbruikt. Deze waarden worden omgedraaid met een interval van elke drie seconden.
Specificatie:
- Bedrijfsspanningsbereik: 3,5V tot 7V
- Maximale stroomsterkte: 3A
- Compact formaat, makkelijk mee te nemen
- Geen externe voeding nodig
Toepassing:
- USB-apparaten testen
- Belastingsniveaus controleren
- Debuggen van acculaders
- Fabrieken, elektronicaproducten en persoonlijk gebruik
Schakelschema
In de bovenstaande opstelling om Arduino Diepe slaapmodi te demonstreren, is de Arduino aangesloten op de USB-ampèremeter. Vervolgens wordt de USB-ampèremeter in de USB-poort van de laptop gestoken. Datapin van de DHT11-sensor is bevestigd aan de D2-pin van de Arduino.
Code Uitleg
De volledige code voor het project met een video wordt aan het einde gegeven.
De code begint met het opnemen van de bibliotheek voor de DHT11-sensor en de LowPower- bibliotheek. Volg de link om de Low Power-bibliotheek te downloaden. Vervolgens hebben we het Arduino-pinnummer gedefinieerd waarop de datapin van de DHT11 is aangesloten en hebben we een DHT-object gemaakt.
# omvatten
In de void setup- functie hebben we de seriële communicatie geïnitieerd door serial.begin (9600) te gebruiken, hier is de 9600 de baudrate. We gebruiken de ingebouwde LED van Arduino als indicator voor de slaapmodus. We hebben dus de pin als output ingesteld en digitaal schrijven laag.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
In de void loop- functie maken we de ingebouwde LED HOOG en lezen we de temperatuur- en vochtigheidsgegevens van de sensor. Hier DHT.read11 (); commando leest de gegevens van de sensor. Nadat de gegevens zijn berekend, kunnen we de waarden controleren door deze in een willekeurige variabele op te slaan. Hier hebben we twee variabelen van het type float 't' en 'h' genomen . Daarom worden de temperatuur- en vochtigheidsgegevens serieel afgedrukt op de seriële monitor.
void loop () { Serial.println ("Gegevens ophalen uit DHT11"); vertraging (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT. vochtigheid; Serial.print ("Temperatuur ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Humidity ="); Serial.print (h); Serial.println ("%"); vertraging (2000);
Voordat we de slaapstand inschakelen, printen we "Arduino: - Ik ga voor een dutje" en maken we de ingebouwde LED Low. Daarna wordt de Arduino-slaapmodus ingeschakeld met behulp van de onderstaande opdracht in de code.
Onderstaande code maakt de inactieve periodieke slaapmodus van de Arduino mogelijk en geeft een slaapstand van acht seconden. Het zet de ADC, Timers, SPI, USART, 2-draads interface in de UIT-toestand.
Vervolgens wordt Arduino na 8 seconden automatisch uit de slaapstand gehaald en wordt afgedrukt "Arduino: - Hey ik ben net wakker geworden".
Serial.println ("Arduino: - Ik ga voor een dutje"); vertraging (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: - Hey ik ben net wakker"); Serial.println (""); vertraging (2000); }
Dus door deze code te gebruiken, wordt Arduino slechts 24 seconden per minuut wakker en blijft hij de rest van de 36 seconden in de slaapstand, wat het stroomverbruik van het Arduino-weerstation aanzienlijk vermindert.
Daarom, als we de Arduino met de slaapmodus gebruiken, kunnen we de looptijd van het apparaat ongeveer verdubbelen.