Ich beschäftige mich jetzt schon seit geraumer Zeit mit Arduinos, insbesonders mit dem Pro Mini. Da ich LoRaWAN Nodes für TheThingsNetwork bauen, versuche ich immer die Nodes möglichst stromsparend zu designen. Ein Node sollte eine möglichst lange Laufzeit von mehreren Monaten aufweisen, damit nicht andauern die Batterien getauscht werden müssen. Strom sparen ist also das Thema, an dem man nicht vorbei kommt.
Ihr könnt dem ganzen natürlich entgehen, indem ihr euren Node durch eine permanente Spannungsquelle versorgt, oder auch eine Unterstützung mittels Solarzelle ist eine gute Erweiterung.
Auswahl der richtigen Hardware
Ich verwende momentan fast nur noch Arduino Pro Minis in der 3.3 Volt Variante. Diese sind klein und brauchen nicht viel Strom. Einzig der begrenzte Speicher könnte manchem Projekt im Wege stehen. Richtig modifiziert verbraucht der Controller auch kaum Strom im Ruhezustand.
Neben der Controller ist aber auch gerade die Wahl des richtigen Sensors wichtig. Ein Sensor der permanent 50 mA Strom verbraucht, ist für ein Projekt, welches mit Batterien betrieben wird, nicht geeignet. Ihr solltet also möglichst Sensoren verwenden, welche wenig Strom benötigen. Also schaut euch die Datenblätter an und versucht zu ermitteln, wie ihr eventuell Strom sparen könnt. Sensoren, welche permanent beheizt werden müssen, sind leider nicht geeignet. Ein Sensor wie der Grove Multi Channel Gas Sensor ist leider nicht geeignet.
Strom sparen durch Software
Danke Librarys wie der Low-Power Library von Rocket Scream ist es möglich der Arduino schlafen zu legen und seinen Stromverbrauch drastisch zu senken.
Hier ein kleiner Beispielcode welcher die Anwendung zeigt.
[code]
#include "LowPower.h"
// Schedule measurement every this many seconds
const unsigned MS_INTERVAL = 904; //multiple of 8 here about 15 Minutes
void setup() {
}
void loop()
{
int sleepcycles = MS_INTERVAL / 8; // calculate the number of sleepcycles (8s) given the MS_INTERVAL
for (int i=0; i<sleepcycles; i++) {
// Enter power down state for 8 s with ADC and BOD module disabled
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
// Start job
do_send(&sendjob);
}
}
[/code]
Ihr solltet euch auch darüber Gedanken machen, wie oft ihr Daten verschicken wollt. Das Sendet kostet viel Strom, also fragt euch ob ihr wirklich die Werte jede Minute braucht, oder ob auch 5, 10 oder 15 Minuten reichen. Je weniger Airtime, desto länger läuft der Node.
Strom sparen durch Hardware-Mod
Den oben genannten Arduino Pro Mini kann man modifizieren um noch weniger Strom zu benötigen. Die Power LED ist absolut unnötig und kann direkt entfernt werden. Der Spannungswandler kann in den meisten Fällen ebenfalls entfernt werden.
Das Ergebnis beider Methoden sieht folgendermaßen aus:
Zustand | LED | Wandler | Verbrauch |
Aktiv | Mit | Mit | 5 mA |
Ruhezustand | Mit | Mit | 1.2 mA |
Aktiv | Ohne | Mit | 3.6 mA |
Ruhezustand | Ohne | Mit | 33uA |
Aktiv | Ohne | Ohne | 3.6 mA |
Ruhezustand | Ohne | Ohne | 5uA |
Als Ergebnis habt ihr also einen Mikrocontroller, der die meiste Zeit 5 uA verbraucht und nur kurzzeitig seine vollen 3.6 mA.
Strom sparen durch Design
Der Arduino ProMini kann an seinen digitalen Ausgänge 40 mA liefern, was für viele Sensoren reichen sollte. Das gute daran ist, dass ihr die Ausgänge schalten könnt und ihr somit entscheiden könnt wann der Sensor mit Strom versorgt wird und wann nicht. Ihr schaltet also den Pin auf High, warten kurz und führt eure Messung durch, Anschließend setzt ihr den Pin wieder auf Low. Bei meinem Projekt mit dem Bodenfeuchte-Sensor, habe ich damit sehr gute Erfahrungen gemacht. Der große Vorteil ist, dass der Sensor nur dann Strom verbraucht, wenn er auch wirklich benötigt wird. Leider könnt ihr diese Methode nicht für jede Art von Sensor verwenden, ein Versuch ist es jedoch wert.
Hinweis:
Leider war das nur die halbe Wahrheit. Der ProMini kann zwar bis zu 40mA an seinen Ausgängen liefern, jedoch ist die Ausgangsspannung abhängig vom Stromverbrauch der Quelle. In der nachfolgenden Grafik sieht man das Problem. Anstelle von 3 Volt, liefert ein Ausgang mit 20 mA belastet, nur noch 2,2V.
Mein GPS-Sensor verbraucht angeblich 35mA. Durch diese Belastung sinkt die Spannung am Ausgang auf weit unter 2 Volt und das GPS-Modul funktioniert nicht. Meine Lösung bestand nun darin mehrere Ausgänge zusamen zuschalten. Ich schalte nun drei PINs am ProMini gleichzeitig auf High und lege sie gemeinsam auf VCC des GPS-Moduls. Damit verteilt sich die Belastung gleichmäßig auf alle drei Ausgänge und die Spannung reicht zum Betrieb des Moduls aus.
In diesem Beispiel, wird ein Sensor über den digitalen Pin 9 mit Strom versorgt und seine Werte über A0 ausgelesen. Indem wir den Pin 9 auf High oder Low setzen, schalten wir den Sensor ein oder aus.
[code]
void setup() {
pinMode(9, OUTPUT);
pinMode(A0, INPUT);
}
void loop() {
digitalWrite(9, HIGH); // sets the digital pin 9 on
delay(1000); // waits for a second
Value = AnalogRead(A0); // performs reading
digitalWrite(9, LOW); // sets the digital pin 9 off
delay(5000);
}
[/code]