Accurate AC-stroommeting met de ACS712-sensor op Arduino
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| OLED I²C 128×32 | 1 |
| ACS712 30A (Hall-effect stroomsensor) | 1 |
| LCD 16×2 I²C | 1 |
Over dit project
WAARSCHUWING: Wees voorzichtig bij werken met netspanning (230VAC)!
Deze tutorial laat zien hoe je wisselstroom (AC) meet met de ACS712-sensor (30A-versie) en een Arduino Uno. De sensor gebruikt het Halleffect: een spanningsverschil loodrecht op stroom en magnetisch veld.
We gaan verder dan simpele piek-piek meting – we berekenen de ware RMS-waarde (TRMS) voor elk signaalvorm, niet alleen sinusgolven. Dit is essentieel bij bijv. dimmers (triac-gestuurde belasting) waar het signaal niet-sinusvormig is.
Testopstelling: gloeilamp (75W) + dimmer in serie met referentiemultimeter en ACS712.
Onderdelen
Let op: De 30A-versie is niet ideaal voor huishoudelijke toepassingen (kleine stromen) – de resolutie is te grof, wat leidt tot grote fluctuaties. Een 5A of 10A versie is beter. De calibratie hangt af van de sensorversie (zie code-commentaar en video).
Test 1: Signaal visualiseren
Aansluiting (Schema 1) en Code 1
Sensor VCC → 5V, GND → GND, OUT → A0. Code leest analoge waarde en stuurt naar Serial Plotter.
Resultaat
Sinusgolf zichtbaar. Bij dimmer (half-golf/fase-aansnijding) verandert vorm – rode lijn in plotter toont overgang.
Test 2: Eenvoudige RMS-berekening (alleen sinus)
Code 2 (piek-piek methode)
Meet hoogste en laagste piek over 300 samples. RMS = (Piek-Piek × 0,3536) × kalibratiefactor (0,06). Werkt bij volle sinusgolf (dimmer vol open).
Probleem
Bij dimmer op laagstand (ca. 1/4 golf): multimeter 0,21A, code 0,36A. De piek-piek methode faalt bij niet-sinusvormige signalen.
Test 3: Echte TRMS met Filters-bibliotheek
Code 3 + Filters-bibliotheek
De Filters.h bibliotheek gebruikt statistische methoden (gemiddelde, sigma/standaarddeviatie) over een venster van 40ms (2 cycli bij 50Hz). Dit benadert de integratie voor RMS.
Calibratie: intercept (offset bij 0A) en slope (schaalfactor) bepalen. Stappen:
- Meet
inputStats.sigma()bij 0A → stelinterceptin zodat resultaat 0 wordt. - Bekende belasting aansluiten (bijv. lamp met bekende vermogen/spanning → theoretische stroom).
slope= theoretische stroom / gemeten sigma-waarde.
Resultaat
TRMS-waarden komen nu overeen met multimeter, ook bij gedimmde belasting. De bibliotheek doet het zware rekenwerk (integrale calculus) op de Arduino.
Test 4: Weergave op LCD / OLED
Code voor LCD I²C (Code_ACS712_LCD.ino)
Gebruikt LiquidCrystal_I2C bibliotheek. I²C-adres scannen (meestal 0x27). TRMS-waarde wordt elke seconde geüpdatet op scherm.
Code voor OLED 128×32 (Code_ACS712_OLED.ino)
Gebruikt Adafruit_SSD1306 en Adafruit_GFX. Helaas is mijn OLED kapot gegaan tijdens opnamen – werkt identiek aan LCD-versie.
Bibliotheken
- Filters.h – GitHub (essentieel voor TRMS)
- Adafruit_SSD1306 + Adafruit_GFX – voor OLED
- LiquidCrystal_I2C – voor LCD
Code
Code_1.ino – Signaal visualiseren
#define Current_sensor A0
float i;
void setup() {
Serial.begin(9600);
pinMode(Current_sensor, INPUT);
}
void loop() {
i = analogRead(Current_sensor);
Serial.println(i);
delay(100);
}
Code_2.ino – Piek-piek RMS (alleen sinus)
#define SAMPLES 300
#define ACS_Pin A0
float High_peak, Low_peak, Amps_Peak_Peak, Amps_RMS;
void setup() {
Serial.begin(9600);
pinMode(ACS_Pin, INPUT);
}
void loop() {
read_Amps();
Amps_RMS = Amps_Peak_Peak * 0.3536 * 0.06; // kalibratiefactor aanpassen
Serial.print(Amps_RMS); Serial.print("\t"); Serial.println(Amps_Peak_Peak);
delay(200);
}
void read_Amps() {
int cnt; High_peak = 0; Low_peak = 1024;
for (cnt = 0; cnt < SAMPLES; cnt++) {
float ACS_Value = analogRead(ACS_Pin);
if (ACS_Value > High_peak) High_peak = ACS_Value;
if (ACS_Value < Low_peak) Low_peak = ACS_Value;
}
Amps_Peak_Peak = High_peak - Low_peak;
}
Code_3.ino – TRMS met Filters-bibliotheek
#include
#define ACS_Pin A0
float testFrequency = 50;
float windowLength = 40.0 / testFrequency;
float intercept = 0;
float slope = 0.0752; // KALIBREREN!
float Amps_TRMS, ACS_Value;
unsigned long printPeriod = 1000, previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(ACS_Pin, INPUT);
}
void loop() {
RunningStatistics inputStats;
inputStats.setWindowSecs(windowLength);
while (true) {
ACS_Value = analogRead(ACS_Pin);
inputStats.input(ACS_Value);
if ((unsigned long)(millis() - previousMillis) >= printPeriod) {
previousMillis = millis();
Amps_TRMS = intercept + slope * inputStats.sigma();
Serial.print("\t Amps: "); Serial.print(Amps_TRMS);
}
}
}
Code_ACS712_LCD.ino & Code_ACS712_OLED.ino
Zelfde TRMS-logica, maar weergave op respectievelijk LCD 16×2 I²C of OLED 128×32. Zie broncode voor volledige listing.
Schema's
- Schema 1: Basis aansluiting ACS712 → Arduino (tests 1, 2, 3)
- Schema LCD: Met I²C LCD 16×2
- Schema OLED: Met I²C OLED 128×32
Productieproces
- Luchtkwaliteit meten met OpenSensors: Een Arduino & Python Handleiding
- K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
- Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
- Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- Je Billy Bass Vis Laten Zingen met Elke Audiobron – Stapsgewijze Handleiding
- Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
- Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display