ESP32는 가장 널리 사용되는 Wi-Fi 기반 마이크로 컨트롤러 모듈 중 하나이며 많은 휴대용 IoT 애플리케이션 에서 인기있는 선택입니다. 듀얼 코어 프로그래밍을 지원하는 강력한 컨트롤러이며 내장형 Bluetooth 저에너지 (BLE) 지원이있어 iBeacon 장치, GPS 추적기 등과 같은 휴대용 응용 프로그램에 적합합니다. 그러나 이와 같은 배터리 구동 응용 프로그램에서는, 주요 관심사는 배터리 백업입니다. 이 배터리 백업은 장치 의 배터리 백업을 늘리기 위해 이상적인 조건 에서 절전 모드 에서 ESP32를 프로그래밍 할 수있는 것처럼 마이크로 컨트롤러 장치를 더 스마트하게 제어하여 증가시킬 수 있습니다.
이 프로젝트에서는 일반 작업 모드 및 딥 슬립 모드에서 널리 사용되는 Wi-Fi 및 Bluetooth 지원 마이크로 컨트롤러 장치 ESP32의 전류 소비량을 확인합니다. 또한 차이점을 테스트하고 ESP32를 딥 슬립 모드로 설정하는 방법을 확인합니다. 마이크로 컨트롤러에서 전력 소비를 최소화하는 방법에 대한 기사에서 설계를 훨씬 더 전력 효율적으로 만드는 데 사용할 수있는 다른 팁을 확인할 수도 있습니다. 또한 다른 마이크로 컨트롤러의 절전 모드에 관심이있는 경우 Arduino 절전 모드 및 ESP8266 NodeMCU 절전 모드도 확인할 수 있습니다.
요구 사항
이를 위해 Espressif의 ESP32 기반 Devkit V4.0은 USB-UART 브리지 및 다른 ESP32 핀아웃을 사용하여 쉽게 연결할 수 있습니다. 프로그래밍은 Arduino IDE로 수행됩니다. 완전히 새로운 경우 Arduino를 사용하여 ESP32를 시작하려면 계속하기 전에 링크 된 기사를 읽으십시오.
이 프로젝트의 요구 사항은 다음과 같습니다.
- 버튼을 누르면 딥 슬립 모드로 들어갑니다.
- 다른 버튼을 누르면 딥 슬립 모드가 해제됩니다.
- ESP32의 상태를 감지하기 위해 LED가 켜지면서 1000 밀리 초 동안 깜박입니다. 절전 모드 중에는 꺼집니다.
따라서 추가 구성 요소가 필요합니다.
- LED-1 개
- 누름 버튼 (촉각 스위치)-2 개
- 4.7k 저항-2 개
- 680R 저항-1 개
- 브레드 보드
- 와이어 연결
- 5V 어댑터 또는 전원 공급 장치
- 마이크로 USB 케이블
- PC 또는 노트북에서 ESP32 프로그래밍 인터페이스가있는 Arduino IDE.
ESP32 슬립 모드 회로도
푸시 버튼을 사용하여 ESP32를 절전 모드로 전환하는 회로도 는 다음과 같습니다.
회로도는 매우 간단합니다. 두 개의 버튼이 있습니다. 슬립 버튼은 ESP32를 딥 슬립 모드로 전환하고 다른 스위치는 슬립 모드에서 ESP32를 깨우기 위해 사용됩니다. 두 버튼은 모두 PIN 16과 PIN 33으로 연결되어 있습니다. 두 버튼은 모두 누를 때 활성 로우로 구성되므로 추가 풀업이 제공됩니다. 그러나 ESP 32가 절전 모드인지 정상 작동 상태인지 감지하기 위해 LED는 IO 핀 4에 연결됩니다.
ESP32의 절전 모드 개요
많은있다 ESP32에 대해 서로 다른 전력 모드, 즉 활성 모드, 모뎀 슬립 모드, 빛 슬립 모드, 딥 슬립 모드 및 최대 절전 모드.
정상적인 작동 조건에서 ESP32는 활성 모드에서 실행됩니다. 동안 ESP32 동작 모드 는 CPU, 무선 랜 / BT 하드웨어 RTC 메모리 및 RTC 주변기기 ULP 코 프로세서 모두 활성화되고 작업은 작업 부하에 따라. 그러나 다른 전원 모드에서는 하나 이상의 주변 장치가 꺼집니다. 다른 전원 모드 작동을 확인하려면 아래 표를 따르십시오.
하드웨어 |
활성 모드 |
모뎀 절전 모드 |
가벼운 수면 모드 |
딥 슬립 모드 |
동면 |
CPU |
의 위에 |
의 위에 |
중지 |
떨어져서 |
떨어져서 |
WiFi / BT |
의 위에 |
떨어져서 |
떨어져서 |
떨어져서 |
떨어져서 |
RTC 및 RTC 주변기기 |
의 위에 |
의 위에 |
의 위에 |
의 위에 |
떨어져서 |
ULP-Co 프로세서 |
의 위에 |
의 위에 |
의 위에 |
켜기 / 끄기 |
떨어져서 |
위의 표에서 볼 수 있듯이 종종 ULP 센서 모니터링 패턴 으로 불리는 ESP32 딥 슬립 모드 ( CPU, WiFi / BT, RTC 메모리 및 주변 장치)에서는 ULP 보조 프로세서가 모두 꺼집니다. RTC 메모리 및 RTC 주변 장치 만 켜집니다.
웨이크 업 상황 에서 ESP32는 딥 슬립 모드에서 ESP32를 웨이크 업하는 웨이크 업 소스 로부터 알림을 받아야합니다. 그러나 RTC 주변 장치가 켜져 있기 때문에 ESP32는 RTC 지원 GPIO를 통해 깨울 수 있습니다. 다른 옵션도 있습니다. 외부 웨이크 업 인터럽트 핀을 통해 웨이크 업하거나 타이머를 사용하여 ESP32를 웨이크 업할 수 있습니다. 이 프로젝트에서는 33 번 핀에서 ext0 wakeup을 사용합니다.
딥 슬립 모드를위한 ESP32 프로그래밍
전체 프로그램은이 페이지 하단에서 찾을 수 있습니다. Arduino IDE 용으로 작성되었으므로 요구 사항에 쉽게 적용 할 수 있습니다. 코드에 대한 설명은 다음과 같습니다.
코드 시작 부분에서
// 푸시 버튼 변수 생성 PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // Led Pin 정의 uint8_t led_pin = GPIO_NUM_4; // 웨이크 업 핀 정의 uint8_t wakeUp_pin = GPIO_NUM_33;
위의 세 줄은 웨이크 업 핀, LED 핀 및 절전 모드 핀을 정의합니다.
void setup () { // 여기에 설정 코드를 입력하여 한 번 실행합니다. // 직렬 포트를 115200으로 설정 Serial.begin (115200); 지연 (1000); // 내부 PullUp을 사용하여 푸시 버튼 핀을 입력으로 설정 pinMode (pushBtn.pin, INPUT_PULLUP); // Falling 모드에서 pushButton 핀으로 인터럽트 핸들러 설정 attachInterrupt (pushBtn.pin, isr_handle, FALLING); // Led 핀을 출력으로 설정 pinMode (led_pin, OUTPUT); // 우선 순위가 1이고 코어 0에서 실행되는 blinkLed () 함수에서 실행될 태스크를 생성합니다. xTaskCreate ( blinkLed, / * 태스크 함수. * / "blinkLed", / * 태스크 이름. * / 1024 * 2, / * 작업의 스택 크기 * / NULL, / * 작업의 매개 변수 * / 5, / * 작업 우선 순위 * / & taskBlinkled); / * 생성 된 작업을 추적하는 작업 핸들 * / delay (500); // 낮은 로직 레벨을 사용하여 핀 33을 ext0 웨이크 업 소스로 구성 esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
위에서 인터럽트는 코드 스 니펫에 의해 하강 모드로 설정됩니다.
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
따라서 스위치를 누를 때마다 로직 레벨이 로직 1 (3.3V)에서 로직 0 (0V)으로 변경됩니다. 버튼 핀의 전압이 떨어지고 ESP32는 스위치가 눌 렸음을 식별합니다. LED를 깜박이는 작업도 있습니다.
xTaskCreate ( blinkLed, / * 태스크 함수. * / "blinkLed", / * 태스크 이름. * / 1024 * 2, / * 태스크 스택 크기 * / NULL, / * 태스크 매개 변수 * / 5, / * 우선 순위 작업의 * / & taskBlinkled); / * 생성 된 작업을 추적하는 작업 핸들 * / delay (500);
핀 33은 또한 ext0으로 식별되는 외부 웨이크 업 소스로 아래 코드 스 니펫을 사용하여 구성됩니다.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
다음으로 while 루프에서
void loop () { // 여기에 기본 코드를 넣어 반복적으로 실행합니다. if (pushBtn.pressed) {Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf (" 'blinkLed'작업 일시 중지 \ n"); // blinkLed 작업을 중단합니다. vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("잠자기….. \ n", pushBtn.pin); pushBtn.pressed = false; // 지금 잠자기 시작 esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("WakeUp From Sleep을 위해 외부 신호 ext0 사용"); 단절; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("WakeUp From Sleep을 위해 외부 신호 ext1 사용"); 단절; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("sleep에서 WakeUp을위한 타이머 신호 사용"); 단절; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("잠자기에서 깨우기위한 터치 패드 신호 사용"); 단절; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("WakeUp From Sleep에 ULP 신호 사용"); 단절; 기본값: 휴식; Serial.printf (" 'blinkLed'작업 재개 \ n"); // blinkLed 작업을 다시 시작합니다. vTaskResume (taskBlinkled); } }
while 루프는 수면 버튼을 눌렀는지 여부를 지속적으로 확인합니다. 버튼을 누르면 LED 깜박임 작업을 중지하거나 일시 중지하고 esp 딥 슬립 시작 기능을 실행합니다.
esp_deep_sleep_start ();
이 상황에서 ext0 외부 인터럽트 버튼을 누르면 즉시 딥 슬립 모드에서 깨어나 LED 깜박임 작업을 다시 시작합니다.
마지막으로 LED 깜박임 기능은 아래 스 니펫에서 볼 수 있으며 LED가 1000ms 초 동안 깜박입니다.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // 핀 값을 토글합니다. pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led ----------------- % s \ n", pin_val? "On": "Off"); / * 1000ms 또는 1 초마다 LED를 전환하기 만하면됩니다. * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
최대 절전 모드에서 ESP32 테스트
회로는 브레드 보드로 구성되며 Metravi XB 에디션 멀티 미터가 전류를 측정하는 데 사용됩니다. 활성 모드에서 회로에 의해 소비되는 전류는 거의 58mA이지만 딥 슬립 모드에서는 전류가 거의 4.10mA입니다. 이미지 아래에 표시되어 ESP32 액티브 모드 전류 소비를 -
딥 슬립 모드에서 전류 소비는 약 3.95mA로 떨어졌습니다. 아래 이미지는 ESP32 딥 슬립 모드 전류 소비를 보여줍니다.
그러나 딥 슬립 모드에서 ESP32의 전류 소비는 거의 150uA입니다. 그러나이 ESP32 Devkit 보드의 기록 된 전류 소비는 거의 4.10mA입니다. 이는 CP2102와 선형 레귤레이터 때문입니다. 이 두 가지는 5V 전력선에 연결됩니다. 거의 2mA의 전류를 소비하는 전력선에 연결된 전력 LED도 있습니다.
따라서 ESP32는 배터리 전원 작동에 매우 유용한 딥 슬립 모드 조건에서 매우 적은 양의 에너지를 소비한다는 것을 쉽게 식별 할 수 있습니다. 작동 방식에 대한 자세한 내용은 아래 링크 된 비디오를 확인하십시오. 질문이 있으시면 아래 댓글 섹션에 남겨 주시거나 다른 기술 질문에 대해서는 포럼을 사용하십시오.