Habt ihr euch jemals gefragt, wie ihr eure Arduino-Projekte noch energieeffizienter gestalten könnt? Gerade bei batteriebetriebenen Anwendungen ist das ein entscheidender Faktor. Die Lösung: Die Sleep-Modi des ATmega328P Mikrocontrollers, der auf vielen Arduino-Boards wie dem Uno verbaut ist. In diesem Tutorial tauchen wir tief ein in die verschiedenen Schlafmodi, zeigen euch, wie ihr sie aktiviert und wie ihr den Arduino wieder aufwecken könnt. Lasst uns gemeinsam den Stromverbrauch eurer Projekte senken!
Für dieses Tutorial benötigen wir nicht zwangsläufig zusätzliche Hardware. Allerdings ist ein Arduino Uno (oder ein kompatibles Board mit einem ATmega328P) die Basis. Für Testzwecke und zur Überprüfung des Stromverbrauchs sind folgende Komponenten nützlich:
Da wir in diesem Tutorial hauptsächlich Software-basiert arbeiten, benötigen wir keinen komplizierten Schaltplan. Im Grunde programmieren wir einfach den Arduino Uno über das USB-Kabel. Für eine genaue Messung des Stromverbrauchs schließen wir das Multimeter in Reihe zwischen der Stromversorgung und dem Arduino an. Das Multimeter sollte dabei auf den Mikrobereich (µA) eingestellt sein, um auch kleine Stromverbräuche zu erfassen.
Hier ein einfaches Beispiel, das den Arduino in den Power-Down-Modus versetzt und ihn durch einen Interrupt am Pin 2 (digitalPinToInterrupt(2)) wieder aufweckt.
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/interrupt.h>
// Pin für den Interrupt (Aufwecken)
#define WAKEUP_PIN 2
//Interrupt Service Routine (ISR) für das Aufwachen
void wakeUp() {
// Diese Routine wird ausgeführt, wenn der Interrupt eintritt
// Hier kann man z.B. eine LED einschalten oder eine andere Aktion ausführen
detachInterrupt(digitalPinToInterrupt(WAKEUP_PIN)); // Interrupt deaktivieren
}
void setup() {
Serial.begin(9600);
pinMode(WAKEUP_PIN, INPUT_PULLUP); // Internen Pull-Up Widerstand aktivieren
Serial.println("Gehe in den Sleep-Modus...");
}
void loop() {
// Interrupt konfigurieren
attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeUp, FALLING); // Interrupt bei fallender Flanke
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power-Down-Modus wählen
// Schlafmodus aktivieren
sleep_enable();
// Globale Interrupts aktivieren
sei();
// Schlafmodus starten
sleep_cpu();
// Der Code wird hier fortgesetzt, wenn der Arduino aufgewacht ist
sleep_disable(); // Sleep Modus deaktivieren
power_up(); //Peripherie wieder aktivieren
Serial.println("Arduino ist aufgewacht!");
delay(1000);
Serial.println("Gehe wieder schlafen...");
}
#include <avr/sleep.h>
: Diese Bibliothek stellt Funktionen für die Sleep-Modi bereit.#include <avr/power.h>
: Diese Bibliothek ermöglicht die Steuerung der Energieversorgung einzelner Peripheriegeräte.#include <avr/interrupt.h>
: Diese Bibliothek wird für die Interrupts benötigt (Aufwecken).#define WAKEUP_PIN 2
: Definiert den Pin, der zum Aufwecken verwendet wird. Dieser Pin muss einen Interrupt unterstützen.void wakeUp() { ... }
: Die Interrupt Service Routine (ISR), die ausgeführt wird, wenn der Interrupt ausgelöst wird. Hier können wir Aktionen ausführen, die nach dem Aufwachen notwendig sind.attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeUp, FALLING);
: Konfiguriert den Interrupt. digitalPinToInterrupt(WAKEUP_PIN)
wandelt den Arduino-Pin in eine Interrupt-Nummer um. wakeUp
ist die ISR, die aufgerufen wird. FALLING
bedeutet, dass der Interrupt bei einer fallenden Flanke ausgelöst wird (z.B. wenn der Pin von HIGH auf LOW wechselt).set_sleep_mode(SLEEP_MODE_PWR_DOWN);
: Wählt den Power-Down-Modus. Dieser Modus verbraucht am wenigsten Strom, da die meisten Peripheriegeräte deaktiviert werden.sleep_enable();
: Aktiviert den Sleep-Modus.sei();
: Aktiviert globale Interrupts. Dies ist wichtig, da der Arduino nur durch einen Interrupt aufgeweckt werden kann.sleep_cpu();
: Versetzt den Arduino in den Sleep-Modus. Der Code wird erst nach dem Aufwachen fortgesetzt.sleep_disable();
: Deaktiviert den Sleep-Modus.power_up();
: Aktiviert alle Peripheriegeräte wieder.Durch die Verwendung der Sleep-Modi könnt ihr den Stromverbrauch eurer Arduino-Projekte erheblich reduzieren. Das ist besonders wichtig für batteriebetriebene Anwendungen. Experimentiert mit den verschiedenen Modi und Interrupt-Quellen, um die optimale Lösung für eure Bedürfnisse zu finden. Viel Spaß beim Basteln und Energiesparen!