TP4056 Lademodul & MT3608 Step-Up: Akkubetriebene ESP32-Projekte mit 18650-Zellen bauen

Ein Mikrocontroller-Projekt am USB-Netzteil ist schnell gebaut – aber sobald es mobil sein soll, im Garten, am Fahrrad oder im 3D-gedruckten Gehäuse ohne Steckdose in der Nähe, brauchst du eine durchdachte Stromversorgung. In diesem Tutorial baust du dir mit einem TP4056-Lademodul und einem MT3608-Step-Up-Wandler eine komplette Akku-Stromversorgung für Arduino- und ESP32-Projekte – inklusive Ladeüberwachung und Batteriestand-Anzeige per Code.

Das Prinzip: Laden, Hochwandeln, Überwachen

Eine einzelne 18650-Lithium-Zelle liefert je nach Ladezustand zwischen etwa 3,0V (leer) und 4,2V (voll) – eine Spannung, die für viele 5V-Module wie Relais oder manche Sensoren zu instabil und teils zu niedrig ist. Die Lösung besteht aus zwei Bausteinen: Das TP4056-Modul lädt die Zelle sicher über USB-C und schützt sie dabei vor Überladung und Tiefentladung. Der MT3608-Step-Up-Wandler wandelt die schwankende Akkuspannung anschließend in eine stabile 5V-Versorgung für deinen Mikrocontroller um – unabhängig davon, ob der Akku gerade voll oder fast leer ist.

Damit dein Projekt nicht einfach mitten im Betrieb abschaltet, liest du zusätzlich per Spannungsteiler und ADC den aktuellen Ladezustand der Zelle direkt im Code aus und kannst frühzeitig warnen, bevor der Akku wirklich leer ist.

Was du brauchst

1x TP4056 USB-C Lademodul mit Schutzschaltung – Zum Produkt
1x MT3608 Step-Up Modul (2V-24V auf 5V-28V) – Zum Produkt
1x ESP32 WiFi Bluetooth Entwicklungsboard – Zum Produkt
1x Solderless Breadboard 400 Kontakte – Zum Produkt
600x Widerstände-Sortiment (für den Spannungsteiler) – Zum Produkt
22AWG Kabel 2-adrig – Zum Produkt

Verkabelung: Vom Akku bis zum ESP32

Die Lithium-Zelle wird an B+/B- des TP4056-Moduls angeschlossen, geladen wird bequem über dessen USB-C-Buchse. Die geregelten Ausgänge OUT+/OUT- des TP4056 gehen weiter an IN+/IN- des MT3608, dessen OUT+/OUT- schließlich deinen ESP32 über den 5V- und GND-Pin versorgt. Für die Spannungsmessung zweigst du zusätzlich einen Spannungsteiler direkt an der Akkuspannung ab.

Verbindung Von Nach
Akku laden 18650-Zelle (+/-) TP4056 B+ / B-
Spannung hochwandeln TP4056 OUT+ / OUT- MT3608 IN+ / IN-
ESP32 versorgen MT3608 OUT+ / OUT- ESP32 5V / GND
Spannungsteiler R1 (100kΩ) Akku + ADC-Pin (GPIO 34)
Spannungsteiler R2 (100kΩ) ADC-Pin (GPIO 34) GND

ℹ️ MT3608 vor Erstgebrauch justieren: Stelle die Ausgangsspannung des MT3608 mit dem kleinen Potentiometer auf der Platine per Multimeter exakt auf 5,0V ein, bevor du zum ersten Mal deinen Mikrocontroller anschließst.

Code 1: Akkuspannung messen und Prozentanzeige berechnen

#define AKKU_PIN 34

// Spannungsteiler 100k/100k -> Faktor 2, ESP32-ADC-Referenz beachten
const float TEILER_FAKTOR = 2.0;
const float ADC_REFERENZ = 3.3;
const int ADC_AUFLOESUNG = 4095;

float leseAkkuspannung() {
  int roh = analogRead(AKKU_PIN);
  float spannungAmPin = (roh / (float)ADC_AUFLOESUNG) * ADC_REFERENZ;
  return spannungAmPin * TEILER_FAKTOR;
}

int berechneProzent(float spannung) {
  // Grobe Näherung für eine Li-Ion-Zelle: 3.0V = 0%, 4.2V = 100%
  float prozent = (spannung - 3.0) / (4.2 - 3.0) * 100.0;
  return constrain((int)prozent, 0, 100);
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
}

void loop() {
  float spannung = leseAkkuspannung();
  int prozent = berechneProzent(spannung);

  Serial.print("Akkuspannung: ");
  Serial.print(spannung);
  Serial.print(" V  (");
  Serial.print(prozent);
  Serial.println(" %)");

  delay(3000);
}

Code 2: Low-Battery-Warnung per LED

#define AKKU_PIN 34
#define WARN_LED 2

const float TEILER_FAKTOR = 2.0;
const float ADC_REFERENZ = 3.3;
const int ADC_AUFLOESUNG = 4095;
const float WARN_SCHWELLE = 3.4; // Volt

float leseAkkuspannung() {
  int roh = analogRead(AKKU_PIN);
  float spannungAmPin = (roh / (float)ADC_AUFLOESUNG) * ADC_REFERENZ;
  return spannungAmPin * TEILER_FAKTOR;
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(WARN_LED, OUTPUT);
}

void loop() {
  float spannung = leseAkkuspannung();

  if (spannung < WARN_SCHWELLE) {
    // Schnelles Blinken = Akku bald leer
    digitalWrite(WARN_LED, HIGH);
    delay(150);
    digitalWrite(WARN_LED, LOW);
    delay(150);
    Serial.println("WARNUNG: Akku schwach!");
  } else {
    digitalWrite(WARN_LED, LOW);
    delay(2000);
  }
}

Code 3: Deep-Sleep zwischen Messungen für maximale Laufzeit

Der größte Hebel für lange Akkulaufzeiten ist der ESP32-Deep-Sleep-Modus – zwischen zwei Messungen zieht das Board dabei nur noch wenige Mikroampere statt mehrerer zehn Milliampere im Normalbetrieb.

#define AKKU_PIN 34
#define SCHLAF_SEKUNDEN 300 // alle 5 Minuten aufwachen

const float TEILER_FAKTOR = 2.0;
const float ADC_REFERENZ = 3.3;
const int ADC_AUFLOESUNG = 4095;

float leseAkkuspannung() {
  int roh = analogRead(AKKU_PIN);
  float spannungAmPin = (roh / (float)ADC_AUFLOESUNG) * ADC_REFERENZ;
  return spannungAmPin * TEILER_FAKTOR;
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  delay(200); // Serial Zeit zum Verbinden geben

  float spannung = leseAkkuspannung();
  Serial.print("Aufgewacht - Akkuspannung: ");
  Serial.print(spannung);
  Serial.println(" V");

  // Hier waere Platz fuer z.B. eine WiFi-Uebertragung des Messwerts

  Serial.println("Gehe schlafen...");
  esp_sleep_enable_timer_wakeup(SCHLAF_SEKUNDEN * 1000000ULL);
  esp_deep_sleep_start();
}

void loop() {
  // wird nie erreicht, da nach setup() direkt in Deep Sleep gegangen wird
}

Praxistipps

🔋 Nur geeignete Zellen laden: Verwende ausschließlich Li-Ion-/Li-Po-Zellen mit eingebauter Schutzschaltung bzw. beachte, dass das TP4056-Modul selbst nur Überladung/Tiefentladung absichert – niemals beschädigte oder aufgeblähte Zellen weiterverwenden.

📉 ADC-Kennlinie kalibrieren: Der ESP32-ADC ist werkseitig nicht perfekt linear. Für eine präzisere Prozentanzeige lohnt sich ein Abgleich mit einem Multimeter bei 2-3 verschiedenen Ladezuständen und eine kleine Korrekturformel im Code.

⚡ Ruhestrom des MT3608 einplanen: Auch im Leerlauf zieht ein Step-Up-Wandler einen kleinen Ruhestrom. Für Projekte mit Deep-Sleep über Tage/Wochen lohnt sich ein Blick ins Datenblatt, um die tatsächliche Standby-Laufzeit realistisch abzuschätzen.

Troubleshooting

⚠️ ESP32 startet nicht am Akku, aber am USB-Kabel schon: Meist liegt die MT3608-Ausgangsspannung nicht exakt bei 5V. Stelle sie mit dem Potentiometer nach und miss direkt am ESP32-5V-Pin unter Last nach.

⚠️ Gemessene Akkuspannung wirkt falsch/instabil: Prüfe die beiden Widerstände des Spannungsteilers auf identischen Wert und stelle sicher, dass analogReadResolution(12) gesetzt ist, damit die Rechnung mit ADC_AUFLOESUNG = 4095 stimmt.

⚠️ TP4056-LED bleibt dauerhaft rot: Das ist bei den meisten Modulen normal während des Ladevorgangs – erst bei vollständig geladener Zelle wechselt die LED auf Grün/Blau, je nach Modulvariante.

⚡ Baue deine eigene mobile Stromversorgung

Alle Bauteile für dieses Tutorial findest du bei MAKEROO.

Fazit

Mit TP4056 und MT3608 verwandelst du eine einzelne Lithium-Zelle in eine zuverlässige, stabile 5V-Stromquelle für dein Projekt – inklusive Ladeschutz und einer Software-Anzeige, wie viel Akku noch übrig ist. In Kombination mit Deep-Sleep wird aus deinem ESP32-Projekt so ein echter Wochen- statt Stunden-Läufer, ganz ohne Steckdose in der Nähe.

Zurück zum Blog