Acorde por Temporizador ou Temporizador

Tempo de leitura: 2 minutes

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 ArquivoESP32Deep SleepTimerWakeUp.

 

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.