Der Stromverbrauch ist ein kritisches Problem für ein Gerät, das lange Zeit ununterbrochen läuft, ohne ausgeschaltet zu werden. Um dieses Problem zu lösen, verfügt fast jeder Controller über einen Ruhemodus, mit dem Entwickler elektronische Geräte für einen optimalen Stromverbrauch entwickeln können. Der Ruhemodus versetzt das Gerät in den Energiesparmodus, indem das nicht verwendete Modul ausgeschaltet wird.
Zuvor haben wir den Tiefschlafmodus in ESP8266 zum Energiesparen erläutert. Heute lernen wir die Arduino-Schlafmodi kennen und demonstrieren den Stromverbrauch mithilfe von Amperemeter. Ein Arduino Sleep-Modus wird auch als Arduino Power Save-Modus oder Arduino Standby-Modus bezeichnet.
Arduino Schlafmodi
Mit den Ruhemodi kann der Benutzer die nicht verwendeten Module im Mikrocontroller stoppen oder ausschalten, wodurch der Stromverbrauch erheblich reduziert wird. Arduino UNO, Arduino Nano und Pro-mini werden mit ATmega328P geliefert und verfügen über einen Brown-out-Detektor (BOD), der die Versorgungsspannung zum Zeitpunkt des Schlafmodus überwacht.
ATmega328P verfügt über sechs Schlafmodi:
Um in einen der Schlafmodi zu gelangen, müssen wir das Schlafbit im Schlafmodus-Steuerregister (SMCR.SE) aktivieren. Dann wählen die Schlafmodus-Auswahlbits den Schlafmodus zwischen Leerlauf, ADC-Rauschunterdrückung, Ausschalten, Energiesparen, Standby und externem Standby aus.
Ein interner oder externer Arduino-Interrupt oder ein Reset kann den Arduino aus dem Schlafmodus wecken.
Ruhezustand
Um in den Ruhezustand zu wechseln, schreiben Sie die SM-Bits des Controllers '000'. Dieser Modus stoppt die CPU, ermöglicht jedoch den Betrieb von SPI, serieller 2-Draht-Schnittstelle, USART, Watchdog, Zählern und analogem Komparator. Der Leerlaufmodus stoppt grundsätzlich die CLK- CPU und den CLK- FLASH. Arduino kann jederzeit durch externe oder interne Interrupts geweckt werden.
Arduino-Code für den Leerlaufmodus:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Es gibt eine Bibliothek zum Einstellen verschiedener Energiesparmodi in Arduino. Laden Sie also zuerst die Bibliothek über den angegebenen Link herunter und installieren Sie sie. Verwenden Sie den obigen Code, um den Arduino in den Ruhezustand zu versetzen. Mit dem obigen Code wird der Arduino in einen Ruhezustand von acht Sekunden versetzt und wacht automatisch auf. Wie Sie im Code sehen können, schaltet der Leerlaufmodus alle Timer, SPI, USART und TWI (2-Draht-Schnittstelle) aus.
ADC-Rauschunterdrückungsmodus
Um diesen Ruhemodus zu verwenden, schreiben Sie das SM-Bit in '001'. Der Modus stoppt die CPU, ermöglicht jedoch den Betrieb von ADC, externem Interrupt, USART, serieller 2-Draht-Schnittstelle, Watchdog und Zählern. Der ADC-Rauschunterdrückungsmodus stoppt grundsätzlich die CLK- CPU, die CLK- E / A und den CLK- FLASH. Wir können den Controller mit den folgenden Methoden aus dem ADC-Rauschunterdrückungsmodus aktivieren :
- Externer Reset
- Watchdog-System zurücksetzen
- Watchdog unterbrechen
- Brown-out-Reset
- 2-Draht-Adressübereinstimmung der seriellen Schnittstelle
- Externer Pegelinterrupt auf INT
- Pinwechsel-Interrupt
- Timer / Zähler-Interrupt
- SPM / EEPROM-fähiger Interrupt
Ausschaltmodus
Der Power-Down-Modus stoppt alle generierten Uhren und erlaubt nur den Betrieb von asynchronen Modulen. Sie kann aktiviert werden, indem Sie die SM-Bits auf '010' schreiben. In diesem Modus wird der externe Oszillator ausgeschaltet, aber die serielle 2-Draht-Schnittstelle, der Watchdog und der externe Interrupt funktionieren weiterhin. Es kann nur mit einer der folgenden Methoden deaktiviert werden:
- Externer Reset
- Watchdog-System zurücksetzen
- Watchdog unterbrechen
- Brown-out-Reset
- 2-Draht-Adressübereinstimmung der seriellen Schnittstelle
- Externer Pegelinterrupt auf INT
- Pinwechsel-Interrupt
Arduino-Code für den periodischen Ausschaltmodus:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Der Code wird verwendet, um den Ausschaltmodus einzuschalten. Mit dem obigen Code wird der Arduino in einen Ruhezustand von acht Sekunden versetzt und wacht automatisch auf.
Wir können den Ausschaltmodus auch mit einem Interrupt verwenden, bei dem der Arduino in den Ruhezustand wechselt, aber nur aufwacht, wenn ein externer oder interner Interrupt bereitgestellt wird.
Arduino-Code für den Power-Down-Interrupt-Modus:
void loop () { // Erlaube dem Wake Up Pin, einen Interrupt bei Low auszulösen. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Externen Pin Interrupt am Wake Up Pin deaktivieren. removeInterrupt (0); // Mach hier was }
Energiesparmodus
Um in den Energiesparmodus zu gelangen, müssen wir den SM-Pin auf '011' schreiben. Dieser Ruhemodus ähnelt dem Ausschaltmodus, nur mit einer Ausnahme: Wenn der Timer / Zähler aktiviert ist, bleibt er auch zum Zeitpunkt des Ruhezustands im Betriebszustand. Das Gerät kann mithilfe des Timer-Überlaufs aufgeweckt werden.
Wenn Sie die Zeit / den Zähler nicht verwenden, wird empfohlen, den Abschaltmodus anstelle des Energiesparmodus zu verwenden.
Standby Modus
Der Standby-Modus ist identisch mit dem Power-Down-Modus. Der einzige Unterschied besteht darin, dass der externe Oszillator in diesem Modus weiterläuft. Um diesen Modus zu aktivieren, schreiben Sie den SM-Pin auf '110'.
Erweiterter Standby-Modus
Dieser Modus ähnelt dem Energiesparmodus nur mit der Ausnahme, dass der Oszillator weiterläuft. Das Gerät wechselt in den erweiterten Standby-Modus, wenn wir den SM-Pin auf '111' schreiben. Das Gerät benötigt sechs Taktzyklen, um aus dem erweiterten Standby-Modus aufzuwachen.
Nachfolgend sind die Anforderungen für dieses Projekt nach dem Anschließen der Schaltung gemäß Schaltplan aufgeführt. Laden Sie den Schlafmoduscode mithilfe der Arduino IDE in Arduino hoch. Arduino wechselt in den Ruhezustand. Überprüfen Sie dann den Stromverbrauch im USB-Amperemeter. Andernfalls können Sie auch ein Klemmmessgerät verwenden.
Erforderliche Komponenten
- Arduino UNO
- DHT11 Temperatur- und Feuchtigkeitssensor
- USB-Amperemeter
- Steckbrett
- Kabel anschließen
Um mehr über die Verwendung von DHT11 mit Arduino zu erfahren, folgen Sie dem Link. Hier verwenden wir ein USB-Amperemeter, um die von Arduino im Schlafmodus verbrauchte Spannung zu messen.
USB-Amperemeter
Das USB-Amperemeter ist ein Plug-and-Play-Gerät zur Messung der Spannung und des Stroms an jedem USB-Anschluss. Der Dongle wird zwischen dem USB-Netzteil (Computer-USB-Anschluss) und dem USB-Gerät (Arduino) eingesteckt. Dieses Gerät verfügt über einen 0,05-Ohm-Widerstand in Linie mit dem Stromanschluss, über den der Wert des aufgenommenen Stroms gemessen wird. Das Gerät verfügt über vier Sieben-Segment-Anzeigen, die sofort die vom angeschlossenen Gerät verbrauchten Strom- und Spannungswerte anzeigen. Diese Werte werden alle drei Sekunden gewechselt.
Spezifikation:
- Betriebsspannungsbereich: 3,5 V bis 7 V.
- Maximale Nennstromstärke: 3A
- Kompakte Größe, leicht zu tragen
- Keine externe Versorgung erforderlich
Anwendung:
- Testen von USB-Geräten
- Laststufen prüfen
- Debuggen von Ladegeräten
- Fabriken, Elektronikprodukte und persönlicher Gebrauch
Schaltplan
In der obigen Konfiguration wird der Arduino an das USB-Amperemeter angeschlossen, um den Arduino- Tiefschlafmodus zu demonstrieren. Dann wird das USB-Amperemeter an den USB-Anschluss des Laptops angeschlossen. Der Daten-Pin des DHT11-Sensors ist mit dem D2-Pin des Arduino verbunden.
Code Erklärung
Der vollständige Code für das Projekt mit einem Video wird am Ende angegeben.
Der Code enthält zunächst die Bibliothek für den DHT11-Sensor und die LowPower- Bibliothek. Zum Herunterladen der Low Power-Bibliothek folgen Sie dem Link. Dann haben wir die Arduino-Pin-Nummer definiert, mit der der Daten-Pin des DHT11 verbunden ist, und ein DHT-Objekt erstellt.
#einschließen
In der Void-Setup- Funktion haben wir die serielle Kommunikation mit serial.begin (9600) initiiert. Hier ist der 9600 die Baudrate. Wir verwenden die eingebaute LED von Arduino als Anzeige für den Schlafmodus. Also haben wir den Pin als Ausgang gesetzt und das digitale Schreiben niedrig.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }}
In der Hohlraumschleifenfunktion machen wir die eingebaute LED HIGH und lesen die Temperatur- und Feuchtigkeitsdaten vom Sensor. Hier DHT.read11 (); Befehl liest die Daten vom Sensor. Sobald die Daten berechnet sind, können wir die Werte überprüfen, indem wir sie in einer beliebigen Variablen speichern. Hier haben wir zwei Float-Variablen 't' und 'h' genommen . Daher werden die Temperatur- und Feuchtigkeitsdaten seriell auf dem seriellen Monitor gedruckt.
void loop () { Serial.println ("Daten von DHT11 abrufen"); Verzögerung (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT.humidity; Serial.print ("Temperature ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Humidity ="); Serial.print (h); Serial.println ("%"); Verzögerung (2000);
Bevor wir den Schlafmodus aktivieren, drucken wir "Arduino: - Ich mache ein Nickerchen" und machen die eingebaute LED niedrig. Danach wird der Arduino-Schlafmodus mit dem unten im Code genannten Befehl aktiviert.
Der folgende Code aktiviert den periodischen Ruhezustand des Arduino und gibt einen Ruhezustand von acht Sekunden. Die ADC-, Timer-, SPI-, USART- und 2-Draht-Schnittstelle wird ausgeschaltet.
Dann weckt es Arduino nach 8 Sekunden automatisch aus dem Schlaf und druckt „Arduino: - Hey, ich bin gerade aufgewacht“.
Serial.println ("Arduino: - Ich mache ein Nickerchen"); Verzögerung (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, ich bin gerade aufgewacht"); Serial.println (""); Verzögerung (2000); }}
Wenn Sie diesen Code verwenden, wird Arduino in einer Minute nur 24 Sekunden lang aktiviert und bleibt für den Rest der 36 Sekunden im Ruhemodus, wodurch der Stromverbrauch der Arduino-Wetterstation erheblich reduziert wird.
Wenn wir das Arduino im Ruhemodus verwenden, können wir daher die Gerätelaufzeit ungefähr verdoppeln.