ACS712 Stromsensor mit Arduino auslesen: Energieverbrauch messen und überwachen
Wie viel Strom zieht dein 3D-Drucker gerade wirklich, wann schaltet die Pumpe im Aquarium zu oft, und merkt dein System, wenn ein Motor blockiert? Der ACS712 Hall-Effekt-Stromsensor beantwortet all diese Fragen – berührungslos, ohne den Stromkreis aufzutrennen, und für unter zwei Euro. In diesem Tutorial baust du damit ein vollständiges Energie-Monitoring für deinen Arduino.
Warum Strom messen?
In den meisten Projekten misst du Temperatur, Feuchtigkeit oder Distanz – aber der elektrische Strom selbst bleibt oft eine Blackbox. Dabei ist er einer der aussagekräftigsten Werte überhaupt: Ein plötzlicher Stromanstieg verrät, dass ein Motor blockiert. Ein Stromabfall auf null zeigt, dass eine Last ausgefallen ist. Und die Summe über die Zeit ergibt den tatsächlichen Energieverbrauch in Wattstunden.
Der ACS712 misst das, ohne dass du die Leitung auftrennen oder einen teuren Shunt-Widerstand samt Verstärkerschaltung bauen musst. Er nutzt den Hall-Effekt: Der zu messende Strom fließt durch eine interne Leiterbahn, das dadurch erzeugte Magnetfeld wird berührungslos erfasst und in eine proportionale Analogspannung umgewandelt, die du ganz normal mit analogRead() auslesen kannst – genau wie beim BMP280-Sensor oder anderen analogen Modulen.
Was du brauchst
| Bauteil | Menge | ca. Preis | Link |
|---|---|---|---|
| ACS712 Hall-Effekt Stromsensor Modul | 1x | ab 1,19 € | Zum Produkt |
| UNO R3 Board | 1x | ab 4,99 € | Zum Produkt |
| 1-Kanal Relais-Modul KY-019 | 1x (optional) | ab 1,09 € | Zum Produkt |
| 0.96 Zoll OLED Display SSD1306 | 1x (optional) | ab 2,49 € | Zum Produkt |
| Breadboard 400 Kontakte | 1x | ab 3,49 € | Zum Produkt |
| 22AWG Kabel rot/schwarz | Meterware | ab 0,99 € | Zum Produkt |
Funktionsweise: Wie der ACS712 misst
🔬 Hall-Effekt statt Shunt-Widerstand
Klassische Strommessungen nutzen einen niederohmigen Shunt-Widerstand in Reihe zur Last und messen den winzigen Spannungsabfall darüber – das kostet Präzision und erfordert eine Verstärkerschaltung. Der ACS712 umgeht das: Der Strom fließt durch eine interne Kupferbahn, ein integrierter Hall-Sensor-Chip erfasst das dabei entstehende Magnetfeld galvanisch getrennt vom Messsignal. Das Ergebnis ist eine analoge Ausgangsspannung, die linear mit dem Strom skaliert.
- Ruhespannung (0 A) liegt bei exakt VCC / 2, bei 5V Betriebsspannung also ca. 2,5V
- Die Empfindlichkeit unserer 5A-Variante beträgt 185 mV pro Ampere
- Fließt Strom in die Gegenrichtung, sinkt die Spannung unter 2,5V – der Sensor misst also auch negative Werte und eignet sich für Wechselstrom
- Die galvanische Trennung zwischen Leistungspfad und Signalpfad schützt deinen Arduino vor Spannungsspitzen auf der Lastseite
Die Formel zur Umrechnung von Rohspannung in Ampere lautet:
Strom (A) = (gemessene_Spannung - VCC/2) / Sensitivity
Bei 5V Betriebsspannung und der 5A-Variante (185 mV/A) ergibt sich: Strom = (Vout - 2.5) / 0.185. Wichtig: Die tatsächliche VCC deines Arduinos schwankt leicht (meist zwischen 4,8V und 5,1V) – für präzise Messungen solltest du die reale Referenzspannung kalibrieren, wie im Code weiter unten gezeigt.
Schaltungsaufbau
| ACS712 Pin | UNO R3 Pin | Funktion |
|---|---|---|
| VCC | 5V | Spannungsversorgung Sensorlogik |
| GND | GND | Masse |
| OUT | A0 | Analoges Messsignal |
| IP+ / IP- | in Reihe zur Last | Leistungspfad (Plus- oder Minusleitung der zu messenden Last) |
⚠️ Leistungspfad korrekt verkabeln: IP+ und IP- führen den vollen Laststrom, nicht nur ein Signal! Die zu messende Leitung (z. B. das Pluskabel deines Motors oder Netzteils) wird durch den Sensor in Reihe geschaltet – der Strom fließt also durch den Sensor hindurch zur Last. VCC/GND/OUT sind davon komplett getrennt und versorgen nur die Messelektronik.
⚠️ Nur DC-Kleinspannung ohne Erfahrung: Für Messungen an 230V-Netzspannung brauchst du zwingend Fachkenntnisse und geeignete Isolation – das ist nichts für ein erstes Experiment auf dem Breadboard. Bleib für den Einstieg bei Gleichspannungslasten wie Motoren, LED-Streifen oder Akkus.
Code 1: Strom auslesen mit Kalibrierung
Dieser erste Sketch liest den Rohwert aus, kalibriert den Nullpunkt automatisch beim Start (wichtig: dabei darf keine Last angeschlossen sein) und gibt den Strom in Ampere aus.
const int SENSOR_PIN = A0;
const float SENSITIVITY = 0.185; // V pro A, fuer die 5A-Variante
const int SAMPLES = 200;
float nullpunktSpannung = 2.5; // wird in setup() kalibriert
void setup() {
Serial.begin(9600);
Serial.println("Kalibriere Nullpunkt - keine Last anschliessen...");
delay(2000);
long summe = 0;
for (int i = 0; i < SAMPLES; i++) {
summe += analogRead(SENSOR_PIN);
delay(2);
}
float rohMittel = summe / (float)SAMPLES;
nullpunktSpannung = rohMittel * (5.0 / 1023.0);
Serial.print("Nullpunkt kalibriert: ");
Serial.print(nullpunktSpannung, 4);
Serial.println(" V");
}
void loop() {
long summe = 0;
for (int i = 0; i < SAMPLES; i++) {
summe += analogRead(SENSOR_PIN);
delayMicroseconds(200);
}
float rohMittel = summe / (float)SAMPLES;
float spannung = rohMittel * (5.0 / 1023.0);
float strom = (spannung - nullpunktSpannung) / SENSITIVITY;
Serial.print("Strom: ");
Serial.print(strom, 3);
Serial.println(" A");
delay(500);
}
So funktioniert's
Statt eines einzelnen analogRead() mittelt der Code 200 Messungen. Das reduziert das Rauschen erheblich, das bei Hall-Sensoren durchaus spürbar ist. Die Kalibrierung im setup() gleicht Fertigungstoleranzen und die tatsächliche Betriebsspannung deines Boards aus – das ist der wichtigste Schritt für präzise Ergebnisse.
Code 2: Effektivstrom (RMS) für Wechsellasten
Bei DC-Lasten reicht der Mittelwert. Bei pulsierenden oder wechselnden Lasten (z. B. PWM-gesteuerte Motoren) brauchst du den Effektivwert (RMS), um die tatsächliche Belastung korrekt zu erfassen.
const int SENSOR_PIN = A0;
const float SENSITIVITY = 0.185;
const float NULLPUNKT = 2.500; // ggf. vorher kalibrieren
const int SAMPLES = 500;
void setup() {
Serial.begin(9600);
}
void loop() {
float summeQuadrate = 0;
for (int i = 0; i < SAMPLES; i++) {
int roh = analogRead(SENSOR_PIN);
float spannung = roh * (5.0 / 1023.0);
float momentanStrom = (spannung - NULLPUNKT) / SENSITIVITY;
summeQuadrate += momentanStrom * momentanStrom;
delayMicroseconds(150);
}
float rmsStrom = sqrt(summeQuadrate / SAMPLES);
Serial.print("RMS-Strom: ");
Serial.print(rmsStrom, 3);
Serial.println(" A");
delay(500);
}
Statt die Rohwerte direkt zu mitteln, wird hier jeder Einzelwert quadriert, aufsummiert und am Ende die Wurzel gezogen – die klassische RMS-Berechnung. Dadurch heben sich positive und negative Halbwellen nicht gegenseitig auf, sondern tragen beide korrekt zur Gesamtbelastung bei.
Code 3: Energie-Monitor mit automatischer Abschaltung
Jetzt kombinieren wir den Stromsensor mit dem KY-019 Relais-Modul aus unserem Relais-Tutorial: Überschreitet der Strom einen Grenzwert (z. B. bei einem blockierten Motor), schaltet der Arduino die Last automatisch ab und protokolliert zusätzlich die verbrauchte Energie in Wattstunden.
const int SENSOR_PIN = A0;
const int RELAIS_PIN = 7;
const float SENSITIVITY = 0.185;
const float NULLPUNKT = 2.500;
const float MAX_STROM = 2.5; // Grenzwert in Ampere
const float BETRIEBSSPANNUNG = 12.0; // Spannung der Last, fuer Wattberechnung
float wattstundenGesamt = 0;
unsigned long letzteMessung = 0;
bool abgeschaltet = false;
void setup() {
Serial.begin(9600);
pinMode(RELAIS_PIN, OUTPUT);
digitalWrite(RELAIS_PIN, HIGH); // Last eingeschaltet (High-Level-Trigger)
letzteMessung = millis();
}
float messeStrom() {
long summe = 0;
const int samples = 200;
for (int i = 0; i < samples; i++) {
summe += analogRead(SENSOR_PIN);
delayMicroseconds(200);
}
float spannung = (summe / (float)samples) * (5.0 / 1023.0);
return (spannung - NULLPUNKT) / SENSITIVITY;
}
void loop() {
float strom = messeStrom();
unsigned long jetzt = millis();
float vergangeneStunden = (jetzt - letzteMessung) / 3600000.0;
letzteMessung = jetzt;
if (!abgeschaltet) {
wattstundenGesamt += strom * BETRIEBSSPANNUNG * vergangeneStunden;
}
Serial.print("Strom: ");
Serial.print(strom, 2);
Serial.print(" A | Verbrauch: ");
Serial.print(wattstundenGesamt, 2);
Serial.println(" Wh");
if (strom > MAX_STROM && !abgeschaltet) {
digitalWrite(RELAIS_PIN, LOW); // Last abschalten
abgeschaltet = true;
Serial.println("!!! Grenzwert ueberschritten - Last abgeschaltet !!!");
}
delay(1000);
}
Der Sketch summiert bei jedem Durchlauf die seit der letzten Messung vergangene Zeit multipliziert mit Strom und Spannung – so entsteht eine laufende Wattstunden-Bilanz. Überschreitet der Strom den in MAX_STROM definierten Grenzwert, schaltet das Relais die Last sofort ab. Das eignet sich z. B. als einfacher Überlastschutz für 3D-Drucker-Lüfter, Pumpen oder Motoren.
Praxisprojekte
🔌 3D-Drucker-Stromwächter: Erkenne, wann dein Drucker fertig ist (Stromverbrauch fällt auf Standby-Niveau) und schalte automatisch die Steckdosenleiste ab.
💧 Pumpen-Überwachung: Kombiniere den ACS712 mit dem Relais aus dem Pflanzenbewässerungs-Tutorial, um eine trockenlaufende Pumpe (niedriger Strom) sofort zu erkennen und abzuschalten.
📊 Energie-Logger: Zeichne den Tagesverlauf des Stromverbrauchs auf und kombiniere das Prinzip mit unserem SD-Karten-Datenlogger, um Verbrauchsprofile über Wochen auszuwerten.
Häufige Fehler
⚠️ Werte springen stark: Hall-Sensoren sind empfindlich gegenüber Rauschen. Erhöhe die Anzahl der Samples in der Mittelwertbildung oder füge einen 100nF-Keramikkondensator zwischen OUT und GND hinzu.
⚠️ Konstant falscher Offset: Wenn der gemessene Strom bei bekannter Nulllast nicht bei 0A liegt, wurde nicht neu kalibriert. Führe die Kalibrierung immer ohne angeschlossene Last durch und speichere den ermittelten Nullpunkt.
⚠️ Last wird nicht erkannt: Prüfe, ob der Strom wirklich durch IP+/IP- fließt und nicht versehentlich nur VCC/GND/OUT verkabelt wurden – diese drei Pins führen keinen Laststrom.
🔧 Baue dein eigenes Energie-Monitoring
Alle Bauteile für dieses Projekt findest du bei makeroo.
- Sensoren & Module – ACS712, Relais & mehr
- Mikrocontroller-Boards – UNO R3, Nano V3 und ESP32
Kombiniere den Stromsensor mit unserem Relais-Tutorial für einen vollständigen Überlastschutz.
Fazit
Mit dem ACS712 verwandelst du deinen Arduino in ein präzises Energie-Messgerät – berührungslos, günstig und einfach zu kalibrieren. Ob Überlastschutz, Energie-Logger oder einfache Verbrauchsanzeige: Die drei Code-Beispiele aus diesem Tutorial lassen sich direkt in deine eigenen Projekte übernehmen.