Lolin D32: Batteriespannung direkt messen – so geht's
Wer ein WEMOS Lolin D32 Board mit einem LiPo-Akku betreibt, möchte oft wissen, wie voll die Batterie noch ist – sei es für eine Statusanzeige, eine automatische Abschaltung oder einfach nur zur Kontrolle. Die gute Nachricht: Das Lolin D32 macht das ungewöhnlich einfach, denn es hat bereits einen fertigen Spannungsteiler direkt auf der Platine verbaut. Ihr braucht weder Lötkolben noch externe Bauteile – ein paar Zeilen Code genügen.
Inhaltsverzeichnis
Was steckt hinter GPIO 35?
Der ESP32-Chip selbst kann an seinen analogen Eingängen (ADC) maximal 3,3 V messen. Ein vollgeladener LiPo-Akku liefert aber bis zu 4,2 V – das wäre zu viel und würde den Pin beschädigen. Das Lolin D32 löst dieses Problem elegant mit einem internen Spannungsteiler, bestehend aus zwei gleichen 100-kΩ-Widerständen in Reihenschaltung. Dieser halbiert die anliegende Akkuspannung exakt und legt das Ergebnis an GPIO 35 (ein reiner Input-Only-Pin, nicht am Steckleisten-Raster verfügbar).
Die Formel dahinter ist denkbar einfach: Wenn der ADC zum Beispiel 2,1 V misst, liegt am Akku das Doppelte an – also 4,2 V. Der Code muss diesen Faktor beim Umrechnen berücksichtigen.

Der fertige Beispiel-Code
Das folgende Programm liest die Spannung aus, mittelt mehrere Samples (Oversampling), um das Rauschen zu reduzieren und gibt anschließend das Ergebnis im Seriellen Monitor in der Arduino IDE aus:
// Definition des analogen Pins für die Batteriemessung
// Beim Lolin D32 ist der interne Spannungsteiler an GPIO 35 angeschlossen
const int BATTERY_PIN = 35;
// Kalibrierungsfaktor: Der ADC des ESP32 misst bis 3.3V (standardmäßig mit 11dB Dämpfung).
// Da der Spannungsteiler die Akkuspannung halbiert, entspricht die maximale
// messbare Akkuspannung theoretisch 2 * 3.3V = 6.6V.
// Der ESP32 ADC ist oft nicht perfekt linear, daher nutzen wir einen typischen Multiplikator.
const float CONVERSION_FACTOR = 1.7;
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(10);
}
Serial.println("Lolin D32 - Batteriemessung gestartet.");
}
void loop() {
// Mehrere Messungen durchführen, um Rauschen zu minimieren (Oversampling)
int rawValue = 0;
const int samples = 20;
for (int i = 0; i < samples; i++) {
rawValue += analogRead(BATTERY_PIN);
delay(5);
}
float averageRaw = (float)rawValue / samples;
// Umrechnung in Volt:
// 3.3V Referenz / 4095 (12-Bit Auflösung) * 2 (wegen Spannungsteiler)
float batteryVoltage = (averageRaw * 3.3 / 4095.0) * 2.0;
Serial.print("Analoger Rohwert (Schnitt): ");
Serial.print(averageRaw, 1);
Serial.print(" | Akkuspannung: ");
Serial.print(batteryVoltage, 2);
Serial.println(" V");
delay(4000);
}
Wie funktioniert die Berechnung?
Der ADC des ESP32 hat eine 12-Bit-Auflösung, liefert also Rohwerte zwischen 0 und 4095. Dabei entspricht der Maximalwert 4095 einer Eingangsspannung von 3,3 V. Die Formel zum Umrechnen lautet:

Der Faktor 2 am Ende kompensiert den Spannungsteiler, der die Akkuspannung halbiert hat. Das Oversampling (20 Messungen, anschließend Mittelwert) glättet das typische Rauschen des ESP32-ADC erheblich.
Wichtige Hinweise für die Praxis
Der berüchtigte ADC-Knick
Die analogen Eingänge des ESP32 haben eine bekannte Schwäche: Sie sind nicht vollständig linear. Besonders an den Rändern des Messbereichs – also unterhalb von ca. 0,1 V und oberhalb von ca. 3,1 V – weicht die gemessene Spannung merklich vom realen Wert ab. Für eine grobe Einschätzung des Ladezustands (voll, halbvoll, leer) ist die obige Formel aber absolut ausreichend.
Feintuning per Kalibrierung
Wer es genauer braucht, kann mit einem Multimeter nachmessen: Liegt der angezeigte Wert im Seriellen Monitor über oder unter dem echten Messwert, lässt sich der Code in zwei Stellen anpassen:
- Den Wert 3.3 im Rechenausdruck leicht erhöhen oder verringern (z. B. auf 3.28)
- Den CONVERSION_FACTOR minimal anpassen
So lässt sich die Anzeige innerhalb weniger Minuten auf wenige Millivolt genau trimmen.
Baudrate nicht vergessen
Der Serielle Monitor der Arduino IDE muss auf 115200 Baud eingestellt sein. Stimmt die Baudrate nicht, zeigt der Monitor hingegen nur unleserliche Kryptogramme.
Stromverbrauch: Dauerbrenner oder vernachlässigbar?
Der interne Spannungsteiler ist fest verdrahtet und fließt permanent Strom – auch dann, wenn ihr den ADC gar nicht nutzt. Wie viel ist das konkret?
Der Gesamtwiderstand der Reihenschaltung beträgt:

Daraus ergibt sich der Stromfluss via Ohmsches Gesetz (I = U / R):
- Bei vollem Akku (4,2 V): 21μA
- Bei fast leerem Akku (3,6 V): 18μA
Zum Vergleich: Wenn der ESP32 aktiv funkt, verbraucht er zwischen 80.000 µA und 250.000 µA (80–250 mA). Die permanenten ~20 µA des Spannungsteilers sind also im normalen Betrieb absolut zu vernachlässigen. Bei einem typischen 1000-mAh-LiPo würde der Spannungsteiler alleine mehr als 5 Jahre brauchen, um den Akku leerzusaugen.
Der Haken beim Deep Sleep
Anders sieht es aus, wenn ihr das Board in den Tiefschlaf (Deep Sleep) versetzt: In diesem Modus reduziert der ESP32-Chip seinen eigenen Verbrauch auf etwa 10–15 µA. In diesem Zustand verbraucht der fest verbaute Spannungsteiler mit seinen ~20 µA mehr Strom als der gesamte restliche Mikrocontroller. Für absolute Ultra-Low-Power-Projekte (Sensoren, die jahrelang laufen sollen) ist das also durchaus relevant. Eine saubere Lösung wäre, den Spannungsteiler über einen MOSFET-Transistor abschaltbar zu machen – auf dem Lolin D32 ist er jedoch ab Werk fest verdrahtet, was diese Option ohne Eingriff in die Hardware ausschließt – und man hier mit einem komplett anderen Board vermutlich besser fahren würde.
FAQ: Warum zeigt das Board ~3,85 V, obwohl kein Akku steckt?
Das ist eine häufige Verwirrung, doch die Erklärung ist simpel: Das WEMOS Lolin D32 besitzt eine integrierte Ladeschaltung (typischerweise einen TP4054 oder einen ähnlichen Lade-IC). Wenn ihr das Board per USB versorgt, versucht dieser Chip, den VBAT-Anschluss mit Spannung zu versorgen, um einen angeschlossenen Akku zu laden. Da der Spannungsteiler direkt an dieser VBAT-Leitung hängt, misst der ESP32 in diesem Moment nicht einen echten Akku, sondern die Ausgangsspannung des Ladereglers und die schwebt ohne Last meistens irgendwo zwischen 3,7 V und 4,2 V.
Ein zweites Phänomen kann ebenfalls mitspielen: Wenn wirklich gar nichts angeschlossen ist, kann der ADC-Pin wie eine kleine Antenne wirken und elektromagnetisches Rauschen aufnehmen (Floating Pin). Die angezeigten Werte sind dann zufällig und bedeutungslos.
Die Faustregel: Solange kein Akku angesteckt ist, die Werte im Seriellen Monitor einfach ignorieren. Sobald ein echter LiPo angeschlossen ist, zwingt er die Leitung auf seine tatsächliche Spannung – die Messung wird sofort stabil und aussagekräftig.
Fazit
Das Lolin D32 ist für LiPo-Projekte besonders komfortabel, weil der Spannungsteiler bereits fertig verbaut ist. Mit wenigen Zeilen Arduino-Code lässt sich somit der Ladestand zuverlässig überwachen – ideal für mobile Geräte, Sensorknoten oder jedes andere batteriebetriebene Projekt. Für einfache Statusinformationen (voll/halbvoll/leer) reicht die Standardformel vollkommen. Wer Präzision braucht, kalibriert einmalig mit dem Multimeter nach. Nur wer auf absolute Akkulaufzeit optimiert und Deep Sleep intensiv nutzt, muss den Dauerstromverbrauch des Spannungsteilers jedoch im Hinterkopf behalten.
Letzte Aktualisierung am 28. Mai 2026 / Affiliate Links / Bilder von der Amazon Product Advertising API