Manual
do
Maker
.
com
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.
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.
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
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.