산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

ACS712 센서로 정확한 AC 전류 측정하기 - 아두이노 튜토리얼

필요한 부품 및 준비물

부품 수량 비고
아두이노 우노 1 호환 보드 가능
ACS712 30A 모듈 1 가정용은 5A/20A 권장 (해상도 유리)
OLED I2C 128x32 또는 LCD 16x2 I2C 1 택일, 둘 다 코드 제공
백열 전구 + 조도 조절기 (테스트용) 1세트 위상 제어 파형 테스트용
멀티미터 (참조용) 1 교정 및 검증용

⚠️ 안전 주의사항

교류 전원(220V/110V) 작업 시 감전 화재 위험이 있습니다. 절연 장갑 착용, 브레드보드 대신 납땜/단자대 사용, 회로 차단기 설치, 혼자 작업하지 않기 등 안전 수칙을 철저히 준수하세요. ACS712 모듈은 회로와 절연되어 있으나 입력 단자는 위험 전압입니다.

ACS712 센서 이해하기

테스트 1: 신호 파형 관찰

배선 (공통)

코드 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);
    }
  }
}

캘리브레이션 방법 (필수)

  1. 무부하(0A) 상태에서 inputStats.sigma() 값 확인 → 0이 아니면 intercept로 보정
  2. 알려진 부하(예: 60W 전구 @ 230V ≈ 0.26A) 연결
  3. 이론 전류 / 측정값 = slope 계수 계산
  4. 코드에 반영 후 재검증

결과: 디머 최저 위치에서도 멀티미터와 거의 일치하는 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) 계산 가능

제조공정

  1. 아두이노와 파이썬으로 OpenSensors를 활용한 공기질 측정 가이드
  2. K30 CO2 센서: 실시간 실내 공기질 모니터링
  3. 1Sheeld와 아두이노로 시각/청각 장애인 간 소통 돕기
  4. 스마트 저금통 만들기: 아두이노 나노로 동전 인식기 제어하기
  5. 아두이노 블루투스로 LED 제어하기 - HC-05 & MIT App Inventor 입문 가이드
  6. DFRobot 정전식 지문 인식 센서 아두이노/ESP8266 연동 가이드
  7. 아두이노 메가와 센서를 활용한 인터랙티브 넥시온 HMI 프로젝트
  8. 아두이노 메가 기반 닌텐도 눙크 컨트롤 6자유도 로봇 암 키트
  9. 빌리 배스 피쉬를 오디오 소스에 맞춰 움직이게 만들기 - 단계별 가이드
  10. 아두이노 우노와 이더넷 실드로 정확한 태양광 복사량 측정하기