Hardware | ACS712 전류 측정 모듈 사용해 보기

1. Appearance

우연한 기회에 ACS712 라는 전류 측정 모듈을 구하게 되었습니다. 외형은 다음과 같이 생겼습니다.


뒷면 입니다.


사용된 chip 은, ACS712T ELC-05B 입니다.


Datasheet 에서 확인해 보면, ELC-05B 는, 5A 측정 가능한 모듈 입니다. 이 외에 20A 와 30A 측정용이 따로 있습니다.

* ACS712

칩 표기는 다음과 같이 각인이 되어 있습니다.




2. Hall Effect

전류를 측정하기 위해, 회로에서 직렬로 연결되어야 합니다. 측정 자체는 직접적인 측정이 아니라, 지나가는 전류량을 Hall Effect 를 가지고 측정한다 합니다. 전자기적인 특성을 이용한 센서로 보이네요.


간단히 서술하면, 지나가는 전류에서 발생되는 Hall Effect 에 따라, 센서 내부에 흐르게 되는 전류 변화량을 가지고 측정하는 구성인 듯 합니다. 전자기력이란...


* 호올효과(홀효과)

위의 링크에서 Hall Effect 는 "전류의 직각방향으로 자계를 가했을 때 전류와 자계에 직각인 방향으로 기전력이 발생하는 현상." 이라고 정의하고 있습니다.







3. Reference

여러 사이트를 돌아 다녔지만, 아래 사이트가 ACS712 에 대해서 잘 정리 해 놓은 것 같습니다. 이 분은 AC 240V 를 대상으로 LCD2004 까지 붙여서 사용한 사례를 만들었습니다.

* Measuring grid power consumption with an ACS712 Hall effect sensor connected to an Arduino




4. Layout

Pinout 정보 입니다.

  ACS712   | Arduino Nano
--------------------------
    GND    |     GND
    VCC    |     5V
    OUT    |     A0
--------------------------
  LCD2004  |
--------------------------
    GND    |     5V
    VCC    |     GND
    SDA    |     A4
    SCL    |     A5
--------------------------

LCD2004 와 Arduino, 그리고 ACS712 연결한 구조도 입니다.




5. Source

LCD2004 까지 완벽하게 포함한 소스 되겠습니다. 또한, ACS712 용량에 따라 민감도를 자동으로 반영되도록 만들어 놨습니다. 정말 깔끔한 소스 입니다.

/*
 * Arduino Sketch for Allegro ACS712 Current Sensor with LCD1602/LCD2004 with I2C 
 * this sensor can measure current at range of up to 30A
 * The current is measured and displayed on LCD1602 or LCD2004.
 * The current is also displayed on the Serial monitor (click Tools->Serial monitor)
 * It operates with 5V
 * Please watch video instruction and explanation for this code.
 * 
 * Written by Ahmad Shamshiri on  July 14, 2018 at 07:02 at Ajax, Ontario, Canada
 * for Robojax.com
 * View the video instruction at https://youtu.be/kzXouSzvcp8
 * This code has been downloaded from Robojax.com
 
  * you must watch the following two videos before you can understand this
 * 1- introduction to ACS712 Current Sensor: https://www.youtube.com/watch?v=DVp9k3xu9IQ
 * 2- LCD1602 with 2IC dislplay : https://www.youtube.com/watch?v=q9YC_GVHy5A
 */

#define VIN A0 // define the Arduino pin A0 as voltage input (V in)
const float VCC = 5.0; // supply voltage is from 4.5 to 5.5V. Normally 5V.
const int model = 0; // enter the model number (see below)

float cutOffLimit = 0.1; // set the current which below that value, doesn't matter. Or set 0.5

/*
          "ACS712ELCTR-05B-T", // for model use 0
          "ACS712ELCTR-20A-T", // for model use 1
          "ACS712ELCTR-30A-T"  // for model use 2  
sensitivity array is holding the sensitivy of the  ACS712
current sensors. Do not change. All values are from page 5  of data sheet          
*/

float sensitivity[] ={
          0.185, // for ACS712ELCTR-05B-T
          0.100, // for ACS712ELCTR-20A-T
          0.066  // for ACS712ELCTR-30A-T
}; 

const float QOV = 0.5 * VCC; // set quiescent Output voltage of 0.5V
float voltage; // internal variable for voltage


// start of settings for LCD1602 with I2C
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
// end of settings for LCD2004 with I2C

void setup() {
    // ACS712 Current Sensor 
    Serial.begin(115200); // initialize serial monitor
    Serial.println("ACS712 Current Sensor");
  
  // initialize the LCD
  lcd.init();  
  lcd.backlight();
  lcd.setCursor(7, 0);
  lcd.print("ACS712");
  lcd.setCursor(3, 1);
  lcd.print("Current Sensor");
  lcd.setCursor(3, 3);
  lcd.print("Demonstration!"); 
  delay(4000);     
}

void loop() {
  // ACS712 Current Sensor with LCD2004
  float voltage_raw = (5.0 / 1023.0) * analogRead(VIN); // Read the voltage from sensor
  voltage =  voltage_raw - QOV + 0.012; // 0.000 is a value to make voltage zero when there is no current
  float current = voltage / sensitivity[model];
  float wattage = voltage * current;
  
  if(abs(current) > cutOffLimit) {
    Serial.print("I: ");
    Serial.print(current, 2); // print the current with 2 decimal places
    Serial.print(" A, V: ");
    Serial.print(voltage, 3); // print voltage with 3 decimal places
    Serial.print(" V, W: ");
	Serial.print(wattage, 3); // print voltage with 3 decimal places
    Serial.println(" W");
        
    //start of loop code ACS712 with LCD2004 and I2C
    lcd.clear();
    lcd.setCursor (2, 0); // set to line 1, char 0
    lcd.print("ACS712 /w Arduino");

    lcd.setCursor (0, 1); // set to line 1, char 0
    lcd.print("Current : ");
    lcd.setCursor (11, 1); // go to start of 2nd line
    lcd.print(current);
    lcd.setCursor (19, 1); // go to start of 2nd line
    lcd.print("A");

    lcd.setCursor (0, 2); // set to line 1, char 0
    lcd.print("Voltage : ");
    lcd.setCursor (11, 2); // go to start of 2nd line
    lcd.print(voltage);
    lcd.setCursor (19, 2); // go to start of 2nd line
    lcd.print("V");
	
	lcd.setCursor (0, 3); // set to line 1, char 0
    lcd.print("Wattage : ");
    lcd.setCursor (11, 3); // go to start of 2nd line
    lcd.print(voltage);
    lcd.setCursor (19, 3); // go to start of 2nd line
    lcd.print("W");
  } else {
    Serial.println("No Current!");
    lcd.clear();
    lcd.setCursor (5, 1); // set to line 1, char 0 
    lcd.print("No Current!");
  }
  delay(1000);
}



6. Crystal LCD

전술 했듯, LCD2004 관련 소스가 포함되어 있으므로, LCD2004 에 해당되는 library 가 설치되지 않았으면 컴파일시 에러를 뿜어 줍니다.


"LiquidCrystal_I2C.h" 라이브러리가 설치되어 있으면 됩니다. Arduino IDE 의 Library Manager 에서 "LiquidCrystal_I2C" 를 검색하면 나오는 것 중에서, "Marco Schwartz" 분꺼를 사용해 봤습니다.


좀더 자세한 Crystal LCD 에 관련한 활용은 다음 포스트를 참고하세요.

* Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 1

* Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 2



7. Demonstration

Arduino 에 소스를 입히고, DC 전구 중에 전류를 비교적 많이 먹는 친구를 붙여 봤습니다.


Arduino IDE 의 Serial Monitor 에서 보면, 전류 / 전압 / 와트 까지 확인이 가능합니다. 소스가 잘 되어 있어요.


실제 구동시에도 전류 / 전압 / 와트도 표현 됩니다. 


동영상으로도 남겨 놓습니다.



FIN

댓글