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