En este tutorial, veremos cómo programar un ESP32 utilizando el entorno ESP-IDF con VSCode. ESP-IDF, o Espressif IoT Development Framework, es el entorno de programación oficial para los ESP32 y permite programar aplicaciones de alta calidad en C y C++.
ESP-IDF vs ESP Arduino Core
En un artículo anterior, vimos cómo programar un ESP32 NodeMCU utilizando el IDE Arduino. El entorno ESP Arduino ha sido desarrollado para simplificar la programación de ESP32. Permite a los principiantes y aficionados que ya son usuarios de Arduino utilizar las mismas herramientas para desarrollar proyectos basados en ESP32s. Sin embargo, hay que recordar que el IDE Arduino utiliza una versión simplificada e incompleta del lenguaje C\.
El entorno ESP-IDF es totalmente compatible con las normas C\.
- Gestión de Wifi y Bluetooth
- Programación OTA
- Función en tiempo real con FreeRTOS
- Gestión de los sensores y protocolos de comunicación más habituales
ESP-IDF también es compatible con todas las versiones de microcontroladores ESP32.
Instalación y configuración de VSCode
Descargar e instalar VSCode
Busque e instale la extensión ESP-IDF para VSCode, que contiene bibliotecas y configuración básica para programar ESP32.

Una vez instalada la extensión, puede configurarla utilizando la paleta de comandos. En el menú, Ver>Paleta de comandos…, busque «Configurar ESP-IDF». Seleccione la versión de ESP-IDF que desea instalar. La configuración instalará los siguientes módulos:
- ESP-IDF
- Herramientas ESP-IDF
- Python venv para ESP-IDF

Configurar un proyecto para ESP32
Para cargar su primer código, puede utilizar el ejemplo Blink
Seleccione Ver -> Paleta de comandos… e introduzca ESP-IDF: Mostrar proyectos de ejemplo. En la página que se abre, busque y pulse el botón Mostrar Ejemplos. A continuación, se le pedirá que seleccione el framework instalado previamente.
En la lista de ejemplos, puede seleccionar Blink y pulsar el botón «Crear proyecto utilizando el ejemplo Blink».

También puede crear un nuevo proyecto. ESP-IDF: Nuevo proyecto . A continuación, seleccione Extensiones>template-app para un proyecto en blanco. El archivo principal se encuentra en myproject/main/main.c
N.B.: con las plantillas arduino-como-componente, puede escribir con el lenguaje Arduino en el marco ESP-IDF.

He aquí un ejemplo de Hello world, para probar la configuración del proyecto.
#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); } }
Una vez editados los archivos del proyecto, puede seguir estos pasos para configurarlo
- seleccionar el tipo de tarjeta ESP-IDF: Establecer el destino del dispositivo Espressif
- select ESP-IDF serial port: Seleccione el puerto a utilizar (COM, tty, usbserial)
Para seleccionar el tipo y la tarjeta utilizados. En la paleta de comandos, introduzca Set Espressif dispositivo de destino. En nuestro caso, ESP32-WROOM-32, esp32 entonces ESP32 chip (a través de ESP puente USB).
Nota: una vez seleccionada la tarjeta, puede utilizar las bibliotecas básicas
Seleccione el puerto serie utilizando el comando ESP-IDF: Seleccione el puerto a utilizar (COM, tty, usbserial)
Compilar y cargar código en un ESP32
Una vez configurado el proyecto y creado el código, seguiremos una serie de pasos para subir el código a la tarjeta ESP32:
- compile el proyecto ESP-IDF: Compile su proyecto
- cargue el código ESP-IDF: Flash de su proyecto
- quemar el código ESP-IDF: supervise su dispositivo
Los 3 últimos comandos se pueden combinar con ESP-IDF: Construir, Flashear e iniciar un Monitor en tu dispositivo
Ahora que el entorno de programación está listo, puede compilar el programa. En la Paleta de comandos, busque ESP-IDF: Compila tu proyecto.

Para flashear el programa en la tarjeta, comprueba el puerto serie seleccionado y luego flashea el código ESP-IDF: Flashea tu proyecto. En nuestro caso, la programación se realiza a través del puerto USB, por lo que estamos utilizando el modo UART.
Una vez cargado el código, puede observar la salida en el puerto serie utilizando el monitor ESP-IDF: Monitorice su dispositivo

Añadir bibliotecas al código
Algunas bibliotecas existen en el marco ESP-IDF, para encontrar los componentes disponibles puede entrar en ESP-IDF: Mostrar Registro de Componentes en la Paleta de Comandos.

Una vez que haya encontrado su componente, puede añadirlo a su proyecto utilizando el botón «instalar» o la línea de comandos
idf.py add-dependency "espressif/button^3.2.0"
Nota: una vez instalado el componente, puede acceder a un ejemplo en managed_components>espressif_button> examples
A continuación, puede desarrollar su propio código utilizando el
#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); }
Al ejecutar el código, si pulsa el botón de arranque una o dos veces para ver el código específico que se muestra
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)
Puede crear sus propias bibliotecas utilizando el comando ESP-IDF: Crear nuevo componente ESP-IDF. Esto creará una carpeta de componentes
Fuentes
- ESP-IDF Github
- ESP-IDF Guía de programación
- Extensión VSCode ESP-IDF Github
- ESP-IDF lib Github
- Programar un ESP32 con Arduino
- Programar un ESP32 con VSCode