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.

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.

Zurück zum Blog