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 전구 중에 전류를 비교적 많이 먹는 친구를 붙여 봤습니다.
동영상으로도 남겨 놓습니다.
댓글
댓글 쓰기