ACS712 센서로 정확한 AC 전류 측정하기 - 아두이노 튜토리얼
필요한 부품 및 준비물
| 부품 |
수량 |
비고 |
| 아두이노 우노 |
1 |
호환 보드 가능 |
| ACS712 30A 모듈 |
1 |
가정용은 5A/20A 권장 (해상도 유리) |
| OLED I2C 128x32 또는 LCD 16x2 I2C |
1 |
택일, 둘 다 코드 제공 |
| 백열 전구 + 조도 조절기 (테스트용) |
1세트 |
위상 제어 파형 테스트용 |
| 멀티미터 (참조용) |
1 |
교정 및 검증용 |
⚠️ 안전 주의사항
교류 전원(220V/110V) 작업 시 감전 화재 위험이 있습니다. 절연 장갑 착용, 브레드보드 대신 납땜/단자대 사용, 회로 차단기 설치, 혼자 작업하지 않기 등 안전 수칙을 철저히 준수하세요. ACS712 모듈은 회로와 절연되어 있으나 입력 단자는 위험 전압입니다.
ACS712 센서 이해하기
- 홀 이펙트 기반 비접촉 전류 센서
- 버전별 감도: 5A(185mV/A), 20A(100mV/A), 30A(66mV/A)
- 출력: VCC/2 (2.5V) 중심, 전류에 비례하여 ± 변화
- 대역폭: 80kHz, 응답 시간: 5μs
- 절연 내압: 2.1kV RMS
테스트 1: 신호 파형 관찰
배선 (공통)
- ACS712 VCC → 5V, GND → GND
- ACS712 OUT → 아두이노 A0
- 부하(전구)는 ACS712 단자대(T1, T2)에 직렬 연결
코드 1: 원시 ADC 값 출력 (시리얼 플로터용)
#define CURRENT_SENSOR A0
void setup() {
Serial.begin(9600);
pinMode(CURRENT_SENSOR, INPUT);
}
void loop() {
float raw = analogRead(CURRENT_SENSOR);
Serial.println(raw);
delay(100); // 파형 형태에 맞게 조절
}
시리얼 플로터(Tools → Serial Plotter)에서 정현파 확인. 조도기 최저시 위상 제어(TRIAC) 파형으로 왜곡됨.
테스트 2: 피크-피크 방식 RMS 계산 (정현파만 가능)
코드 2: 피크-피크 측정 후 RMS 환산
#define SAMPLES 300
#define ACS_PIN A0
float highPeak, lowPeak;
float ampsPeakPeak, ampsRMS;
void setup() {
Serial.begin(9600);
pinMode(ACS_PIN, INPUT);
}
void loop() {
readAmps();
// 0.3536 = 1/(2√2), 0.06은 캘리브레이션 계수 (실측값/이론값)
ampsRMS = ampsPeakPeak * 0.3536 * 0.06;
Serial.print(ampsRMS); Serial.print("\t"); Serial.println(ampsPeakPeak);
delay(200);
}
void readAmps() {
highPeak = 0; lowPeak = 1024;
for (int i = 0; i < SAMPLES; i++) {
float val = analogRead(ACS_PIN);
if (val > highPeak) highPeak = val;
if (val < lowPeak) lowPeak = val;
}
ampsPeakPeak = highPeak - lowPeak;
}
한계: 정현파에서만 정확. 위상 제어(디머) 파형에서는 과대 측정됨 (예: 실측 0.21A → 측정 0.36A).
테스트 3: 통계적 TRMS 측정 (모든 파형 대응) - 핵심 솔루션
Filters 라이브러리 사용 (적분 연산 기반 RMS 계산). GitHub에서 다운로드 후 설치.
코드 3: TRMS 계산 및 시리얼 출력
#include
#define ACS_PIN A0
float testFrequency = 50; // 전원 주파수 (Hz)
float windowLength = 40.0 / testFrequency; // 평균화 윈도우 (40주기)
float intercept = 0; // 오프셋 보정
float slope = 0.0752; // 기울기 보정 (캘리브레이션으로 결정)
float ampsTRMS;
unsigned long printPeriod = 1000;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(ACS_PIN, INPUT);
}
void loop() {
RunningStatistics inputStats;
inputStats.setWindowSecs(windowLength);
while (true) {
float val = analogRead(ACS_PIN);
inputStats.input(val);
if (millis() - previousMillis >= printPeriod) {
previousMillis = millis();
ampsTRMS = intercept + slope * inputStats.sigma();
Serial.print("\t Amps: "); Serial.println(ampsTRMS);
}
}
}
캘리브레이션 방법 (필수)
- 무부하(0A) 상태에서
inputStats.sigma() 값 확인 → 0이 아니면 intercept로 보정
- 알려진 부하(예: 60W 전구 @ 230V ≈ 0.26A) 연결
- 이론 전류 / 측정값 =
slope 계수 계산
- 코드에 반영 후 재검증
결과: 디머 최저 위치에서도 멀티미터와 거의 일치하는 TRMS 값 측정 성공.
디스플레이 연동 버전
LCD I2C 16x2 버전 (코드 4)
#include
#include
#define ACS_PIN A0
#define I2C_ADDR 0x27 // I2C 스캐너로 확인 필요
// ... (캘리브레이션 변수 동일)
LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
lcd.setBacklightPin(3, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home();
}
void loop() {
RunningStatistics stats;
stats.setWindowSecs(windowLength);
while (true) {
stats.input(analogRead(ACS_PIN));
if (millis() - previousMillis >= printPeriod) {
previousMillis = millis();
ampsTRMS = intercept + slope * stats.sigma();
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(ampsTRMS); lcd.print(" A");
}
}
}
OLED I2C 128x32 버전 (코드 5)
#include
#include
#include
#define ACS_PIN A0
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ... (변수 동일)
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
}
void loop() {
RunningStatistics stats;
stats.setWindowSecs(windowLength);
while (true) {
stats.input(analogRead(ACS_PIN));
if (millis() - previousMillis >= printPeriod) {
previousMillis = millis();
ampsTRMS = intercept + slope * stats.sigma();
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(15, 10);
display.print(ampsTRMS); display.println(" A");
display.display();
}
}
}
배선도 참고
첨부된 회로도 이미지 참조:
- 기본 배선 (테스트 1,2,3 공통)
- LCD I2C 연결도
- OLED I2C 연결도
핵심 요약 및 팁
| 방식 |
장점 |
단점 |
용도 |
| 피크-피크 |
코드 단순, 라이브러리 불필요 |
정현파만 정확, 왜곡 파형 오차 큼 |
단순 모니터링, 정현파 부하 |
| TRMS (Filters lib) |
모든 파형 정확, 진정한 RMS |
라이브러리 필요, 캘리브레이션 필수 |
정밀 측정, 위상 제어 부하, 전문 용도 |
- 센서 선택: 가정용(~10A)엔 5A 또는 20A 버전 권장. 30A는 저전류에서 분해능 저하.
- 노이즈 대책: 아두이노 전원 안정화(커패시터), 센서 출력 RC 필터(100Ω + 0.1μF) 고려
- 샘플링: 50Hz 기준 40주기(800ms) 윈도우 권장, 1초마다 갱신
- 전압 측정 결합: ZMPT101B 전압 센서와 함께 사용하면 전력(W) 계산 가능