基于 ACS712 传感器的 Arduino 交流电流精准测量(真有效值)
元器件与物料
| Arduino UNO | ×1 |
| ACS712 30A 模块(霍尔效应,隔离测量) | ×1 |
| OLED I²C 128×32 或 LCD 1602 I²C | ×1 |
| 白炽灯泡 + 可控硅调光器(测试负载) | ×1 |
| 万用表(参考校准) | ×1 |
项目简介
本教程演示如何使用 ACS712 霍尔效应电流传感器配合 Arduino 实现真有效值 (TRMS) 交流电流测量。区别于仅适用于正弦波的峰峰值法,TRMS 算法可准确测量调光器切相波形等非线性负载电流。文中提供三阶段代码演进:波形观测 → 峰峰值法(仅正弦波) → 滤波器库 TRMS 法(通用波形),并给出 LCD/OLED 显示方案。
⚠️ 安全警告
涉及市电操作,必须具备电气安全知识,建议使用隔离变压器或电池供电测试,严禁带电插拔传感器!
ACS712 选型建议
- 5A/20A/30A 三档灵敏度分别为 185/100/66 mV/A。
- 家用小电流场景推荐 5A 或 20A 版本,30A 版本在小电流下分辨率差、波动大。
- 校准参数(斜率/截距)随量程不同而异,文中给出标定方法。
测试 1:波形观测(Code_1)
接线:VCC→5V,GND→GND,OUT→A0。负载串联火线通过 ACS712 端子台。
#define CURRENT_PIN A0
void setup() { Serial.begin(9600); pinMode(CURRENT_PIN, INPUT); }
void loop() {
float val = analogRead(CURRENT_PIN);
Serial.println(val);
delay(100); // 调整延时直到串口绘图器显示稳定正弦波
}
串口绘图器可看到正弦波;调光器全开时为完整正弦,半波/切相时波形畸变。
测试 2:峰峰值法 RMS(Code_2,仅适用正弦波)
#define SAMPLES 300
#define ACS_PIN A0
float highPk=0, lowPk=1024, ampPkPk, ampRMS;
void loop() {
readAmps();
ampRMS = ampPkPk * 0.3536 * 0.06; // 0.3536=1/(2√2),0.06 为经验校准系数
Serial.print(ampRMS); Serial.print("\t"); Serial.println(ampPkPk);
delay(200);
}
void readAmps() {
highPk=0; lowPk=1024;
for(int i=0;ihighPk) highPk=v;
if(v
调光器全开时与万用表一致;切相至 1/4 波形时读数偏高(0.36A vs 0.21A),说明峰峰值法失效。
测试 3:Filters 库 TRMS 算法(Code_3,通用波形)
使用 Filters 库(统计滑动窗口计算 σ),实现真有效值。
#include <Filters.h>
#define ACS_PIN A0
float testFreq = 50;
float windowLen = 40.0/testFreq; // 40 个周期滑动窗口
float intercept = 0; // 零点校准
float slope = 0.0752; // 斜率校准(见下文标定)
float ampsTRMS;
unsigned long prevMs=0, printPeriod=1000;
void loop() {
RunningStatistics stats;
stats.setWindowSecs(windowLen);
while(true){
float v = analogRead(ACS_PIN);
stats.input(v);
if(millis()-prevMs >= printPeriod){
prevMs = millis();
ampsTRMS = intercept + slope * stats.sigma();
Serial.print("\t Amps: "); Serial.println(ampsTRMS);
}
}
}
校准方法(关键)
- 零电流时观察
stats.sigma(),若非 0,设intercept = -sigma消除偏移。 - 接已知负载(如 75W 灯泡 @ 230V → 理论 0.326A),记录读数
measured,计算slope = 理论值 / measured。 - 将两参数写入代码,再次验证。
测试 4:LCD/OLED 显示(Code_ACS712_LCD / _OLED)
接线同测试 1,仅在循环中将串口输出改为屏幕显示。LCD 需 LiquidCrystal_I2C 库,OLED 需 Adafruit_SSD1306 + Adafruit_GFX。
// LCD 关键片段
lcd.clear(); lcd.setCursor(2,0); lcd.print(ampsTRMS); lcd.print(" A");
// OLED 关键片段
display.clearDisplay(); display.setTextSize(3); display.setCursor(15,10);
display.print(ampsTRMS); display.println(" A"); display.display();
原理图
测试 1-3 共用接线

LCD I²C 接线

OLED 128×32 接线

代码下载
- Code_1.ino(波形观测)
- Code_2.ino(峰峰值法)
- Code_3.ino(TRMS 串口版)
- Code_ACS712_LCD.ino(LCD 显示版)
- Code_ACS712_OLED.ino(OLED 显示版)
Filters 库下载:GitHub 或教程附件。
制造工艺
- 使用 OpenSensors 监测空气质量:Arduino 与 Python 实战指南
- K30 CO₂ 传感器:室内空气质量实时监测
- 基于 1Sheeld 与 Arduino 的盲聋人士沟通辅助系统
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- 让大嘴鲈鱼玩具随音频起舞:分步制作指南
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏
- Arduino 合成乐音:从零实现 88 键钢琴全音域