ESP32

Análise de sistema no ESP32

Tudo vai bem quando está bem. Mas algumas vezes estamos desenvolvendo e nos deparamos com um problema, seja um reset, um dispositivo I2C não encontrado, comunicação na rede etc. O intuito desse artigo é ajudar a descobrir a origem desses problemas.

ESP32 reset reason



Apesar de um reset mostrar a razão ao início do boot, a mensagem não é tão clara. Nos exemplos para ESP32 tem um sketch para deixar a mensagem clara (e foi desenvolvido por um brasileiro do Paraná). O nome do sketch é ResetReason e contém o seguinte código:

Com esse sketch, o ESP32 fará deep sleep por 5 segundos para que seja possível ler o código de erro. Basta implementar esse exemplo junto a seu código e no setup,  iniciar a serial e em seguida chamar a porção de código acima. Mesmo que haja outras definições no setup, essa deve ser a primeira, porque a razão de reset pode ser justamente suas próprias implementações.

Informações sobre o WiFi

Para obter informações sobre o WiFi, podemos usar pequenas porções de código utilizando os recursos do ESP-IDF. Para configurar uma conexão WiFi no ESP32 já utilizei algumas vezes o código descrito em seguida.

Conectar a uma rede

Os modos configuráveis do WiFi são:

  • WIFI_MODE_STA
  • WIFI_MODE_AP
  • WIFI_MODE_APSTA

Basta passar uma dessas definições na linha:

Código de erros

Para saber o estado da conexão, utilize (por exemplo) a função :

Depois, basta testar o código de retorno:

Os códigos de retorno são:

ESP_OK sem problemas
ESP_ERR_WIFI_FAIL erros internos do WiFi
ESP_ERR_WIFI_NOT_INIT faltou inicializar pelo esp_wifi_init
ESP_ERR_WIFI_ARG argumento inválido
ESP_ERR_WIFI_NO_MEM erro de memória (faltou recurso para alocar?)
ESP_ERR_WIFI_CONN  não conseguiu fazer bloking do modo STA ou AP

Listar redes disponíveis

E quando não é possível conectar a uma rede, suponhamos, por sinal ruim? Analisar o alcance é uma ótima opção para quando não se está conseguindo conectar a uma rede. Temos um scanner pronto pra isso, mas foi escrito nativamente para o ESP-IDF. Com pouca modificação, temos o seguinte:

Se isso causar reset, simplesmente crie uma task (veja no menu ESP32 como criar tasks) e executá-la no núcleo 0. O scan retorna algo nesse formato:

Nunca usei com os prints, mas eu prefiro diretamente trocar para a serial. Para configurar a UART no ESP32, você pode seguir esse tutorial.

O projeto nativo para ESP-IDF está no github, através desse link.

Exiba as suas credenciais

E pra finalizar, criar uma condicional para exibir suas credenciais de acesso à rede pode ser uma boa ideia. às vezes um erro de digitação pode passar despercebido. Lendo da UART, considere um comando como “cred” que devolva as informações:

Sistema de arquivos

Como está a tabela de partições do seu ESP32? Está compilando pela IDE do Arduino? Pelo CodeBlocks? Então provavelmente não deve saber responder se a tabela de partições está configurada com suporte a OTA, certo?

Quando compilando pela IDE do Arduino, todo o resultado da compilação é gerado em /tmp (para Linux, não sei pra Windows, sorry). O nome do diretório com o conteúdo da compilação deve ser sempre prefixado com arduino_build_ e sufixado com um valor numérico. Compilei o exemplo do ResetReason para poder mostrar o conteúdo:

Tem sempre mais de uma maneira de obter informações sobre quase qualquer coisa. Se quiser fazer da maneira mais preguiçosa possível, simplesmente execute o comando strings  sobre o arquivo de tabela de partições gerado:

Isso deve retornar algo como:

Se você tiver o ESP-IDF (já discorri a respeito nesse artigo), encontrará dentro do diretório esp-idf/components/partition_table/ um programa em Python para gerar o binário, o CSV, e exibir informações sobre uma tabela de partições. Para ver o conteúdo da tabela gerada:

Se a tabela de partições não estiver como pretendido, sugiro dar uma olhada nesse artigo.

Verificar recursos do sistema

No ESP32 temos um sistema operacional de tempo real e claro, temos uma montanha de recursos. Vamos ver alguns deles.

Tamanho da pilha

Para pegar a memória livre do sistema, podemos utilizar o recurso esp_get_free_heap_size(). Ex:

Que deve exibir algo assim na serial:

O ESP32 tem 520KiB de memória SRAM. Com isso você conseguirá ver a alocação de recursos necessária pelo seu programa, mas melhor que isso, poderá descobrir leak de memória, se os recursos forem se esgotando (claro, sem que realmente haja alocação intencional de recursos).


As informações de compilação são muito úteis também. Repare na IDE do Arduino, utilizando apenas Ctrl+R você obterá apenas as mensagens de compilação, que lhe mostrarão informações importantes como uso da flashuso por variáveis globais,e espaço livre para variáveis locais.

Onde uma tarefa está sendo executada?

Já discorri a respeito nesse outro artigo. Podemos descobrir em que núcleo uma tarefa está sendo executada utilizando a função xPortGetCoreID() dentro da tarefa. As funções loop() setup() são executadas no núcleo 1, mas mesmo sabendo disso, serve como exemplo:

Listar tarefas com vTaskList

Essa função é exclusivamente para debugging, porque ela desabilita as interrupções do sistema quando em execução. A vTaskList utiliza um ponteiro para um array de char que alocará as informações sobre o estado de uma tarefa, que pode conter os estados blockedreadydeletedsuspended. Outra informações que retornam além do estado são a prioridadestacknúmero da tarefa.

B blocked
R Ready
D Deleted
S Suspended ou bloqueado sem um timeout

O formato da função:

Um exemplo da utilização:

Cada tarefa ocupa uns 40 Bytes. O valor do array deve ser ajustado conforme achar devido.

Vou fazer com esse artigo o mesmo que faço com esse outro sobre Raspberry. Cada vez que eu lembrar ou aprender novos recursos, vou incrementando o artigo.

Não tem um ESP32 ainda?

Caramba, se não tiver um ESP32 depois de 26 artigos escritos aqui no site, você realmente não tem ambição.

A imagem de destaque é da placa de desenvolvimento para ESP32, ela é fantástica, mas tem outros modelos de ESP32 que você encontra na CurtoCircuito através desse link. Inclusive sugiro que, se quiser economizar muito, pegue a WROOM, que está com uma promoção incrível!

Espero que tenha sido uma leitura agradável.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!