19 de setembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Como implementar light sleep no ESP32

light sleep no esp32

O light sleep no ESP32 é uma maneira de reduzir o consumo em situações que exijam funcionamento parcial do hardware, como por exemplo “mantenimento” da conexão WiFi, mas através de beacon WiFi, o que garante uma redução de consumo significativa.

Cada tipo de sleep cabe em uma situação específica, inclusive o light sleep no ESP32. Por exemplo, em casos que precisamos manter o processamento, mas queremos fazer o envio de dados por WiFi algumas poucas vezes ao dia, podemos usar o modem sleep. Já se precisarmos coletar qualquer tipo de informação algumas poucas vezes ao dia (e eventualmente utilizar o WiFi para enviar esses dados), podemos utilizar o deep sleep com ESP32. Já o light sleep mantém um pouco mais de periféricos ligados, mas ainda assim o consumo fica abaixo dos 10mA. O problema é que essa solução pode não ser ideal para conexões estabelecidas, mas se for o caso de manter a conexão constantemente aberta, certamente não é o caso de nenhum modo de sleep. Ainda assim podemos economizar, reduzindo o clock do ESP32 para 80MHz. Veremos a seguir.

Como reduzir o clock do ESP32

O ESP32 pode trabalhar em 80MHz, 160MHz ou 240MHz. O padrão é 240MHz, mas podemos mudar isso facilmente com um mero define. Assim, se o processamento de sua aplicação for baixo, já economiza um pouco mais. E isso pode ser somado a algum modo de sleep também, reduzindo ainda mais o consumo. Usando o light sleep no ESP32 com clock de 80MHz em uma aplicação de teste, o consumo foi menor que 10mA (não pude precisar o quanto porque meu multímetro USB só mede na casa decimal).

Para reduzir o clock, utilize:

/*
80 MHz (ESP32_DEFAULT_CPU_FREQ_80)
160 MHz (ESP32_DEFAULT_CPU_FREQ_160)
240 MHz (ESP32_DEFAULT_CPU_FREQ_240)
*/
#define CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ ESP32_DEFAULT_CPU_FREQ_80

Já deixei as opções comentadas acima da definição para facilitar.

Light sleep no ESP32

Os detalhes de todos os modos de sleep podem ser vistos no artigo “4 sleep modes no ESP32“. A leitura pode ser fundamental para auxiliar na escolha do modo correto para seu projeto.

Para o light sleep, tudo o que precisa ser feito é definir o wakeup, então iniciar o light sleep. Repare que o print está seguido da chamada do sleep:

esp_sleep_enable_timer_wakeup(1000000); //1 second
int ret = esp_light_sleep_start();
Serial.printf("lp: %d\n", ret);

Se tiver outras tarefas, elas rodarão de forma assíncrona e será necessário controlá-las. Esse controle deve ser bem planejado, mas implemente e teste o comportamento, analisando o funcionamento em sua aplicação.

Uma outra coisa importantíssima a considerar é que não devemos prender o processamento. Se ocorrerem WDT, será necessário procurar por lugares que estejam prendendo o processamento, como delays e processos de bibliotecas inclusas no projeto.

Mais detalhes, na documentação oficial da Espressif.

Revisão: Ricardo Amaral de Andrade