fbpixel
Etiquetas: ,

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.

vscode-esp-idf-extension Programar um ESP32 com VSCode e ESP-IDF

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
vscode-esp-idf-extension-configuration Programar um ESP32 com VSCode e 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”.

vscode-esp-idf-examples Programar um ESP32 com VSCode e ESP-IDF

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.

vscode-esp-idf-new-projectPNG Programar um ESP32 com VSCode e 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.

vscode-esp-idf-compile Programar um ESP32 com VSCode e ESP-IDF

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

vscode-esp-idf-monitor Programar um ESP32 com VSCode e ESP-IDF

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.

vscode-esp-idf-component Programar um ESP32 com VSCode e ESP-IDF

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