Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

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:

  1. Meet inputStats.sigma() bij 0A → stel intercept in zodat resultaat 0 wordt.
  2. Bekende belasting aansluiten (bijv. lamp met bekende vermogen/spanning → theoretische stroom).
  3. 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

  1. Luchtkwaliteit meten met OpenSensors: Een Arduino & Python Handleiding
  2. K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
  3. Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
  4. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  5. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  6. Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
  7. Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
  8. Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
  9. Je Billy Bass Vis Laten Zingen met Elke Audiobron – Stapsgewijze Handleiding
  10. Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
  11. Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display