Ein Aufbau mit ESP32 und SCT-013-Stromsensor ist der günstigste berührungslose Weg, um zu sehen, wie viel Leistung ein Stromkreis aufnimmt, denn die Zange wird um ein Kabel gelegt, ohne etwas aufzutrennen. In diesem Tutorial bauen Sie die Bias-Schaltung, berechnen den Effektivstrom (RMS) mit dem ADC des ESP32, schätzen Leistung und kWh ab und veröffentlichen die Ergebnisse per MQTT an broker.connectmq.com für ein Energie-Dashboard.
Sicherheit geht vor
Der SCT-013 selbst ist eine Klappzange, die nie spannungsführende Leiter berührt – genau das macht dieses Projekt zugänglich. Der Schaltschrank, in den sie kommt, ist eine andere Sache. Wer einen Sicherungskasten oder eine Unterverteilung öffnet, legt lebensgefährliche Spannungen frei. Wenn Sie nicht qualifiziert sind, legen Sie die Zange nur um ein bereits zugängliches Kabel, etwa die Zuleitung eines einzelnen Geräts, die in einem dafür vorgesehenen Adapter in ihre Adern aufgeteilt ist, oder lassen Sie die Zange von einer Elektrofachkraft installieren. Öffnen Sie die Zange eines SCT-013-000 niemals unter Stromfluss, ohne dass ein Bürdenwiderstand angeschlossen ist, denn ein unbelasteter Stromwandler kann an seinen Anschlüssen eine gefährliche Spannung aufbauen.
Die richtige SCT-013-Variante wählen
| Modell | Ausgang | Bürde nötig | Messbereich | Umrechnung |
|---|---|---|---|---|
| SCT-013-000 | Strom, 50 mA bei 100 A | Ja, extern | Bis 100 A | Hängt von Ihrem Bürdenwiderstand ab |
| SCT-013-030 | Spannung, 1 V RMS bei 30 A | Nein, eingebaut | Bis 30 A | 30 A pro Volt |
| SCT-013-020 | Spannung, 1 V RMS bei 20 A | Nein, eingebaut | Bis 20 A | 20 A pro Volt |
| SCT-013-005 | Spannung, 1 V RMS bei 5 A | Nein, eingebaut | Bis 5 A | 5 A pro Volt |
Wählen Sie für einen ersten Aufbau eine Version mit Spannungsausgang, die zum Stromkreis passt. Eine höhere Auflösung bei kleinen Strömen erreichen Sie mit dem kleinsten Messbereich, der Ihre maximale Last abdeckt: Eine 5-A-Zange am Stromkreis eines Kühlschranks liefert weit bessere Messwerte als eine 100-A-Zange.
Wenn Sie den SCT-013-000 verwenden, schalten Sie einen Bürdenwiderstand über seinen Ausgang. Eine Bürde von 22 Ohm hält die Spitzenspannung bei 100 A RMS unter etwa 1,6 V, was zur folgenden Bias-Schaltung passt, und ergibt eine Umrechnung von 2000 / 22, also rund 90,9 A pro Volt.
Die Bias-Schaltung
Die Zange liefert ein Wechselsignal, das um null herum ins Positive und Negative schwingt. Der ADC des ESP32 kann nur 0 bis etwa 3,1 V lesen, daher muss das Signal auf einem Gleichspannungs-Mittelpunkt aufsetzen.
- Schalten Sie zwei gleiche Widerstände (je 10 kOhm) in Reihe zwischen 3V3 und GND. Ihr Verbindungspunkt liegt bei etwa 1,65 V.
- Schließen Sie einen 10-uF-Elektrolytkondensator vom Verbindungspunkt nach GND an, um den Mittelpunkt zu stabilisieren.
- Verbinden Sie eine Ader der Zange (die Spitze des 3,5-mm-Steckers) mit dem Verbindungspunkt.
- Verbinden Sie die andere Ader (den Schaft) mit dem ADC-Eingang GPIO 34.
Bei 1 V RMS Ausgangsspannung erreicht das Signal Spitzen von etwa 1,41 V, der ADC sieht also rund 0,24 V bis 3,06 V. Das bleibt im Bereich der Standarddämpfung. Verwenden Sie einen Pin an ADC1 (GPIO 32 bis 39 auf einem klassischen ESP32); ADC2-Pins lassen sich bei aktivem WLAN nicht auslesen.
Den Effektivstrom messen
Der Code tastet den ADC 200 ms lang so schnell wie möglich ab, was bei 50 Hz 10 volle Perioden und bei 60 Hz 12 abdeckt. Er berechnet den Mittelwert (den Gleichspannungs-Mittelpunkt, gemessen statt angenommen) und die Standardabweichung darum, die genau dem Effektivwert des Wechselanteils entspricht. Die Multiplikation mit dem Umrechnungsfaktor der Zange ergibt Ampere.
Den Mittelpunkt bei jedem Durchlauf zu messen, beseitigt Fehler durch Widerstandstoleranzen und Versorgungsdrift, und analogReadMilliVolts() wendet die werkseitige ADC-Kalibrierung an, was bei der bekannten Nichtlinearität des ESP32-ADC hilft.
Der ESP32-SCT-013-Stromsensor-Sketch
#include <WiFi.h>
#include <PubSubClient.h>
#include <Preferences.h>
#include <math.h>
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* PREFIX = "connectmq/demo/sct3m8w"; // eigene zufällige ID verwenden
const uint8_t CT_PIN = 34; // ADC1-Pin
const float AMPS_PER_VOLT = 30.0f; // SCT-013-030; 90.9 für -000 mit 22-Ohm-Bürde
const float MAINS_VOLTAGE = 230.0f; // in Nordamerika 120.0 setzen
const float CALIBRATION = 1.00f; // nach Vergleich mit einer Stromzange anpassen
const float NOISE_FLOOR_A = 0.08f; // Werte darunter werden als 0 gemeldet
const uint32_t WINDOW_MS = 200;
const uint32_t PUBLISH_MS = 10000;
const uint32_t SAVE_MS = 600000; // Energie alle 10 min speichern
WiFiClient net;
PubSubClient mqtt(net);
Preferences prefs;
String clientId, tPower, tStatus;
double energyKwh = 0;
uint32_t lastSample = 0, lastPublish = 0, lastSave = 0;
float lastIrms = 0, sumIrms = 0;
uint32_t samplesInPeriod = 0;
float readIrms() {
uint32_t n = 0;
double sum = 0, sumSq = 0;
uint32_t start = millis();
while (millis() - start < WINDOW_MS) {
double mv = analogReadMilliVolts(CT_PIN);
sum += mv;
sumSq += mv * mv;
n++;
}
double mean = sum / n;
double variance = sumSq / n - mean * mean;
if (variance < 0) variance = 0;
double vrms = sqrt(variance) / 1000.0; // Effektivspannung des Wechselanteils
float irms = vrms * AMPS_PER_VOLT * CALIBRATION;
return irms < NOISE_FLOOR_A ? 0.0f : irms;
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(300);
Serial.printf("Wi-Fi OK, IP %s\n", WiFi.localIP().toString().c_str());
}
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(clientId.c_str(), tStatus.c_str(), 1, true, "offline")) {
mqtt.publish(tStatus.c_str(), "online", true);
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
analogReadResolution(12);
prefs.begin("energy", false);
energyKwh = prefs.getDouble("kwh", 0.0);
clientId = "esp32-sct013-" + String((uint32_t)ESP.getEfuseMac(), HEX);
tPower = String(PREFIX) + "/power";
tStatus = String(PREFIX) + "/status";
connectWifi();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setBufferSize(512);
connectMqtt();
lastSample = lastPublish = lastSave = millis();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWifi();
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
// Etwa einmal pro Sekunde abtasten und Energie aufintegrieren
uint32_t now = millis();
if (now - lastSample >= 1000) {
float irms = readIrms();
float dtHours = (millis() - lastSample) / 3600000.0f;
lastSample = millis();
energyKwh += (irms * MAINS_VOLTAGE) * dtHours / 1000.0;
lastIrms = irms;
sumIrms += irms;
samplesInPeriod++;
mqtt.loop();
}
if (now - lastPublish >= PUBLISH_MS && samplesInPeriod > 0) {
lastPublish = now;
float avgIrms = sumIrms / samplesInPeriod;
sumIrms = 0;
samplesInPeriod = 0;
char payload[200];
snprintf(payload, sizeof(payload),
"{\"irms\":%.2f,\"irmsAvg\":%.2f,\"apparentPowerVA\":%.0f,"
"\"energyKwh\":%.4f,\"voltageAssumed\":%.0f}",
lastIrms, avgIrms, avgIrms * MAINS_VOLTAGE, energyKwh, MAINS_VOLTAGE);
mqtt.publish(tPower.c_str(), payload);
Serial.println(payload);
}
if (now - lastSave >= SAVE_MS) {
lastSave = now;
prefs.putDouble("kwh", energyKwh); // begrenzte Schreibvorgänge schonen den Flash
}
}
Jedes Messfenster blockiert die Schleife für 200 ms, was für MQTT-Keep-Alives unbedenklich ist, weil der Sketch direkt nach dem Abtasten mqtt.loop() aufruft. Wenn Sie weitere Zangen ergänzen, lesen Sie sie im selben Durchlauf nacheinander aus oder verlagern Sie das Abtasten wie in der Anleitung zu ESP32 FreeRTOS MQTT gezeigt in einen eigenen FreeRTOS-Task, damit der Netzwerkcode nie hinter einer langen Reihe von Messfenstern warten muss.
Testen und kalibrieren
Abonnieren Sie das Topic:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sct-view-3m8w -t "connectmq/demo/sct3m8w/#" -v
Wenn nichts läuft, sollte irms den Wert 0 zeigen. Schalten Sie eine bekannte ohmsche Last ein, etwa einen Wasserkocher oder einen Heizlüfter, und vergleichen Sie irms mit einer Stromzange am selben Leiter. Passen Sie CALIBRATION um das Verhältnis der beiden Messwerte an, zum Beispiel auf 1,04, wenn der ESP32 4 Prozent zu wenig misst. Kalibrieren Sie für die beste Gesamtgenauigkeit etwa in der Mitte des Messbereichs der Zange.
Der öffentliche MQTT-Broker ist für jeden lesbar, und Verbrauchsmuster können verraten, wann eine Wohnung bewohnt oder eine Maschine in Betrieb ist – nutzen Sie ihn also nur für Tests und Prototypen auf dem Labortisch, nicht für Produktionsdaten. Seine Grenzen sind auf der Seite zum kostenlosen öffentlichen MQTT-Broker aufgeführt.
Was die Zahlen bedeuten
Der Sketch veröffentlicht die Scheinleistung in Voltampere, berechnet aus dem gemessenen Strom und einer angenommenen Netzspannung. Bei ohmschen Lasten wie Wasserkochern und Heizungen liegt die Scheinleistung nahe an der Wirkleistung in Watt. Bei Motoren, Kompressoren, Netzteilen und LED-Treibern liegt der Leistungsfaktor unter 1, sodass die Wirkleistung niedriger ist als der VA-Wert. Außerdem schwankt die Netzspannung im Tagesverlauf.
Für die Wirkleistung brauchen Sie zusätzlich eine Spannungsmessung, typischerweise über einen isolierten AC-AC-Transformator an einem zweiten ADC-Pin, sowie eine Multiplikation Abtastwert für Abtastwert. Das ist ein lohnender nächster Schritt, doch schon die reine Strommessung reicht, um zu sehen, welches Gerät wann läuft, Standby-Verbraucher aufzuspüren und Tage zu vergleichen.
Checkliste für die Genauigkeit
- Legen Sie die Zange nur um einen Leiter. Um ein ganzes Kabel heben sich die Ströme von Außen- und Neutralleiter auf, und Sie messen nahezu null.
- Wählen Sie den kleinsten Zangen-Messbereich, der Ihren maximalen Strom abdeckt.
- Halten Sie die analogen Leitungen kurz und fern von WLAN-Antennen und Schaltnetzteilen.
- Messen Sie den Mittelpunkt in jedem Fenster, statt 1,65 V anzunehmen.
- Legen Sie eine Rauschschwelle fest, damit ein ungenutzter Stromkreis 0 und nicht einige Hundert Milliampere anzeigt.
- Kalibrieren Sie mit einer ohmschen Last gegen ein vertrauenswürdiges Messgerät.
Ein Energie-Dashboard aufbauen
Auf der Empfängerseite macht ein Subscriber aus den Nachrichten Diagramme. Der MQTT-Consumer von Telegraf kann das JSON parsen und für Grafana in InfluxDB schreiben, Node-RED kann Tagessummen und Kosten berechnen, und Home Assistant kann energyKwh über eine MQTT-Sensordefinition als Energiesensor behandeln. Alle verbinden sich als normale MQTT-Clients mit dem Broker.
In der Fertigung ist derselbe Ansatz ein günstiger Einstieg ins Energiemonitoring auf Maschinenebene, etwa als Datengrundlage für ein Energiemanagement nach ISO 50001 oder um Leerlaufverbräuche einer Linie außerhalb der Schichtzeiten sichtbar zu machen. Legen Sie die Messpunkte dann in einem Unified Namespace (UNS) ab, dessen Topic-Struktur der ISA-95-Hierarchie folgt, zum Beispiel acme/werk-augsburg/fertigung/linie-2/presse-1/energie, damit MES, Energie-Dashboards und OEE-Auswertungen dieselben Werte an einer vorhersehbaren Stelle finden. Für Arbeiten in Schaltschränken von Maschinen gilt dabei erst recht: nur durch eine Elektrofachkraft. Wenn Sie mehrere Stromkreise oder Temperaturen gleichzeitig überwachen, kombinieren Sie diesen Knoten mit dem DS18B20-Projekt mit mehreren Fühlern oder lesen Sie vorhandene Zähler mit dem ESP32-Modbus-RS485-Gateway aus.
Für die Produktion erstellen Sie einen Broker unter app.connectmq.com, wechseln auf WiFiClientSecure an Port 8883 mit dem Zertifikat ISRG Root X1 und verbinden sich mit YOUR_CLIENT_ID, YOUR_USERNAME und YOUR_PASSWORD. Die Schwellwert-Alarmregeln im ConnectMQ-Portal können Sie dann warnen, wenn der Strom einen Grenzwert überschreitet, etwa wenn sich ein Stromkreis dem Nennwert seiner Sicherung nähert.
Starten Sie mit ConnectMQ
Energiedaten sind am wertvollsten, wenn sie kontinuierlich erfasst und privat gehalten werden. ConnectMQ ist ein verwalteter MQTT-Broker mit TLS, MQTT 3.1.1 und 5.0, einem Live-Topic-Explorer und Alarmfunktionen, und der kostenlose Serverless-Plan erfordert keine Kreditkarte. Richten Sie diesen Sketch auf Ihren Broker aus und finden Sie im Überblick zum ESP32-IoT-Tutorial weitere Messprojekte.
Häufig gestellte Fragen
Kann der ESP32-SCT-013-Stromsensor die Wirkleistung in Watt messen?
Allein mit dem Strom schätzt er die Scheinleistung in VA. Für die Wirkleistung ist zusätzlich eine Spannungsmessung nötig, damit der Code den Leistungsfaktor berücksichtigen kann.
Warum zeigt mein Messwert Strom an, obwohl nichts eingeschaltet ist?
Das ist ADC-Rauschen und Einstreuung. Legen Sie eine Rauschschwelle fest, halten Sie die Leitungen kurz und prüfen Sie, ob der Kondensator am Mittelpunkt bestückt ist.
Welche ESP32-Pins kann ich für den SCT-013 verwenden?
Verwenden Sie ADC1-Pins (GPIO 32 bis 39 auf einem klassischen ESP32). ADC2-Pins funktionieren nicht, solange das WLAN aktiv ist.
Brauche ich einen Bürdenwiderstand?
Nur für den SCT-013-000 mit Stromausgang. Die Versionen mit Spannungsausgang wie der SCT-013-030 haben eine eingebaute Bürde.



