ESP32 Reference
ESP32 IoT 마이크로컨트롤러 레퍼런스
ESP32 Reference 소개
ESP32 레퍼런스는 Espressif의 ESP-IDF 프레임워크를 사용하는 ESP32 마이크로컨트롤러 펌웨어 개발자를 위한 실용적인 치트 시트입니다. 프로덕션 IoT 펌웨어에서 사용되는 8가지 핵심 API 범주를 다룹니다: GPIO 설정 및 인터럽트 처리, WiFi STA/AP 모드, BLE 광고 및 GATT 서버, ADC 샘플링과 보정, 하드웨어 타이머 및 딥슬립, SPI/I2C 버스 초기화, ESP-IDF 빌드 툴체인 및 FreeRTOS 기본 요소.
이 레퍼런스는 ESP32로 연결 디바이스를 개발하는 IoT 펌웨어 엔지니어, 임베디드 시스템 개발자, 메이커, 전자공학 학생이 활용합니다. 각 항목은 gpio_config(), spi_bus_initialize(), xTaskCreate() 등의 정확한 C 함수 호출과 구조체 초기화 패턴을 실제 코드 스니펫과 함께 보여주어, 공식 문서를 검색하지 않고도 바로 사용할 수 있는 시작점을 제공합니다.
레퍼런스는 8가지 카테고리로 구성됩니다: GPIO(방향, 레벨, config 구조체, ISR 핸들러), WiFi(STA 모드, AP 모드, HTTP 서버/클라이언트), BLE(GAP 광고, GATT 서버, 스캔, NimBLE 스택), ADC(raw 읽기, esp_adc_cal 보정, DAC 출력, LEDC PWM), 타이머(esp_timer, gptimer, vTaskDelay, 워치독, 딥슬립), SPI(버스 초기화, 전송), I2C(마스터 초기화, 읽기/쓰기), ESP-IDF(idf.py CLI, NVS, SPIFFS, OTA, 로깅, FreeRTOS 태스크/큐, MQTT).
주요 기능
- gpio_config_t 구조체로 핀 마스크, 모드, 풀업/다운, 인터럽트 타입 설정
- esp_wifi_set_config와 인증 모드 옵션을 이용한 WiFi STA/AP 모드 설정
- BLE GAP 광고, GATT 서버 등록, BLE 스캔, notify/indicate API
- esp_adc_cal 전압 보정과 DAC 출력을 포함한 12비트 ADC raw 읽기
- LED 디밍 및 모터 제어를 위한 사용자 정의 주파수의 LEDC PWM 타이머 설정
- DMA를 사용한 SPI 버스 초기화 및 주변기기 I2C 마스터 읽기/쓰기
- FreeRTOS 태스크 생성, 큐 메시지, 워치독 타이머 리셋 패턴
- NVS 키-값 저장소, SPIFFS 파일 시스템 마운트, HTTPS OTA 펌웨어 업데이트
자주 묻는 질문
ESP-IDF와 Arduino ESP32의 차이는 무엇인가요?
ESP-IDF(Espressif IoT Development Framework)는 ESP32 공식 네이티브 SDK로, 모든 하드웨어 주변기기, FreeRTOS, 보안 부팅, 플래시 암호화 같은 고급 기능에 완전히 접근할 수 있습니다. Arduino-ESP32는 익숙한 Arduino API로 ESP-IDF를 감싼 호환성 레이어입니다. ESP-IDF는 더 많은 제어와 성능을 제공하지만 더 많은 보일러플레이트가 필요합니다. 프로덕션 펌웨어에는 ESP-IDF를, 빠른 프로토타이핑에는 Arduino를 사용하세요.
ESP32에서 GPIO 핀을 풀업 입력으로 설정하는 방법은?
gpio_config_t 구조체를 사용하여 mode를 GPIO_MODE_INPUT으로, pull_up_en을 GPIO_PULLUP_ENABLE로, pull_down_en을 GPIO_PULLDOWN_DISABLE로 설정하고 pin_bit_mask를 (1ULL << GPIO_NUM_X)로 설정합니다. gpio_config(&io_conf)를 호출하여 설정을 적용합니다. 인터럽트 기반 입력의 경우 intr_type을 GPIO_INTR_POSEDGE 또는 GPIO_INTR_NEGEDGE로 설정하고 gpio_isr_handler_add()로 핸들러를 등록하세요.
ESP32를 WiFi STA 모드로 연결하는 방법은?
esp_netif_init()으로 네트워크 인터페이스를 초기화하고 기본 WiFi STA netif를 생성합니다. wifi_config_t 구조체에 ssid와 password를 채운 후 esp_wifi_set_mode(WIFI_MODE_STA), esp_wifi_set_config(), esp_wifi_start(), esp_wifi_connect()를 순서대로 호출합니다. IP 주소를 얻었을 때는 이벤트 루프에서 WIFI_EVENT_STA_GOT_IP 이벤트를 수신하여 확인합니다.
esp_timer와 gptimer의 차이는 무엇인가요?
esp_timer는 하드웨어 타이머 위에 구축된 소프트웨어 타이머로, 마이크로초 해상도의 원샷 또는 주기적 콜백을 위해 설계되었습니다. 애플리케이션 수준 타이밍에 사용하기 쉽습니다. gptimer는 ESP-IDF v5에서 도입된 저수준 하드웨어 범용 타이머 API로, 타이머 카운트 방향, 알람 이벤트, 캡처 기능을 직접 제어합니다. 대부분의 애플리케이션 코드에는 esp_timer를, 정밀한 하드웨어 수준 타이밍이 필요할 때는 gptimer를 사용하세요.
ESP32 딥슬립으로 전력 소비를 줄이는 방법은?
esp_sleep_enable_timer_wakeup(us)로 웨이크업 타이머를 설정하거나 esp_sleep_enable_ext0_wakeup()으로 GPIO 웨이크업을 사용합니다. 그런 다음 esp_deep_sleep_start()를 호출하여 즉시 딥슬립에 진입합니다. 딥슬립 상태에서 칩은 약 10µA를 소비합니다. 웨이크업 시 app_main()에서 다시 실행이 시작됩니다. 딥슬립 사이클에서 변수를 유지하려면 RTC 메모리(RTC_DATA_ATTR)를 사용하세요.
ESP32에서 NVS(비휘발성 저장소)는 어떻게 작동하나요?
NVS는 전용 플래시 파티션에 키-값 쌍을 저장합니다. nvs_open()으로 네임스페이스를 열고, nvs_set_i32/str/blob()으로 값을 쓰고, nvs_get_i32/str/blob()으로 값을 읽습니다. 변경 사항을 영구 저장하려면 항상 쓰기 후 nvs_commit()을 호출하세요. NVS는 자동으로 웨어 레벨링을 처리합니다. WiFi 자격 증명, 설정 파라미터, 전원 손실 후에도 유지되어야 하는 카운터 저장에 이상적입니다.
ESP32에서 클래식 블루투스와 BLE의 차이는 무엇인가요?
ESP32는 A2DP, SPP 같은 오디오 프로파일을 위한 클래식 블루투스(BR/EDR)와 저전력 센서 및 IoT 애플리케이션을 위한 BLE(Bluetooth Low Energy) 모두를 지원합니다. BLE는 기기 광고 및 검색에 GAP 레이어를, 서비스와 특성 정의에 GATT 레이어를 사용합니다. ESP32 BLE 스택은 기본 Bluedroid 스택과 메모리를 훨씬 적게 사용하는 NimBLE 스택 두 가지 구현을 지원합니다.
ESP32에서 OTA 펌웨어 업데이트를 수행하는 방법은?
HTTPS 펌웨어 바이너리 URL을 가리키는 esp_http_client_config_t와 함께 esp_https_ota() 함수를 사용합니다. ESP-IDF가 펌웨어 다운로드, 비활성 OTA 파티션에 쓰기, 해시 검증, 새 파티션을 부팅 가능으로 표시하는 모든 과정을 처리합니다. 다음 재시작 시 부트로더가 새 펌웨어로 전환합니다. 실패 시 롤백을 활성화하려면 파티션 테이블에 두 개의 OTA 앱 파티션(factory, ota_0, ota_1)을 구성하세요.
ESP-IDF에서 MQTT를 사용하는 방법은?
브로커 URI(예: mqtt://broker.example.com 또는 TLS의 경우 mqtts://)를 포함한 esp_mqtt_client_config_t 구조체를 초기화합니다. esp_mqtt_client_init()으로 핸들을 얻고 esp_mqtt_client_start()로 연결합니다. MQTT_EVENT_CONNECTED 이벤트 핸들러를 등록하여 토픽을 구독하고 MQTT_EVENT_DATA로 메시지를 수신합니다. esp_mqtt_client_publish()로 메시지를 보내고 esp_mqtt_client_subscribe()로 토픽을 구독합니다.