Arduino Powerbank Abschaltautomatik verhindern - Prevent Automatic Power Off

Powerbanks eignen sich ideal für den Betrieb von Arduino Boards, ESP32, ESP8266 oder auch NodeMCU Boards. Sie sind nicht nur wegen der teilweise besonders hohen Kapazität sehr beliebt, sondern verfügen auch gleich über die benötigten 5V Betriebsspannung. Allerdings gibt es ein großes Problem bei nahezu allen Powerbanks: Sie funktionieren mit Mikrocontrollern nicht oder schalten nach wenigen Minuten Betriebszeit einfach aus. In diesem Artikel zeigen wir, welche Möglichkeiten es gibt, wie man einen Mikrocontroller kompatibel macht für einen Powerbank.

Warum schaltet der Powerbank überhaupt ab?

Im Powerbank befindet sich eine eigene Elektronik, die bei einer zu geringen Energieaufnahme die Stromzufuhr abschaltet. Powerbanks sind nicht für den Dauerbetrieb gedacht und nur für Aufladezwecke vorgesehen. Lädt man zum Beispiel damit den Akku vom Smartphone, so fließt ein Strom von einigen Hundert Milliampere bis hin zu ein bis drei Ampere. Wenn der Akku vollgeladen ist, geht die Stromaufnahme deutlich zurück und das Smartphone bezieht nur noch wenige Milliampere. Genau zu diesem Zeitpunkt sollte dann der Powerbank abschalten. Ein Mikrocontroller wie Beispielsteiße ein Arduino Uno Board benötigt im Leerlauf weniger als 30 Milliampere. Der Powerbank nimmt nun an, dass das angeschlossene Gerät vollgeladen ist, und schaltet daher sofort oder nach wenigen Minuten ab. Um dies zu unterbinden, muss man den Powerbank belasten bzw. einen leeren Smartphone-Akku vortäuschen.

Erste Variante (Lastwiderstand)

Die einfachste aber auch ineffizienteste Lösung ist ein Widerstand, der parallel zwischen Powerbank und Mikrocontroller geschaltet wird. Das kann z. B. ein 220 Ohm Widerstand sein. Man hat dadurch einen höheren Stromverbrauch, der sinnlos Energie verschwendet und den Powerbank schnell entleert. Wenn man z. B. den Stromverbrauch vom Arduino (~30 mA) und den Lastwiderstand (~90 mA) addiert, so ergibt das einen Energieverbrauch von 120 mA, was meistens ausreicht für einen Powerbank im Dauerbetrieb. Allerdings läuft der Arduino mit einem 2000 mA Powerbank dann gerade einmal 24 Stunden, was sehr wenig ist. Es gibt aber eine ähnliche und weit aus effizientere Lösung, die wir im nächsten Absatz erklären.

Zweite Variante (Impulslast)

Die zweite Variante ist eindeutig die bessere, jedoch erfordert diese mehr Bauteile. Der größte Vorteil ist der niedrige Energieverbrauch im Gegensatz zur ersten Variante, weil hier der Lastwiderstand nur sehr kurz in Betrieb ist. Da das Arduino Board und nahezu alle Mikrocontroller auf einen digitalen Ausgang nur maximal 40 mA schalten können, wir ein Verstärker benötigt. In unserem Fall ist das ein NPN BC547 Transistor. Dieser Transistor kann bis zu 100 mA schalten, was für den Powerbank ausreichend ist. Da der Eigenverbrauch bei etwa 25 mA liegt und der Arduino auch noch andere Aufgaben hat, kommt man in den meisten Fällen auf über 150 mA Gesamtstrom, was ausreichen sollte, um die Abschaltautomatik zu verhindern.

Achtung: Bei der Verwendung von 0.25 Watt Widerständen mit weniger als 100 Ω können diese im Dauerbetrieb sehr heiß werden und beschädigt werden!

Arduino Powerbank Dummy Load Wiring
Kollektor Widerstandstabelle
Widerstand Kollektorstrom Gesamtstrom
150 Ω ca. 30 mA ca. 55 mA
100 Ω ca. 45 mA ca. 70 mA
68 Ω ca. 65 mA ca. 90 mA
47 Ω ca. 95 mA ca. 120 mA
Gesamtstrom = Summe aus dem Eigenverbrauch von einem Arduino Uno und den Lastwiderstand

Die Software

Die Software ist sehr einfach aufgebaut und beinhaltet lediglich einen Timer, der nach X Sekunden für eine Sekunde einen digitalen Ausgang (Standard: Pin 10) einschaltet. Der Vorteil von diesem Code ist, dass es für die Wartezeit kein "delay" gibt und der Mikrocontroller dazwischen andere Aufgaben erledigen kann.

Sourcecode für Arduino
/* 
More information at: https://www.aeq-web.com
Version 1.0 | 2019-APR-02
*/

int dummyloadpin = 10;
long cronmillis = 0;
long interval = 4000;
 
void setup()
{
  pinMode(dummyloadpin,OUTPUT);
}
 
void loop() 
{
  if ((millis() - cronmillis) > interval) 
    {
      cronmillis = millis();
      digitalWrite(dummyloadpin,HIGH);
      delay(1000);
      digitalWrite(dummyloadpin,LOW);
    }
}

Oft gelesen

Anzeige:

Social Media

Newsletter