Material requerido
Un módulo ESP32 |
Probando el temporizador para despertar el ESP32
La primera forma de despertar el módulo que vamos a ver es usar el temporizador o timer que tiene el módulo RTC del ESP32. Este método nos va a resultar útil cuando queramos hacer ciertas tareas de forma periódica. Podríamos, por ejemplo, despertar cada hora, leer la temperatura y subirla a un servidor y entonces volver a dormirlo para ahorrar batería.
esp_sleep_enable_timer_wakeup(tiempo en microsegundos);
Para hacernos una idea de cómo funciona vamos a abrir el ejemplo que contiene la librería. Lo podéis encontrar en Archivo → ESP32 → Deep Sleep → TimerWakeUp.
Lo que hace este programa es contar el número de veces que ha despertado el ESP32 y mostrárnoslo en el puerto serie, junto con la razón por la que ha despertado. En este caso será siempre por temporizador.
Después de los comentarios, las dos primeras definiciones que encontramos son estas:
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 5 /* Time ESP32 will go to sleep (in seconds) */
La primera es simplemente un factor de conversión, para que podamos indicarle en la segunda de ellas el intervalo de tiempo en segundos que queremos usar para despertar al ESP32. En realidad no tenemos por qué hacerlo así, podríamos meter directamente el tiempo en microsegundos, pero por regla general, estamos más acostumbrados a pensar en segundos.
Inmediatamente después tenemos una función en la que básicamente tenemos un switch case en el que mostramos en el monitor serie la razón por la que ha despertado el ESP32.
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("Wakeup caused by external signal using RTC_IO"); break; case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break; case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break; case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break; case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break; default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break; } }
Después tenemos el setup(), donde estará todo el cuerpo del programa. Lo primero que hace es fijar la velocidad del puerto serie a 115200 baudios. Después suma uno a la variable bootCount y muestra en el monitor serie el número de veces que ha despertado y la razón porque lo ha hecho esta vez.
Serial.begin(115200); delay(1000); //Take some time to open up the Serial Monitor //Increment boot number and print it every reboot ++bootCount; Serial.println("Boot number: " + String(bootCount)); //Print the wakeup reason for ESP32 print_wakeup_reason();
Y una vez hecho todo lo que necesitamos, tenemos que indicarle el método para despertarse, en este caso temporizador y el intervalo que queremos usar, y mandarlo a dormir de nuevo.
/* First we configure the wake up source We set our ESP32 to wake up every 5 seconds */ esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds"); Serial.println("Going to sleep now"); Serial.flush(); esp_deep_sleep_start(); Serial.println("This will never be printed");
Bueno, pues ya podéis subirlo y abrir el monitor serie para comprobar cómo funciona., fijándoos en que la velocidad esté a 115.200 baudios. Como veis, nosotros llevamos un rato con él programa corriendo y lleva ya 434 despertares.