최근 ESP32 MCU를 활용해 IoT 조명을 만드는 프로젝트를 진행하고 있었습니다. 그러던 중 조명의 상태를 Flash(NVS)에 저장할 필요가 있었는데요, 밝기를 바꿀 때 마다 Flash에 쓰기보다는 전원이 차단될 때 Flash에 쓰는 쪽이 조금 더 바람직해 보여 이러한 방식으로 구현해보기로 하였습니다.
그러기 위해서는 전원의 차단을 감지할 필요가 있었고 이를 위해 ESP-IDF의 Brownout Detector을 활용해보기로 하였습니다.
여기서는 ESP-IDF v5.1을 사용하며 작성 시점의 stable 최신 버전인 v5.1.1을 사용하였습니다.
ESP-IDF 들여다보기
ESP-IDF에는 기본적으로 BOD(Brownout Detector)가 내장되어 있으며, SDK Configuration의 “Brownout Detector”를 켜면 자동으로 적용됩니다.
esp-idf/components/esp_system/startup.c - do_core_init() 함수 내부
내부적으로는 esp-idf/components/esp_system/startup.c 의 do_core_init() 함수에서 SDK Config의 brownout detector 설정 여부에 따라 esp_brownout_init() 함수를 호출하게 됩니다.
esp-idf/components/esp_system/port/brownout.c - esp_brownout_init() 함수 내부