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

ACS712로 AC 전류 측정

구성품 및 소모품

Arduino UNO
× 1
OLED i²c 128x32
× 1
ACS712 30A
× 1
LCD 16x2 i²c
× 1

이 프로젝트 정보

전원 라인을 사용하는 경우 주의하십시오.

안녕하세요. 다른 튜토리얼에 오신 것을 환영합니다. 이 튜토리얼은 ACS712를 사용하여 교류(AC)를 측정하는 것에 관한 것입니다. 저는 30Amps 버전인 ACS712 30A와 우리의 멋진 Arduino Uno 보드를 사용하고 있습니다. OLED 화면을 추가하려고 했지만 불행히도 종료되었습니다. 튜토리얼을 촬영하는 동안 깨져서 LCD로 바꿨지만 아래에서 두 버전의 배선과 코드를 찾을 수 있습니다.

그리고 "Any AC… 그리고 센서는 홀 효과(도체에 흐르는 전류와 전류에 수직인 인가된 자기장에 대해 가로지르는 전기 도체 양단의 전압 차이 생성)를 사용합니다.

이 프로젝트를 다음 프로젝트와 결합할 수 있습니다. Arduino 및 ZMPT101B를 사용하여 AC 전압을 쉽게 측정

테스트는 기준 멀티미터 및 ACS712 전류 센서 모듈과 직렬로 연결된 조광기로 제어되는 백열 전구에서 수행됩니다.

계획은 다음과 같습니다.

<울>
  • 먼저 모듈을 Arduino 보드와 인터페이스하고 조광기가 켜져 있을 때 신호 모양을 확인해야 합니다 – 전체 주기 – 반 주기.
  • <울>
  • 그런 다음 라이브러리가 필요하지 않지만 Sinewaves 신호에서만 작동하는 간단한 코드를 확인합니다(테스트 예정).
  • <울>
  • 그 후에 AC의 TRMS를 측정하고 LCD를 사용하는 코드를 볼 것입니다.
  • 부품

    ACS712를 선택할 때 주의하십시오. 저처럼 안전하게 사용하려고 하지 마십시오(30Amps 버전 구입). 가정용 또는 소형 앰프 애플리케이션에 사용하려고 할 때 큰 변동을 줄 수 있으므로 여기에서 나에게는 5A 또는 10A 버전이 좋았을 것입니다. 또한 30A 또는 20A ...는 보정에도 영향을 미치지만 비디오 및 코드 주석에서 보정하는 방법에 대해 설명합니다.

    UNO를 호환되는 보드로 교체하거나 LCD i²c를 OLED 또는 원하는 디스플레이로 교체할 수 있는 부품입니다.

    테스트 1

    배선 그리고 코드

    테스트 1의 배선은 코드(코드 1)와 함께 아래(배선 1)에서 찾을 수 있습니다.

    결과

    코드를 업로드하고 직렬 플로터를 실행하면 신호와 같은 사인파를 볼 수 있어야 합니다. 빨간색 선은 조광기를 끄고 전류가 일반적으로 트라이액에서 찾을 수 있는 모양을 갖기 시작했을 때 표시됩니다.

    테스트 2

    이제 위의 코드만 사용하여 전류를 측정하려는 경우 512 – 511 주변의 값을 얻을 수 있으며 RMS 값은 전혀 반영하지 않습니다. 따라서 신호 RMS 값을 측정하려면 위와 동일한 배선을 유지하지만 이제 RMS를 계산할 수 있는 다른 코드가 필요합니다.

    배선 코드

    결선은 (Wiring 1)과 같지만 다른 코드는 아래 (Code 2)에서 찾을 수 있습니다.

    결과

    보시다시피 왼쪽(RMS)의 값은 멀티미터로 측정한 값과 동일하고 오른쪽은 Peak to Peak 값이며 75W 전구를 사용하고 있으므로 조광기가 전체 사이클에 있음을 유의하십시오. 230VAC/50Hz.

    !!!!!!!!!!!!!!!! 하지만 !!!!!!!!!!!!!!!!!!!!!!!!

    여기에서 저는 조광기를 완전히 낮췄습니다. 즉, 약 1/4 주기에 있습니다. 멀티미터는 0.21A를 제공하지만 내 코드는 0.36A를 제공합니다. 코드는 여전히 피크에서 피크까지 측정하지만 위에서 볼 수 있듯이 조광기를 완전히 낮추면 신호가 선형이 아닙니다.

    이것이 TRMS 측정과 사인파 신호로만 작동하는 측정의 차이점입니다.

    테스트 3

    이제 위 코드의 문제를 볼 수 있지만 다행히도 구조를 위한 라이브러리가 있습니다. RMS 값을 계산하려면 적분 미적분을 사용해야 하고 그것은 전자 개발 보드에서 달성하기 어려운 방법입니다. 라이브러리 cpp 파일을 확인하여 "Average" "Sigma"와 같은 방법이 사용되는지 확인할 수 있습니다. 통계/확률과 관련된 것 ....

    배선, 코드 라이브러리

    결선은 위에서 사용한 결선(Wiring 1)과 동일하며, 아래에 코드(Code 3)를 찾을 수 있습니다.

    여기에서 필터 라이브러리를 다운로드할 수 있습니다. 여기에서 라이브러리를 다운로드하세요.

    결과

    정확한 결과는 가운데, 왼쪽은 보정하지 않은 결과, 오른쪽은 보정 방법을 시연하는 데 사용됩니다(동영상 확인).

    두 코드 사이의 큰 차이는 비선형 신호에 응답하지만 두 번째 코드는 TRMS 멀티미터 역할을 합니다.

    LCD/OLED로 테스트

    여기서는 직렬 모니터 대신 LCD 또는 OLED를 사용할 수 있다는 점만 동일하게 유지합니다.

    배선, 코드 그리고 라이브러리

    배선은 아래 (Wiring_LCD) 및 (Wiring_OLED), 코드도 아래 (Code_ACS712_LCD) 및 (Code_ACS712_OLED)에서 찾을 수 있습니다.

    다음은 OLED 라이브러리입니다.

    https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

    여기 LCD_i2c_library

    가 있습니다.

    https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

    결과

    튜토리얼 영상을 찍으려다가 OLED 화면이 깨져서 제가 할 수 있는 유일한 테스트입니다. 전반적으로 이것은 이전에 본 것과 같은 방식으로 작동하며 LCD i²c 화면에 표시합니다. (예, TRMS 값은 피크-투-피크 방법이 아닙니다.)

    이상입니다. 이 튜토리얼이 마음에 드셨으면 좋겠습니다. 비디오 튜토리얼을 좋아하고 SurtrTech 채널을 구독하는 것을 잊지 마세요. 지원을 받고 싶다면 대단히 감사합니다.

    질문은 댓글로 남겨주세요.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • 코드_ACS712_LCD.ino
  • 코드_ACS712_OLED.ino
  • Code_1.ino아두이노
    이 코드는 모듈을 테스트하고 신호를 시각화하기 위한 것입니다.
    /*이 코드는 ACS712 전류 센서와 함께 작동하며 원시 데이터를 읽을 수 있습니다. 직렬 플로터와 함께 사용하는 것이 좋습니다 www.surtrtech.com*/에서 더 자세한 정보 #define Current_sensor A0 //센서 아날로그 입력 pinfloat i;void setup() {Serial.begin(9600);pinMode(Current_sensor, INPUT);}void loop() { i =analogRead(Current_sensor); Serial.println(i); 지연(100); //지연을 수정하거나 제거하면 신호가 표시되는 방식이 변경됩니다. //올바른 사인파 모양을 얻을 때까지 설정합니다.}
    Code_2.ino아두이노
    이 코드는 피크 대 피크 측정 방법을 사용하여 사인파 신호의 RMS를 계산합니다
    /* 이 코드는 ACS712 전류 센서와 함께 작동하며 사인파 교류의 RMS를 계산할 수 있습니다. * 피크 대 피크를 사용합니다. RMS 계산 방법 * 자세한 내용은 www.surtrtech.com을 확인하십시오. */#define SAMPLES 300 //루프할 때마다 채취할 샘플 수#define ACS_Pin A0 // ACS712 데이터 핀 analong inputfloat High_peak,Low_peak; //측정하거나 계산할 변수float Amps_Peak_Peak, Amps_RMS;void setup() { Serial.begin(9600); 핀모드(ACS_핀,입력); //핀 모드 정의}void loop() { read_Amps(); //read_Amps 함수 실행 Amps_RMS =Amps_Peak_Peak*0.3536*0.06; //이제 우리는 피크 대 피크 값을 얻었습니다. 일반적으로 공식은 곱하기 0.3536만 필요합니다. //그러나 값이 매우 커질 것이므로 0.06을 곱해야 하므로 먼저 사용할 수 없습니다. //계산을 수행하고 다음과 비교합니다. 전류계로 측정한 실제 값. 예:0.06=실제값/측정값 Serial.print(Amps_RMS); //여기에 RMS 값과 피크 대 피크 값을 표시합니다. 원하는 것을 인쇄하고 "A" 기호를 추가할 수 있습니다... Serial.print("\t"); Serial.println(Amps_Peak_Peak); delay(200);}void read_Amps() //read_Amps 함수는 높은 피크와 낮은 피크의 차이를 계산합니다. { //피크 대 피크 값을 얻습니다. int cnt; //카운터 High_peak =0; //먼저 높은 피크는 0이고 낮은 피크는 1024라고 가정합니다. 네 반전 Low_peak =1024; for(cnt=0; cnt High_peak) //그 값이 높은 피크보다 높은 경우(처음에는 0) { High_peak =ACS_Value; //높은 피크는 0에서 찾은 값으로 변경됩니다. } if(ACS_Value  
    Code_3.ino아두이노
    이 코드는 통계 공식을 사용하여 신호의 TRMS를 계산하고 직렬 모니터에 표시합니다.
    /* 이 코드는 ACS712 전류 센서와 함께 작동하며 신호 TRMS의 계산을 허용합니다. * www.surtrtech.com을 방문하세요. 자세한 내용은 */#include  //이 라이브러리는 .cpp 파일임을 확인하는 대규모 작업을 수행합니다. file#define ACS_Pin A0 //A0의 센서 데이터 핀 아날로그 inputfloat ACS_Value; //여기서 원시 데이터 값을 유지합니다. float testFrequency =50; // 테스트 신호 주파수(Hz) float windowLength =40.0/testFrequency; // statististfloat intercept =0의 경우 신호를 평균화하는 시간; // 교정 테스트에 따라 조정float slope =0.0752; // 캘리브레이션 테스트에 따라 조정됨 //SurtrTech의 ACS712 Tutorial 비디오를 확인하여 센서에 따라 다르므로 가져오는 방법을 확인하거나 아래를 보십시오.float Amps_TRMS; // ampsunsigned long printPeriod =1000의 추정된 실제 전류; // 밀리초 단위 // 부호 없는 마지막 읽기 이후 시간을 밀리초 단위로 추적합니다. long previousMillis =0;void setup() { Serial.begin( 9600 ); // 직렬 포트 시작 pinMode(ACS_Pin,INPUT); //핀 모드 정의}void loop() { RunningStatistics inputStats; // 원시 테스트 신호를 보기 위한 통계 생성 inputStats.setWindowSecs( windowLength ); //창 길이 설정 while( true ) { ACS_Value =analogRead(ACS_Pin); // 아날로그 값을 읽습니다. inputStats.input(ACS_Value); // 통계에 기록 function if((unsigned long)(millis() - previousMillis)>=printPeriod) { //매초 계산을 수행합니다. previousMillis =millis(); // 업데이트 시간 Amps_TRMS =절편 + 기울기 * inputStats.sigma(); Serial.print( "\t 암페어:" ); Serial.print(Amps_TRMS); } }}/* 기울기와 절편에 대해 * 먼저 모든 TRMS 계산이 라이브러리의 함수에 의해 수행된다는 것을 알아야 합니다. 이 값은 "inputStats.sigma()" 값입니다. * 처음에는 "inputStats.sigma ()"를 TRMS 값으로 입력한 다음 입력이 0.00A일 때 이를 사용하여 측정을 시도합니다. * 내가 얻은 것처럼 측정된 값이 0이면 절편을 0으로 유지할 수 있습니다. 그렇지 않으면 더하거나 빼야 합니다. 값은 0과 같습니다. * 즉, " 오프셋 제거" * 그런 다음 알려진 값으로 전원을 켭니다. 예를 들어 전원을 알고 있고 이미 전압을 알고 있는 전구나 LED를 사용하여 약간의 수학을 할 수 있습니다. 이론적인 암페어를 얻습니다 * 이론값을 측정값으로 나누면 기울기가 나옵니다. 이제 배치하거나 수정합니다. */
    Code_ACS712_LCD.ino아두이노
    이 코드는 TRMS 계산 방법을 사용하여 LCD i²c
    /*에 표시합니다. 이 코드는 ACS712 및 LCD ic에서 작동합니다. * 교류의 TRMS를 측정하여 화면에 값을 표시합니다. * www.SurtrTech.com을 방문하세요. 자세한 내용은 */#include  //이 라이브러리는 .cpp 파일을 확인하는 엄청난 작업을 수행합니다.#include  //LCD ic 라이브러리#define ACS_Pin A0 //ACS712 데이터 핀#define I2C_ADDR 0x27 //I2C 주소, 먼저 주소를 스캔하려면 코드를 사용해야 합니다(0x27) here#define BACKLIGHT_PIN 3 // LCD 핀 선언#define En_pin 2#define Rw_pin 1#define Rs_pin 0#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); //lcdfloat 선언 testFrequency =50; // 테스트 신호 주파수(Hz) float windowLength =40.0/testFrequency; // statististfloat intercept =0의 경우 신호를 평균화하는 시간; // 교정 테스트에 따라 조정float slope =0.0752; // 캘리브레이션 테스트에 따라 조정됨 //SurtrTech의 ACS712 Tutorial 비디오를 확인하여 센서에 따라 다르므로 가져오는 방법을 확인하거나 아래를 보십시오.float Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0, void setup() { digitalWrite(2,HIGH); lcd.begin(16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.set백라이트(높음); //조명 백라이트 lcd.home(); } 무효 루프() { RunningStatistics inputStats; // 원시 테스트 신호를 보기 위한 통계 생성 inputStats.setWindowSecs( windowLength ); while( true ) { ACS_Value =analogRead(ACS_Pin); // 아날로그 값을 읽습니다. inputStats.input(ACS_Value); // 통계에 기록 function if((unsigned long)(millis() - previousMillis)>=printPeriod) { //매초 계산을 수행합니다. previousMillis =millis(); // 업데이트 시간 Amps_TRMS =절편 + 기울기 * inputStats.sigma(); //값 보정 lcd.clear(); //LCD를 지우고 특정 위치에 인쇄 lcd.setCursor(2,0); lcd.print(Amps_TRMS); lcd.print("아"); } }}/* 기울기와 절편에 대해 * 먼저 모든 TRMS 계산이 라이브러리의 함수에 의해 수행된다는 것을 알아야 합니다. 이 값은 "inputStats.sigma()" 값입니다. * 처음에는 "inputStats.sigma ()"를 TRMS 값으로 입력한 다음 입력이 0.00A일 때 이를 사용하여 측정을 시도합니다. * 내가 얻은 것처럼 측정된 값이 0이면 절편을 0으로 유지할 수 있습니다. 그렇지 않으면 더하거나 빼야 합니다. 값은 0과 같습니다. * 즉, " 오프셋 제거" * 그런 다음 알려진 값으로 전원을 켭니다. 예를 들어 전원을 알고 있고 이미 전압을 알고 있는 전구나 LED를 사용하여 약간의 수학을 할 수 있습니다. 이론적인 암페어를 얻습니다 * 이론값을 측정값으로 나누면 기울기가 나옵니다. 이제 배치하거나 수정합니다. */
    Code_ACS712_OLED.ino아두이노
    이 코드는 TRMS 계산 방식을 사용하여 OLED에 값을 표시합니다.
    /* 이 코드는 ACS712 및 OLED ic에서 작동합니다. * 교류의 TRMS를 측정하여 화면에 값을 표시합니다. * www.SurtrTech를 방문하세요. com 자세한 내용은 */#include  //이 라이브러리는 .cpp 파일을 확인하는 엄청난 작업을 수행합니다.#include  //OLED 라이브러리#include #define ACS_Pin A0#define SCREEN_WIDTH 128 // OLED 디스플레이 너비(픽셀)#define SCREEN_HEIGHT 32 // OLED 디스플레이 높이(픽셀)#define OLED_RESET -1 // 리셋 핀 #(또는 Arduino 리셋 핀을 공유하는 경우 -1) float testFrequency =50; // 테스트 신호 주파수(Hz) float windowLength =40.0/testFrequency; // statististfloat intercept =0의 경우 신호를 평균화하는 시간; // 교정 테스트에 따라 조정float slope =0.0752; // 캘리브레이션 테스트에 따라 조정됨 //SurtrTech의 ACS712 Tutorial 비디오를 확인하여 센서에 따라 다르므로 가져오는 방법을 확인하거나 아래를 보십시오.float Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0;Adafruit_SSD1306 디스플레이(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //표시 이름 선언 (display)void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //OLED 디스플레이 시작 display.clearDisplay(); display.display();} 무효 루프() { RunningStatistics inputStats; // 원시 테스트 신호를 보기 위한 통계 생성 inputStats.setWindowSecs( windowLength ); while( true ) { ACS_Value =analogRead(ACS_Pin); // 아날로그 값을 읽습니다. inputStats.input(ACS_Value); // Stats에 기록 function if((unsigned long)(millis() - previousMillis)>=printPeriod) { //1초마다 계산을 수행합니다. previousMillis =millis(); // 업데이트 시간 Amps_TRMS =절편 + 기울기 * inputStats.sigma(); display.clearDisplay(); display.setTextSize(3); display.setTextColor(흰색); display.setCursor(15,10); display.print(Amps_TRMS); display.println("아"); 디스플레이.디스플레이(); } }}/* 기울기 및 절편 정보 * 먼저 모든 TRMS 계산이 라이브러리의 함수에 의해 수행된다는 것을 알아야 합니다. 이 값은 "inputStats.sigma()" 값입니다. * 처음에는 "inputStats.sigma ()"를 TRMS 값으로 입력한 다음 입력이 0.00A일 때 이를 사용하여 측정을 시도합니다. * 내가 얻은 것처럼 측정된 값이 0이면 절편을 0으로 유지할 수 있습니다. 그렇지 않으면 더하거나 빼야 합니다. 값은 0과 같습니다. * 다른 말로 "오프셋 제거" * 그런 다음 알려진 값으로 전원을 켭니다. 예를 들어 전원을 알고 있고 이미 전압을 알고 있는 전구나 LED를 사용하여 약간의 수학을 할 수 있습니다. 이론적인 암페어를 얻을 수 있습니다 * 이론값을 측정값으로 나누면 기울기가 나옵니다. 이제 이를 배치하거나 수정합니다. */

    회로도

    테스트 1,2 및 3에 사용된 배선 LCD i²c 사용 OLED 128x32 사용

    제조공정

    1. OpenSensor의 공기질 측정 방법
    2. K30 센서로 CO2 모니터링
    3. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
    4. Arduino로 코인 억셉터 제어
    5. Bluetooth가 탑재된 Arduino로 LED 제어!
    6. Arduino 또는 ESP8266이 있는 정전 용량 지문 센서
    7. Nextion 디스플레이로 재생
    8. Nunchuk 제어 로봇 팔(Arduino 포함)
    9. 모든 오디오 소스로 Billy Bass 입에 애니메이션 효과 주기
    10. Arduino로 태양 복사열 측정