Neste tutorial, veremos como programar um ESP32 usando o ambiente ESP-IDF com VSCode. O ESP-IDF, ou Espressif IoT Development Framework, é o ambiente de programação oficial para ESP32s e permite que aplicações de alta qualidade sejam programadas em C e C++.
ESP-IDF vs ESP Arduino Core
Em um artigo anterior, vimos como programar um ESP32 NodeMCU usando o IDE Arduino. O ambiente Arduino ESP foi desenvolvido para simplificar a programação do ESP32. Permite que os principiantes e amadores que já são utilizadores do Arduino utilizem as mesmas ferramentas para desenvolver projectos baseados no ESP32. No entanto, é preciso lembrar que o IDE Arduino utiliza uma versão simplificada e incompleta da linguagem C\.
O ambiente ESP-IDF é totalmente compatível com as normas C\.
- Gestão de Wifi e Bluetooth
- Programação OTA
- Função de tempo real com o FreeRTOS
- Gestão dos sensores e protocolos de comunicação mais comuns
O ESP-IDF também é compatível com todas as versões dos microcontroladores ESP32.
Instalar e configurar o VSCode
Descarregar e instalar o VSCode
Encontre e instale a extensão ESP-IDF para VSCode, que contém bibliotecas e configuração básica para programar o ESP32.

Uma vez instalada a extensão, pode configurá-la utilizando a paleta de comandos. No menu, Ver>Paleta de comandos…, procure “ESP-IDF Configurar”. Selecione a versão do ESP-IDF a instalar. A configuração instala os seguintes módulos:
- ESP-IDF
- Ferramentas ESP-IDF
- Python venv para ESP-IDF

Configuração de um projeto para o ESP32
Para carregar o seu primeiro código, pode utilizar o exemplo do Blink
Selecione View -> Command Palette… e introduza ESP-IDF: Show Examples Projects. Na página que se abre, localize e prima o botão Mostrar exemplos. Ser-lhe-á então pedido que selecione a estrutura previamente instalada.
Na lista de exemplos, pode então selecionar o Blink e premir o botão “Criar projeto utilizando o exemplo Blink”.

Também é possível criar um novo projeto. ESP-IDF: Novo projeto . Em seguida, selecionar Extensões>template-app para um projeto em branco. O ficheiro principal pode ser encontrado em myproject/main/main.c
N.B.: com o templae arduino-as-a-component, é possível escrever com a linguagem Arduino no quadro ESP-IDF.

Aqui está um exemplo Hello world, para testar a configuração do projeto.
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" static const char *TAG = "myproject example"; void app_main(void) { while (1) { ESP_LOGI(TAG, "Hello World!"); vTaskDelay(1000 / portTICK_PERIOD_MS); } }
Quando os ficheiros de projeto são editados, pode seguir estes passos para configurar o projeto
- selecionar o tipo de cartão ESP-IDF: Set Espressif device target
- select ESP-IDF serial port: Selecionar a porta a utilizar (COM, tty, usbserial)
Para selecionar o tipo e o cartão utilizados. Na paleta de comandos, introduzir Set Espressif device target. No nosso caso, ESP32-WROOM-32, esp32 e depois o chip ESP32 (através da ponte USB ESP).
N.B.: uma vez selecionado o cartão, pode utilizar as bibliotecas de base
Selecionar a porta série através do comando ESP-IDF: Selecionar a porta a utilizar (COM, tty, usbserial)
Compilar e carregar código para um ESP32
Depois de o projeto ter sido configurado e o código criado, seguiremos uma série de passos para carregar o código para a placa ESP32:
- compilar o projeto ESP-IDF: Compilar o projeto
- carregar o código ESP-IDF: Flash do seu projeto
- queimar o código ESP-IDF: monitorizar o seu dispositivo
Os últimos 3 comandos podem ser combinados com o ESP-IDF: Construir, flashear e iniciar um Monitor no seu dispositivo
Agora que o ambiente de programação está pronto, pode compilar o programa. Na paleta Command, procure o ESP-IDF: Compilar o projeto.

Para passar o programa para a placa, verifique a porta série selecionada e passe o código ESP-IDF: passe o seu projeto. No nosso caso, a programação é feita através da porta USB, pelo que estamos a utilizar o modo UART.
Uma vez carregado o código, pode observar a saída na porta série utilizando o monitor do ESP-IDF: Monitorizar o dispositivo

Adicionar bibliotecas ao seu código
Existem algumas bibliotecas na estrutura do ESP-IDF. Para encontrar os componentes disponíveis, introduza ESP-IDF: Show Component Registry na paleta de comandos.

Depois de encontrar o seu componente, pode adicioná-lo ao seu projeto utilizando o botão “instalar” ou a linha de comandos
idf.py add-dependency "espressif/button^3.2.0"
Nota: uma vez instalado o componente, é possível aceder a um exemplo em managed_components>espressif_button> examples
Pode então desenvolver o seu próprio código utilizando o
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" #include "iot_button.h" #define BOOT_BUTTON_NUM 0 // boot button attached to GPIO0 #define BUTTON_ACTIVE_LEVEL 0 static const char *TAG = "myproject example"; int8_t btn_status=0; const char *button_event_table[] = { "BUTTON_PRESS_DOWN", "BUTTON_PRESS_UP", "BUTTON_PRESS_REPEAT", "BUTTON_PRESS_REPEAT_DONE", "BUTTON_SINGLE_CLICK", "BUTTON_DOUBLE_CLICK", "BUTTON_MULTIPLE_CLICK", "BUTTON_LONG_PRESS_START", "BUTTON_LONG_PRESS_HOLD", "BUTTON_LONG_PRESS_UP", }; static void button_event_cb(void *arg, void *data) { ESP_LOGI(TAG, "Button event %s (%d)", button_event_table[(button_event_t)data],(button_event_t)data); switch ((button_event_t)data){ case 4: ESP_LOGI(TAG, "Execute code if single click"); break; case 5: ESP_LOGI(TAG, "Execute code if double click"); break; default: //nothing } } void button_init(uint32_t button_num) { button_config_t btn_cfg = { .type = BUTTON_TYPE_GPIO, //.long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, //.short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, .gpio_button_config = { .gpio_num = button_num, .active_level = BUTTON_ACTIVE_LEVEL, #if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE .enable_power_save = true, #endif }, }; button_handle_t btn = iot_button_create(&btn_cfg); assert(btn); esp_err_t err = iot_button_register_cb(btn, BUTTON_PRESS_DOWN, button_event_cb, (void *)BUTTON_PRESS_DOWN); err |= iot_button_register_cb(btn, BUTTON_PRESS_UP, button_event_cb, (void *)BUTTON_PRESS_UP); err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT, button_event_cb, (void *)BUTTON_PRESS_REPEAT); err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT_DONE, button_event_cb, (void *)BUTTON_PRESS_REPEAT_DONE); err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_SINGLE_CLICK); err |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, button_event_cb, (void *)BUTTON_DOUBLE_CLICK); err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_START, button_event_cb, (void *)BUTTON_LONG_PRESS_START); err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, button_event_cb, (void *)BUTTON_LONG_PRESS_HOLD); err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_UP, button_event_cb, (void *)BUTTON_LONG_PRESS_UP); ESP_ERROR_CHECK(err); } void app_main(void) { button_init(BOOT_BUTTON_NUM); }
Durante a execução do código, se premir o botão de arranque uma ou duas vezes para ver o código específico apresentado
I (341) main_task: Returned from app_main() I (3611) myproject example: Button event BUTTON_PRESS_DOWN (0) I (3821) myproject example: Button event BUTTON_PRESS_UP (1) I (4011) myproject example: Button event BUTTON_SINGLE_CLICK (4) I (4011) myproject example: Execute code if single click I (4011) myproject example: Button event BUTTON_PRESS_REPEAT_DONE (3) I (12231) myproject example: Button event BUTTON_PRESS_DOWN (0) I (12371) myproject example: Button event BUTTON_PRESS_UP (1) I (12461) myproject example: Button event BUTTON_PRESS_DOWN (0) I (12461) myproject example: Button event BUTTON_PRESS_REPEAT (2) I (12601) myproject example: Button event BUTTON_PRESS_UP (1) I (12781) myproject example: Button event BUTTON_DOUBLE_CLICK (5) I (12781) myproject example: Execute code if double click I (12781) myproject example: Button event BUTTON_PRESS_REPEAT_DONE (3) I (14051) myproject example: Button event BUTTON_PRESS_DOWN (0) I (14171) myproject example: Button event BUTTON_PRESS_UP (1) I (14261) myproject example: Button event BUTTON_PRESS_DOWN (0)
Pode criar as suas próprias bibliotecas utilizando o comando ESP-IDF: Create New ESP-IDF component. Isto criará uma pasta de componentes
Fontes
- ESP-IDF Github
- ESP-IDF Guia de programação
- VSCode ESP-IDF Github Extension
- ESP-IDF lib Github
- Programar um ESP32 com o Arduino
- Programar um ESP32 com VSCode