Acorde por Temporizador ou Temporizador
Material Necessário
Um ESP32 de qualquer tipo.
Testasndo o Temporizador para Despertar o ESP32
A primeira maneira de acordar o módulo que vamos ver é usar o timer que o módulo ESP32 RTC possui. Este método será útil quando quisermos realizar determinadas tarefas periodicamente. Poderíamos, por exemplo, acordar a cada hora, ler a temperatura e enviá-la para um servidor e depois voltar a dormir para economizar bateria.
esp_sleep_enable_timer_wakeup(tempo em microssegundos);
Para ter uma ideia de como funciona, vamos abrir o exemplo que contém a biblioteca. Você pode encontrá-lo em Arquivo → ESP32 → Deep Sleep → TimerWakeUp.
O que este programa faz é contar o número de vezes que o ESP32 acordou e nos mostrar na porta serial, junto com o motivo pelo qual ele acordou. Neste caso será sempre por temporizador.
Após os comentários, as duas primeiras definições que encontramos são estas:
#define uS_TO_S_FACTOR 1000000 /* Fator de conversão de microssegundos para segundos */ #define TIME_TO_SLEEP 5 /* Tempo que o ESP32 vai dormir (em segundos) */
O primeiro é simplesmente um fator de conversão, para que possamos indicar no segundo o intervalo de tempo em segundos que queremos usar para acordar o ESP32. Na verdade não temos que fazer assim, poderíamos colocar o tempo diretamente em microssegundos, mas como regra geral, estamos mais acostumados a pensar em segundos.
Logo em seguida temos uma função onde basicamente temos um switch case onde mostramos no monitor serial o motivo pelo qual o ESP32 acordou.
void print_wakeup_reason(){ esp_sleep_wakeup_cause_t wakeup_reason; wakeup_reason = esp_sleep_get_wakeup_cause(); switch(wakeup_reason) { case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Despertar causado por sinal externo usando RTC_IO"); break; case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Despertar causado por sinal externo usando RTC_CNTL"); break; case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Despertar causado pelo temporizador"); break; case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Despertar causado pelo touchpad"); break; case ESP_SLEEP_WAKEUP_ULP : Serial.println("Despertar causado pelo programa ULP"); break; default : Serial.printf("O despertar não foi causado pelo sono profundo: %d\n",wakeup_reason); break; } }
Então temos o setup(), onde ficará todo o corpo do programa. A primeira coisa que faz é definir a velocidade da porta serial para 115200 bauds. Em seguida, ele adiciona um à variável bootCount e exibe no monitor serial o número de vezes que acordou e o motivo pelo qual acordou dessa vez.
Serial.begin(115200); delay(1000); //Reserve algum tempo para abrir o Serial Monitor //Incremente o número de inicialização e imprima-o a cada reinicialização ++bootCount; Serial.println("Boot number: " + String(bootCount)); //Imprima o motivo de ativação do ESP32 print_wakeup_reason();
E uma vez feito tudo o que precisamos, temos que indicar o método para acordar, neste caso o temporizador e o intervalo que queremos usar, e enviá-lo para dormir novamente.
/* Primeiro, configuramos a fonte de ativação Configuramos nosso ESP32 para acordar a cada 5 segundos */ esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); Serial.println("Configure o ESP32 para dormir a cada" + String(TIME_TO_SLEEP) + " Segundos"); Serial.println("Indo dormir agora"); Serial.flush(); esp_deep_sleep_start(); Serial.println("Isso nunca será impresso");
Bem, agora você pode carregá-lo e abrir o monitor serial para ver como ele funciona, certificando-se de que a velocidade esteja em 115.200 bauds. Como você pode ver, estamos executando o programa há algum tempo e ele já foi ativado 434 vezes.