Seguem instruções para compilação e transferência de código para placas ESP32 usando um fluxo de trabalho como:
Fluxo adotado:
Sublime Text ↓main.c[com seção final:void app_main(void)] ↓Terminal do macOS ↓idf.py build ↓idf.py flash ↓idf.py monitorAmbiente:
O compilador ESP-IDF espera uma estrutura de arquivos do tipo:
~/Documentos/ESP32/Projeto/├── CMakeLists.txt└── main/ ├── CMakeLists.txt └── main.cO main.c seria o seu código principal.
Você deve gerar os arquivos:CMakeLists.txt e main/CMakeLists.txt.
Obs.: Um projeto já criado e compilado pelo ESP-IDF pode conter ainda a pasta sdkconfig:
~/Documentos/ESP32/Projeto/├── CMakeLists.txt├── sdkconfig└── main/├── CMakeLists.txt└── main.c
Mas o arquivo sdkconfig não é gerado manualmente. Ele é gerado pelo próprio ESP-IDF quando:
Na pasta raiz do projeto:
cd ESP32/Projeto1Com ambiente ESP-IDF carregado (terminal aberto via EIM):
idf.py menuconfigIsso abre a configuração do ESP-IDF.
Depois de sair/salvar, aparecerá:
Projeto1/├── CMakeLists.txt├── sdkconfig└── main/├── CMakeLists.txt└── main.c
O sdkconfig é um arquivo gerado/configurado pelo ESP-IDF e não é recomendável começar digitando seu conteúdo manualmente.
Então…
Então sugere-se (no terminal) fazer algo como:
mkdir -p ~/Documents/ESP32 # criar a pasta ESP32 em Documentos se ainda não existircd ~/Documents/ESP32 # ir até a pastamkdir Projeto1 # criar a pasta associada com novo Projetocd Projeto1mkdir mainIsto gera uma estrutura inicial como:
~/Documents/ESP32/Projeto1/└── main/Na pasta ../Projeto1/:
xxxxxxxxxxtouch CMakeLists.txt # cria arquivo se ele não existeConteúdo:
xxxxxxxxxxcmake_minimum_required(VERSION 3.16)include($ENV{IDF_PATH}/tools/cmake/project.cmake)project(Projeto1)Portanto:
xxxxxxxxxx../Projeto1/├── CMakeLists.txt└── main/
Entre em main:
xxxxxxxxxxcd maintouch CMakeLists.txtPara o nosso projeto com GPIO + DAC + GPTimer, usamos:
xxxxxxxxxxidf_component_register( SRCS "main.c" INCLUDE_DIRS ".")Eventualmente o main/CMakeLists.txt precisa declarar os drivers usados, por exemplo:
xxxxxxxxxxidf_component_register( SRCS "main.c" INCLUDE_DIRS "." REQUIRES esp_driver_dac esp_driver_gptimer esp_driver_gpio)Ainda em main:
xxxxxxxxxxtouch main.cDepois podemos abrir no Sublime Text:
xxxxxxxxxxsubl main.cA estrutura completa passa a ser:
xxxxxxxxxx../Projeto1/├── CMakeLists.txt└── main/├── CMakeLists.txt└── main.c
Depois…
IPORTANTE: Os próximos comandos/estapas já consideram que você esteja usando o terminal com ambiente Python ativado para uso pelo ESP-IDF. Se ainda não o fez, entre no App gráfico EIM e selecione: XXX. Note a opção para ativar o terminal em:
Antes de compilar, devemos informar ao ESP-IDF que nossa placa é o ESP32 clássico:
xxxxxxxxxxidf.py set-target esp32Isso também participa da geração/configuração do sdkconfig.
Depois:
xxxxxxxxxxidf.py menuconfige podemos conferir as configurações.
Obs.: comandos dados à partir da pasta raiz (../Projeto1/) dentro do ambiente ESP-IDF (terminal ativado via EMI). Estes comandos são realizados uma única vez.
Na pasta raiz (../Projeto1/):
xxxxxxxxxxidf.py build
Se tudo estiver correto, será criada a pasta:
xxxxxxxxxxProjeto1/├── CMakeLists.txt├── sdkconfig├── main/│ ├── CMakeLists.txt│ └── main.c└── build/└── ...
No nosso caso, a placa aparecia no macOS como algo semelhante a:
xxxxxxxxxx/dev/cu.usbserial-001Então:
xxxxxxxxxxidf.py -p /dev/cu.usbserial-001 flashou simplesmente:
xxxxxxxxxxidf.py flashse tivermos configurado a porta anteriormente.
Para acompanhar a execução:
xxxxxxxxxxidf.py -p /dev/cu.usbserial-001 monitorUsar a combinação de teclas CTRL/Command+ ] para sair do modo Monitor.
Para fazer build + flash + monitor de uma só vez:
xxxxxxxxxxidf.py -p /dev/cu.usbserial-001 flash monitorUsar a combinação de teclas CTRL/Command+ ] para sair do modo Monitor.
Dentro do abiente (Python) ativado do ESP-IDF e na pasta raiz do Projeto:
xxxxxxxxxxidf.py set-target esp32 # indicar placa alvoidf.py build # compilar o projeto atualidf.py flash # transferir/gravar novo firmwareidf.py monitor # ativar monitor serial 115200 baudsOu simplesmente:
xxxxxxxxxxidf.py build flash monitorCódigo feito para Arduino-IDE contêm as seções:
xxxxxxxxxxvoid setup()void loop()mas programando ESP-IDF “Puro”, teremos apenas:
xxxxxxxxxxvoid app_main(void)A migração pode ainda envolver adaptação de alguns comandos:
| Arduino | ESP-IDF |
|---|---|
| dacWrite (DAC_PIN, Table[Index]); | dac_oneshot_output_voltage ( dac_handler, Table[Index] ); |
| pinMode (BUTTON_PIN, INPUT_PULLUP); | gpio_config_t button_config = { .pin_bit_mask = (1ULL << BUTTON_PIN), .mode = GPIO_MODE_INPUT, .pull_up_en = GPIO_PULLUP_ENABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE }; |
| digitalRead (BUTTON_PIN); | gpio_get_level (BUTTON_PIN); |
| setup (); | app_main ()` |
| loop (); | Não existe; FreeRTOS/timers assumem o controle |
O timer passou para o GPTimer:
xxxxxxxxxxcom funções:
xxxxxxxxxxgptimer_config_tgptimer_new_timer()gptimer_register_event_callbacks()gptimer_set_alarm_action()gptimer_enable()gptimer_start()Se eventualmente forem usados três drivers novos, seu main/CMakeLists.txt precisa declarar dependências associadas aos drivers.
Por exemplo, se o seu arquivo atualmente contiver algo como:
xxxxxxxxxxidf_component_register(SRCS "main.c" INCLUDE_DIRS ".")deve ser modificado para algo como:
xxxxxxxxxxidf_component_register( SRCS "main.c" INCLUDE_DIRS "." REQUIRES esp_driver_dac esp_driver_gptimer esp_driver_gpio)Isso é importante no IDF 6.x porque os drivers foram separados em componentes próprios.
A documentação do GPIO, por exemplo, especifica explicitamente REQUIRES esp_driver_gpio; o mesmo princípio vale para GPTimer e DAC.
ESP-IDF 6.1 Documentação oficial: https://docs.espressif.com/projects/esp-idf/en/v6.1/
Página oficial de releases: https://github.com/espressif/esp-idf/releases A release v6.1 informa a disponibilidade pelo EIM e também pelo Git.
Instalação usando EIM: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/eim-install-idf.html
Guia de instalação/primeiros passos para macOS: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/linux-macos-setup.html
DAC do ESP32 Documentação oficial Arduino-ESP32: https://docs.espressif.com/projects/arduino-esp32/en/latest/api/dac.html
Numa ESP32 DevKit baseada no ESP32 original (WROOM-32), o DAC interno é de 8 bits, e:
xxxxxxxxxxESP32:DAC1 → GPIO25DAC2 → GPIO26Documentação do DAC no ESP-IDF: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/dac.html
No ESP-IDF moderno, você deverá utilizar o driver DAC do ESP-IDF, e não dacWrite().
O ESP-IDF 6.x também separou vários drivers em componentes próprios. A documentação de migração chama atenção justamente para: componentes como esp_driver_dac e esp_driver_gptimer possuem dependências próprias. Ver:
GPTimer: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/gptimer.html
Obs.: No ESP-IDF 6.0, o antigo Timer Group driver foi removido, e o substituto é o GPTimer (driver/gptimer.h). Ver:
GPIO: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/gpio.html
A API GPIO é fornecida pelo componente esp_driver_gpio no IDF 6.x.
FreeRTOS no ESP-IDF: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html
Fernando Passold, em 13/09/2026