- ESP32 파워 미터에 필요한 재료
- Arduino 및 ESP32 기반 효율 측정기-회로도
- Arduino 및 ESP32 기반 효율 측정기를위한 PCB 설계
- Arduino 및 ESP32 기반 효율 측정기-코드
- Arduino 및 ESP32 기반 효율 측정기 테스트
- 추가 향상
우리는 모든 전자 프로젝트 또는 회로에서 값을 측정하는 데 필요한 세 가지 기본 사항 인 기본 전압계, 전류계 및 전력계를 알고 있습니다. 멀티 미터를 사용하여 전압과 전류를 측정하는 것은 좋은 시작 방법이 될 수 있지만 회로를 테스트하는 동안 내가 직면하는 가장 큰 문제 중 하나는 전력 효율을 측정하는 것 입니다. 그래서 오늘 우리는 입력 전압, 입력 전류, 출력 전압, 출력 전류를 측정 할 수있는 아두 이노와 ESP32 기반의 효율 측정기를 구축함으로써이 문제를 해결할 것입니다 . 따라서 입력 전력과 출력 전력을 동시에 측정 할 수 있으며, 이러한 값으로 효율을 쉽게 측정 할 수 있습니다. 이전에는 Arduino 기반 전력계 프로젝트에서도 매우 유사한 작업을 수행했지만 여기서는 입력 전력과 출력 전력을 모두 측정하여 전력 효율을 계산합니다.
작업을 위해 4 미터를 구입하는 대신 4 미터의 기능을 하나로 통합하여이 문제를 해결할 수 있습니다. 디지털 계량기를 구축하면 비용이 절감 될뿐만 아니라 업그레이드 및 개선을위한 흔들림도 생깁니다. 이 프로젝트를 구축하기 위해 ESP32를 사용하고 있기 때문에이 미터 IoT를 쉽게 활성화하고 웹을 통해 데이터를 기록 할 수 있습니다. 이는 향후 프로젝트의 주제입니다. 모든 기본 사항을 정리했으면 바로 시작하겠습니다.
참고:이 전력계는 DC 회로 용으로 설계되었습니다. AC 전류를 측정하여 AC 전력 효율을 계산하려는 경우 IoT 기반 전기 에너지 미터 및 선불 에너지 미터 프로젝트를 확인할 수 있습니다.
ESP32 파워 미터에 필요한 재료
아래 이미지는 회로를 만드는 데 사용되는 재료를 보여줍니다. 이것은 매우 일반적인 구성 요소로 만들어 졌기 때문에 지역 취미 상점에서 나열된 모든 재료를 찾을 수 있습니다.
또한 필요한 수량과 함께 아래 구성 요소를 나열했습니다. 직접 회로를 구축하는 경우 아래 목록에서 모든 자료를 얻는 것이 좋습니다.
- ESP32 보드-1
- 128X64 OLED-1 개
- ACS712-20 IC-2
- DC 배럴 잭-1
- 100uF 커패시터-2
- 104pF-2
- 102pF-2
- 10,000, 1 %-4
- 68K, 1 %-2
- 6.8K, 1 %-2
Arduino 및 ESP32 기반 효율 측정기-회로도
Arduino 및 ESP32 기반 효율 측정기 의 회로도 는 다음과 같습니다. 이 회로를 만드는 것은 매우 간단하며 일반 구성 요소를 사용합니다.
회로의 작동은 매우 간단합니다. 이 프로젝트에서는 고유 한 방식으로 전압과 전류를 측정 할 것입니다. 입력과 출력 모두에 대해 전압과 전류를 측정하고 있으므로 회로의 효율성을 볼 수 있습니다. 이것은 일부 프로젝트에 매우 유용합니다. 효율성 측정이 필수가되는 DC-DC 변환기를 예로들 수 있습니다. 이러한 회로가 작동하는 방식은 아래에 설명되어 있습니다.
ACS712 전류 센서 IC:
위 그림에서 볼 수 있듯이 ACS712 전류 센서 IC 를 사용하여 전류 를 측정하고 있습니다. 홀 효과 를 사용하여 전류를 측정 하므로 매우 흥미로운 IC 입니다.이 IC에는 시장 f (또는 5A, 20A 및 30A)에서 찾을 수있는 세 가지 변형이 있습니다. 우리는 이것의 20A 변형을 사용하고 있으며 ACS712-20으로 표시되어 있습니다.
ACS712 데이터 시트는 원활하게 작동하기 위해 4.5-5.5의 전압 범위를 권장합니다. 그리고 ESP32로 전류를 측정 할 때 3.3V 만 허용하므로 2 개의 10K 저항이있는 전압 분배기를 사용하여 ACS712 IC의 출력 전압을 낮추었습니다. IC를 통해 전류가 흐르지 않으면 2.5V를 출력하고 IC를 통해 일정량의 전류가 흐르면 전류 흐름 방향에 따라 전압을 낮추거나 전압을 높입니다. 이 IC 중 두 개를 사용하여 입력 및 출력 전류를 측정했습니다. 이 ACS712 센서를 사용한 이전 프로젝트 (아래)를 확인하십시오.
- Arduino 및 ESP8266 Wi-Fi 모듈을 사용하는 IoT 기반 전기 에너지 미터
- PIC 마이크로 컨트롤러 및 ACS712를 사용하는 디지털 전류계 회로
이 센서의 작동에 대해 자세히 논의했습니다. 이 센서에 대해 더 알고 싶다면 그것들을 확인할 수 있습니다.
전압 분배기:
입력 및 출력 전압을 측정하기 위해 회로의 입력 및 출력 측에 두 개의 전압 분배기 가 있습니다. 회로가 측정 할 수있는 최대 전압은 35V이지만 전압 분배기의 저항 값을 변경하여 쉽게 변경할 수 있습니다.
전압 조정기:
일반 LM7805 전압 조정기는 ESP32, OLED 및 ACS712 IC에 전원을 공급하는 데 사용됩니다. 상당히 깨끗한 전력으로 전력을 공급하기 때문에 디커플링 커패시터가 사용되지 않지만 IC를 안정화하기 위해 입력과 출력 모두에 100uF 커패시터를 사용했습니다.
ESP32 IC 및 OLED 디스플레이:
우리는 모든 판독, 계산, 입력 및 출력을 담당하는 ESP32를 메인 프로세서로 사용했습니다. 또한 값을 알기 위해 128X64 OLED 디스플레이를 사용했습니다.
Arduino 및 ESP32 기반 효율 측정기를위한 PCB 설계
Arduino 및 ESP32 기반 효율 측정기 용 PCB는 단면 기판에 설계되었습니다. Eagle을 사용하여 PCB를 설계했지만 원하는 설계 소프트웨어를 사용할 수 있습니다. 내 보드 디자인의 2D 이미지는 아래와 같습니다.
모든 구성 요소간에 적절한 접지 연결을 만들기 위해 충분한 접지 트레이스가 사용됩니다. 또한 적절한 5V 및 3.3V 트레이스를 사용하여 노이즈를 줄이고 효율성을 개선했습니다.
- PCB 설계 및 GERBER 파일 다운로드 Arduino 및 ESP32 기반 효율 측정기
수제 PCB:
편의와 테스트를 위해 수제 버전의 PCB를 만들었으며 아래에 나와 있습니다. 첫 번째 버전에서는 몇 가지 실수를 저질렀는데 점퍼 와이어를 사용하여 수정했습니다. 하지만 최종 버전에서는 수정했습니다. 파일을 다운로드하여 사용할 수 있습니다.
Arduino 및 ESP32 기반 효율 측정기-코드
이제 하드웨어 측면을 잘 이해 했으므로 Arduino IDE를 열고 코딩을 시작할 수 있습니다. 코드의 목적은 ESP32 보드의 핀 35 및 33에서 아날로그 전압을 읽는 것입니다. 또한 현재 값인 32 핀과 34 핀의 전압을 읽습니다. 이렇게하면 입력 전력과 출력 전력을 얻기 위해 그것들을 곱할 수 있고 효율 공식에 적용하면 효율을 얻을 수 있습니다.
마지막으로 LCD 화면에 표시합니다. 동일한 작업을 수행하는 전체 프로그램이 마지막에 제공되며 위에서 설명한 하드웨어에 사용할 수 있습니다. 또한 코드는 작은 조각으로 분할되어 설명됩니다.
우리가 128X64 OLED 디스플레이를 사용하고, 우리는 필요 Adafruit_GFX 라이브러리 와 Adafruit_SSD1306 라이브러리 디스플레이와 통신 할 수 있습니다. Arduino의 기본 보드 관리자 터미널에서 둘 다 다운로드 할 수 있습니다. 보드 관리자 부분에 문제가있는 경우 아래에 제공된 관련 GitHub 저장소에서 라이브러리를 다운로드하여 포함 할 수도 있습니다.
- Adafruit_GFX 라이브러리 다운로드
- Adafruit_SSD1306 라이브러리 다운로드
항상 그렇듯이 필요한 모든 라이브러리를 포함하여 코드를 시작합니다. 그런 다음 아래에 표시된 모든 필수 핀과 변수를 정의합니다.
#포함
SCREEN_WIDTH & SCREEN_HEIGHT 정의는 화면 크기를 정의하는 데 사용됩니다. 다음으로 전압과 전류를 측정하는 데 필요한 모든 핀을 정의했습니다. 다음으로 회로도에서 볼 수 있듯이 하드웨어에서 사용되는 저항 값을 정의했습니다. 이러한 값이 없거나 미터의 범위를 변경하려는 경우 해당 값을 변경할 수 있습니다. 코드가 제대로 작동합니다.
ACS712를 사용하여 전류를 측정하므로 전압에서 전류를 계산하려면 mVperAmp 값이 필요합니다. 20A ACS712 모듈을 사용하고 있으므로 mV / A 값은 데이터 시트에 나와있는대로 100입니다. 그러나 우리는 ESP32와 전압 분배기를 사용하기 때문에 50 인 값의 절반을 갖게 될 것입니다. 그래서 mV / AMP 값을 입력했습니다.
ACSoffset 은 전압에서 전류를 계산하는 데 필요한 오프셋입니다. ACS712 IC는 5V에서 전원이 공급되므로 오프셋 전압은 2.5V입니다. 그러나 우리가 전압 분배기를 사용하면 1.25V로 떨어집니다. ESP32의 형편없는 ADC를 이미 알고있을 수 있으므로 1136의 값을 사용해야했습니다. 교정 문제가있는 경우 값을 조정하고 ADC를 보정 할 수 있습니다.
마지막으로 Adafruit_SSD1306 클래스 의 표시 객체를 만들고 화면 너비, 높이, I 2 C 구성을 전달하고 마지막 -1 매개 변수를 사용하여 재설정 기능을 정의 하여이 섹션을 완료 합니다. 디스플레이에 외부 리셋 핀이없는 경우 (확실히 내 디스플레이 용) 마지막 인수에 -1을 사용해야합니다.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// 128x64에 대한 주소 0x3D Serial.println (F ("SSD1306 할당 실패")); for (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); 지연 (100); }
다음으로 setup () 섹션이 있습니다. 이 섹션에서는 디버깅을 위해 직렬을 활성화 하고 디스플레이 객체의 시작 방법을 사용 하여 I 2 C 디스플레이를 사용할 수 있는지 여부를 확인 합니다. 또한 I 2 C 주소를 설정합니다. 다음으로 clearDisplay () 메서드로 디스플레이를 지 웁니다. 또한 setRotation 메서드를 사용 하여 디스플레이를 회전합니다. PCB 디자인을 엉망으로 만들었 기 때문입니다. 다음으로 함수가 적용되도록 100ms의 지연을 설정합니다. 완료되면 이제 루프 기능으로 이동할 수 있습니다. 그러나 루프 기능에 진행하기 전에, 우리는 두 개의 다른 기능을 논의 할 필요가 return_voltage_value을 () , 및 return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; 이중 ADCVoltage = 0; 이중 inputVoltage = 0; 이중 평균 = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } 평균 = tmp / 150; ADC 전압 = ((평균 * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // 전압 계산 공식, 즉 GND return inputVoltage; }
return_voltage_value () 함수는 ADC에 들어오는 전압을 측정하는 데 사용되며, 그 인수로서 pin_no 걸린다. 이 함수에서는 tmp, ADCVoltage, inputVoltage 및 avg와 같은 일부 변수를 선언하여 시작합니다. tmp 변수는 analogRead () 함수 에서 얻은 임시 ADC 값을 저장하는 데 사용됩니다. 그런 다음 for 루프에서 150 회 평균을 내고 값을 avg라는 변수에 저장합니다. 그런 다음 주어진 공식에서 ADCVoltage를 계산하고 마지막으로 입력 전압을 계산하고 값을 반환합니다. 표시되는 +0.138 값은 전압 레벨을 보정하는 데 사용한 보정 값입니다. 오류가 발생하면이 값을 사용해보세요.
double return_current_value (int pin_no) {double tmp = 0; 이중 평균 = 0; 이중 ADCVoltage = 0; 이중 암페어 = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } 평균 = tmp / 150; ADC 전압 = ((평균 / 4095.0) * 3300); // mV Amps = ((ADCVoltage-ACSoffset) / mVperAmp); 반환 Amps; }
다음으로 return_current_value () 함수가 있습니다. 이 함수는 또한 pin_no를 인수로 사용합니다. 이 함수에는 4 개의 변수 즉, tmp, avg, ADCVoltage 및 Amps
다음으로 analogRead () 함수로 핀을 읽고 150 회 평균 을 낸 다음 공식을 사용하여 ADC 전압을 계산하고 전류를 계산하고 값을 반환합니다. 이를 통해 루프 섹션으로 이동할 수 있습니다.
void loop () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs (return_current_value (INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs (return_voltage_value (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); 입력 _ 전류 = 입력 _ 전류-0.025; Serial.print ("입력 전압:"); Serial.print (입력 _ 전압); Serial.print ("-입력 전류:"); Serial.print (input_current); Serial.print ("-출력 전압:"); Serial.print (출력 _ 전압); Serial.print ("-출력 전류:"); Serial.println (출력 _ 전류); 지연 (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); 디스플레이.print ("V"); }
4 개의 변수 모두에서 일부 부동 변수를 선언하고 정의하여 루프 섹션을 시작합니다. ACS712 모듈은 현재 값을 음수로 반환 할 수 있으므로 pin_no를 인수로 전달하여 각 함수를 호출합니다. 우리 는 수학 라이브러리 의 abs () 함수를 사용하여 음수 값을 양수로 만듭니다. 다음으로 디버깅을 위해 모든 값을 직렬 인쇄합니다. 다음으로 디스플레이를 지우고 커서를 설정하고 값을 인쇄합니다. 디스플레이에 표시된 모든 문자에 대해이 작업을 수행합니다. 루프 기능과 프로그램의 끝을 표시합니다.
Arduino 및 ESP32 기반 효율 측정기 테스트
위 이미지에서 내 테스트 설정을 볼 수 있습니다. 30V 변압기를 입력으로 사용하고 미터기를 테스트 보드에 연결했습니다. 저는 LM2596 기반 벅 컨버터 보드를 사용하고 있으며 부하를 위해 3 개의 10 Ohms 저항을 병렬로 사용하고 있습니다.
위 이미지에서 볼 수 있듯이 입력 및 출력 전압을 확인하기 위해 멀티 미터에 연결했습니다. 변압기는 거의 32V를 생성하고 벅 컨버터의 출력은 3.95V입니다.
여기 이미지는 효율 측정기와 멀티 미터로 측정 한 출력 전류를 보여줍니다. 보시다시피 멀티 미터는.97A를 표시하고 조금 확대하면 1.0A로 표시되며 ACS712 모듈에 존재하는 비선형 성으로 인해 약간 떨어져 있지만 이것은 우리의 목적에 부합합니다. 자세한 설명과 테스트는 비디오 섹션에서 비디오를 확인할 수 있습니다.
추가 향상
이 데모를 위해 회로는 수제 PCB로 만들어 지지만 회로는 좋은 품질의 PCB로 쉽게 만들 수 있습니다. 제 실험에서는 부품 크기로 인해 PCB의 크기가 정말 크지 만 생산 환경에서는 저렴한 SMD 부품을 사용하여 줄일 수 있습니다. 또한 회로에는 보호 기능이 내장되어 있지 않으므로 보호 회로를 포함하면 회로의 전반적인 안전 측면이 향상됩니다. 또한 코드를 작성하는 동안 ESP32의 ADC가 그다지 좋지 않다는 것을 알았습니다. ADS1115 모듈과 같은 외부 ADC를 포함하면 전반적인 안정성과 정확도가 향상됩니다.
이 기사를 좋아하고 새로운 것을 배웠기를 바랍니다. 의심스러운 점이 있으면 아래 의견에 질문하거나 포럼을 사용하여 자세한 토론을 할 수 있습니다.