Spannung messen mit Arduino: Voltmeter & Batteriewächter mit Spannungsteiler bauen
Der Arduino kann von Haus aus nur Spannungen bis 5 V an seinen Analogeingängen messen – höhere Spannungen zerstören den Pin. Mit einem einfachen Spannungsteiler aus zwei Widerständen misst du trotzdem 12 V, 18 V oder mehr. In diesem Tutorial baust du ein digitales Voltmeter mit OLED-Anzeige, verstehst die Mathematik dahinter und erweiterst es am Ende zu einem Batteriewächter, der dich rechtzeitig warnt, bevor dein Akku tiefentladen wird.
Warum du Spannung selbst messen können solltest
Fast jedes größere Projekt läuft irgendwann mit Akku oder externem Netzteil. Dann willst du wissen: Wie voll ist der Akku noch? Liefert das Netzteil wirklich stabile 12 V? Ein gekauftes Voltmeter zeigt dir nur eine Zahl – dein selbstgebautes kann viel mehr: Es kann bei Unterspannung eine LED blinken lassen, Verbraucher über ein Relais abschalten, Werte per Funk senden oder den Spannungsverlauf loggen. Und das Grundprinzip – eine analoge Größe messen und in einen echten Wert umrechnen – brauchst du bei jedem Sensor wieder.
⚠️ Wichtig – die 5-V-Grenze: Die Analogeingänge des Arduino vertragen maximal 5 V. Legst du mehr an, zerstörst du den Pin oder den ganzen Chip. Deshalb ist der Spannungsteiler nicht optional, sondern Pflicht, sobald du über 5 V messen willst. Und: Miss niemals Netzspannung (230 V) – hier geht es ausschließlich um ungefährliche Gleichspannung aus Batterien und Netzteilen.
So funktioniert der Spannungsteiler
Ein Spannungsteiler besteht aus zwei in Reihe geschalteten Widerständen. Die Eingangsspannung teilt sich im Verhältnis der Widerstandswerte auf – am Mittelabgriff greifst du eine kleinere, sichere Spannung ab, die der Arduino messen kann. Die Formel lautet:
V_out = V_in * R2 / (R1 + R2)
Mit R1 = 30 kΩ und R2 = 7,5 kΩ ergibt sich ein Teilerverhältnis von 5:1. Damit werden aus maximal 25 V am Eingang genau 5 V am Arduino-Pin – perfekt ausgereizt. Im Code multiplizierst du den gemessenen Wert einfach wieder mit 5, um die echte Spannung zu erhalten.
ℹ️ Welche Widerstände nehmen? Exakt 30 kΩ und 7,5 kΩ hast du vielleicht nicht. Nimm gleichwertige Kombinationen mit demselben 5:1-Verhältnis, z. B. 100 kΩ und 25 kΩ (= 22 kΩ + 3,3 kΩ in Reihe). Alle gängigen Werte stecken im 600er Widerstands-Set. Größere Widerstände (im kΩ-Bereich) sind gut, weil sie kaum Strom verbrauchen.
Das brauchst du
1Verkabelung des Spannungsteilers
Die zu messende Spannung geht über R1 und R2 nach GND. Der Mittelabgriff zwischen beiden Widerständen führt zum Analogpin A0. Ganz wichtig: Alle Massen (GND) müssen verbunden sein – die des Messobjekts und die des Arduino.
| Verbindung | von → nach | Hinweis |
|---|---|---|
| Pluspol Messobjekt | → R1 (30 kΩ) | zu messende Spannung |
| R1 → R2 (Mittelabgriff) | → A0 | hier misst der Arduino |
| R2 (7,5 kΩ) | → GND | zweiter Widerstand |
| Minuspol Messobjekt | → Arduino GND | gemeinsame Masse! |
| OLED SDA / SCL | → A4 / A5 | I2C-Bus |
| Warn-LED | → D8 über 220 Ω | optional |
2Rohwert auslesen und in Spannung umrechnen
Der Arduino liefert mit analogRead() einen Wert von 0 bis 1023 (10-Bit-ADC). 0 entspricht 0 V, 1023 entspricht der Referenzspannung von 5 V. Diese Pin-Spannung rechnest du über das Teilerverhältnis auf die echte Eingangsspannung hoch:
const int MESS_PIN = A0;
const float VREF = 5.0; // Referenzspannung des ADC
const float TEILER = 5.0; // (R1+R2)/R2 = (30k+7.5k)/7.5k = 5
void setup() {
Serial.begin(115200);
}
void loop() {
int roh = analogRead(MESS_PIN); // 0..1023
float vPin = roh * VREF / 1023.0; // Spannung am Pin
float vEin = vPin * TEILER; // echte Eingangsspannung
Serial.print("Roh: "); Serial.print(roh);
Serial.print(" Pin: "); Serial.print(vPin, 3);
Serial.print(" V Eingang: "); Serial.print(vEin, 2);
Serial.println(" V");
delay(500);
}
ℹ️ Warum durch 1023 und nicht 1024? Der ADC hat 1024 Stufen (0–1023). Der höchste Messwert 1023 entspricht der vollen Referenzspannung, deshalb teilst du durch 1023, um die Skala korrekt abzubilden.
3Kalibrieren für genaue Werte
Zwei Dinge verfälschen die Messung: die reale Referenzspannung (oft nicht exakt 5,00 V) und die Toleranz der Widerstände (±1 %). Deshalb kalibrierst du einmalig mit einem Multimeter. Miss die tatsächliche Spannung an deinem Messobjekt und passe einen Korrekturfaktor an, bis der Arduino denselben Wert zeigt:
float kalibrierung = 1.00; // spaeter anpassen
float messeSpannung() {
long summe = 0;
for (int i = 0; i < 20; i++) { // 20 Messungen mitteln
summe += analogRead(MESS_PIN);
delay(2);
}
float roh = summe / 20.0;
float vPin = roh * VREF / 1023.0;
return vPin * TEILER * kalibrierung;
}
💡 So kalibrierst du: Zeigt dein Multimeter 12,40 V, der Arduino aber 12,10 V, dann setze kalibrierung = 12.40 / 12.10 = 1.025. Das Mitteln über 20 Messungen glättet zusätzlich das Rauschen – die Anzeige wird deutlich ruhiger.
4Voltmeter mit OLED und Batteriewächter
Jetzt bringen wir alles zusammen: gemittelte Messung, OLED-Anzeige und eine Warn-LED, die bei Unterspannung blinkt. Der Batteriewächter ist ideal, um z. B. einen 3-Zellen-LiPo (Warnschwelle ~11,1 V) oder eine 12-V-Bleibatterie zu überwachen. Nutze die Bibliotheken Adafruit GFX und Adafruit SSD1306.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
const int MESS_PIN = A0;
const int WARN_LED = 8;
const float VREF = 5.0, TEILER = 5.0, kalibrierung = 1.00;
const float WARN_SCHWELLE = 11.1; // z.B. LiPo 3S leer
float messeSpannung() {
long summe = 0;
for (int i = 0; i < 20; i++) { summe += analogRead(MESS_PIN); delay(2); }
return (summe / 20.0) * VREF / 1023.0 * TEILER * kalibrierung;
}
void setup() {
pinMode(WARN_LED, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
float v = messeSpannung();
bool leer = v < WARN_SCHWELLE;
digitalWrite(WARN_LED, leer && (millis() / 500) % 2); // blinkt bei leer
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0); display.print("VOLTMETER");
display.setTextSize(3);
display.setCursor(0, 20); display.print(v, 2); display.print("V");
display.setTextSize(1);
display.setCursor(0, 54); display.print(leer ? "!! AKKU LEER !!" : "Status: OK");
display.display();
delay(200);
}
⚠️ Nie über die Auslegung hinaus messen: Der Teiler ist für max. 25 V ausgelegt. Willst du höhere Spannungen messen, passe R1 an, sodass am Pin niemals mehr als 5 V ankommen. Rechne im Zweifel lieber großzügig – ein zerstörter Pin ist ärgerlich.
Genauigkeit verbessern: die interne Referenz
Die 5-V-Versorgung des Arduino schwankt je nach USB-Port und Last. Für genauere Messungen kannst du die stabile interne 1,1-V-Referenz nutzen – dann musst du den Teiler aber so auslegen, dass am Pin maximal 1,1 V ankommen, und im Code analogReference(INTERNAL) setzen sowie mit 1.1 statt 5.0 rechnen. Das lohnt sich, wenn es auf jedes Hundertstel Volt ankommt.
- Mehr mitteln: 50 statt 20 Messungen glätten die Anzeige weiter.
- Werte loggen: Kombiniere das Voltmeter mit einem SD-Datenlogger, um Entladekurven aufzuzeichnen.
- Grundlagen auffrischen: Wie Widerstände und das Ohmsche Gesetz zusammenhängen, steht im Ohmschen-Gesetz-Tutorial.
Troubleshooting
⚠️ Angezeigte Spannung ist viel zu hoch/niedrig: Teilerverhältnis im Code passt nicht zu den verbauten Widerständen. Miss R1 und R2 nach und trage (R1+R2)/R2 als TEILER ein.
⚠️ Wert springt wild umher: Gemeinsame Masse fehlt oder Kontakt wackelt. Verbinde GND von Messobjekt und Arduino und mittle über mehrere Messungen.
⚠️ Anzeige immer 0 V: Der Mittelabgriff hängt nicht an A0 oder R2 nicht an GND. Verdrahtung des Teilers prüfen.
⚠️ OLED bleibt schwarz: Adresse 0x3C prüfen und SDA/SCL an A4/A5 – zur Not mit einem I2C-Scanner.
🚀 Dein Voltmeter-Starterpaket
Alle Bauteile für dieses Projekt im Shop:
- UNO R3 Entwicklungsboard – die Steuerzentrale
- Widerstands-Set – für den Spannungsteiler
- 1,3 Zoll OLED-Display – die Anzeige
- AA-Batteriehalter und 9V-Batterieklemmen – als Messobjekte
- Breadboard 400 Kontakte und Dupont-Jumperkabel
Fazit
Mit nur zwei Widerständen hast du dem Arduino beigebracht, Spannungen weit über seine 5-V-Grenze hinaus zu messen. Du verstehst jetzt den Spannungsteiler, rechnest den ADC-Rohwert sauber in Volt um, kalibrierst mit dem Multimeter und mittelst für eine ruhige Anzeige. Mit der Warn-LED ist daraus ein praktischer Batteriewächter geworden, der deine Akkus vor Tiefentladung schützt.
Von hier aus kannst du Verbraucher über ein Relais automatisch abschalten, Werte per Funk senden oder Entladekurven loggen. Das Wichtigste nimmst du aber immer mit: Miss sicher, bleib unter der 5-V-Grenze am Pin – und kalibriere, wenn es genau werden soll.