Nehmen wir das Modell HSTS016L als Beispiel: Es kann Stromwerte von 10 A bis 200 A messen. Bei diesem Stromsensor mit teilbarem Kern lässt sich der Kern öffnen und schließen, ohne das bestehende System zu verändern. Das Messkabel wird einfach in den Kern eingelegt und dieser zugeklappt. Die Ausgangsspannung des Sensors beträgt 2,5 V ± 0,625 V. Sein Ausgangsspannungsbereich von 1,875 V bis 3,125 V eignet sich auch für 3,3-V-Analogeingänge, insbesondere bei den Mikrocontrollern Arduino Nano und NodeMCU.
Der Sensor hat vier Anschlüsse: ROT (5-V-Eingang), SCHWARZ (0 V, Masse), GELB (Analogausgang) und WEISS (Analogsignal zur Kalibrierung). Da die Versorgungsspannung möglicherweise nicht genau 5 V beträgt, benötigen wir einen zusätzlichen Analogeingang, um den tatsächlichen Mittelpunkt am weißen Anschluss zu messen. Der Arduino UNO hat sechs Analogeingänge (A0–A5). Einen davon können wir zur Messung des Wechselstroms und einen weiteren zur Kalibrierung verwenden. Die Analogeingänge bilden Eingangsspannungen zwischen 0 und 5 V mit einer Auflösung von 4,9 mV pro Einheit (5,00 V / 1023 Einheiten) auf ganzzahlige Werte zwischen 0 und 1023 ab.
Wir verbinden ROT mit dem 5-V-Eingang, SCHWARZ mit Masse, GELB mit dem Analogeingang A1 und WEISS mit dem Analogeingang A2. Es wird dringend empfohlen, den Arduino Uno und den Sensor über ein 12-V-Netzteil zu versorgen. Bei einer 5-V-Versorgung über USB entsteht ein anfänglicher Offsetwert, den Sie beim Hochladen des Codes möglicherweise manuell ergänzen müssen.
// Anschluss zur Messung des Stromwerts (A0 ist für die Tastenfunktion des LCD Display Shield reserviert)
int currentAnalogInputPin = A1;
// Anschluss zur Kalibrierung des Offset-Mittelwerts
int calibrationPin = A2;
// Wert zur manuellen Korrektur des anfänglichen Offsets eingeben
float manualOffset = 0.00;
// Bei Verwendung eines Hall-Effekt-Stromwandlers den Wert nach folgender Formel eingeben: mVperAmp = maximaler Spannungsbereich (in Millivolt) / Nennstrom des Stromwandlers
float mVperAmpValue = 12.5;
// Maximale Versorgungsspannung des Analogeingangs: beim Arduino Uno oder Mega 5000 mV, beim Arduino Nano oder NodeMCU 3300 mV
float supplyVoltage = 5000;
/* zum Einlesen eines Abtastwerts für die spätere Offsetkorrektur */
float offsetSampleRead = 0;
/* zum Einlesen eines Abtastwerts einschließlich des Werts currentOffset1*/
float currentSampleRead = 0;
/* zur Zeitmessung für jeden Abtastwert. Theoretisch wird jede Millisekunde ein Abtastwert erfasst */
float currentLastSample = 0;
/* Summe der Abtastwerte */
float currentSampleSum = 0;
/* zum Zählen der Abtastwerte. */
float currentSampleCount = 0;
/* zur Berechnung des Mittelwerts aller Abtastwerte als Analogwert*/
float currentMean ;
/* Quadratwurzel aus currentMean als Analogwert */
float RMSCurrentMean ;
/* endgültiger Strom-Effektivwert (RMS)*/
float FinalRMSCurrent ;
void setup() /* Code, der einmal ausgeführt wird */
{
Serial.begin(9600); /* Messwerte im seriellen Monitor mit 9600 Baud anzeigen */
}
void loop()
{
/* 1- Wechsel- und Gleichstrommessung */
if(micros() >= currentLastSample + 200) /* alle 0,2 Millisekunden einen Messwert erfassen */
{
/* Abtastwert einschließlich Offsetwert einlesen*/
currentSampleRead = analogRead(currentAnalogInputPin)-analogRead(calibrationPin);
/* Analogwerte der einzelnen Messungen aufsummieren*/
currentSampleSum = currentSampleSum + sq(currentSampleRead) ;
/* Zähler für den nächsten Abtastwert erhöhen */
currentSampleCount = currentSampleCount + 1;
/* Zeitwert für den nächsten Zyklus zurücksetzen*/
currentLastSample = micros();
}
/* nach 4000 Abtastwerten oder 800 Millisekunden (0,8 Sekunden) folgenden Code ausführen*/
if(currentSampleCount == 4000)
{
/* Mittelwert der aufsummierten Analogwerte*/
currentMean = currentSampleSum/currentSampleCount;
/* Quadratwurzel des Mittelwerts*/
RMSCurrentMean = sqrt(currentMean);
/* endgültigen Strom-Effektivwert (RMS) berechnen*/
FinalRMSCurrent = (((RMSCurrentMean /1023) *supplyVoltage) /mVperAmpValue)- manualOffset;
/* liegt der gemessene Strom bei höchstens 1 %, den Stromwert auf 0 A setzen*/
if(FinalRMSCurrent <= (625/mVperAmpValue/100))
{ FinalRMSCurrent =0; }
Serial.print(” Der Strom-Effektivwert (RMS) beträgt: “);
Serial.print(FinalRMSCurrent,decimalPrecision);
Serial.println(” A “);
currentSampleSum =0; /* Summe der Abtastwerte für den nächsten Zyklus zurücksetzen */
currentSampleCount=0; /* Anzahl der Abtastwerte für den nächsten Zyklus zurücksetzen */
}
}