Aquí discutiremos cómo podemos configurar ESP32 en modo de suspensión profunda en un momento fijo para guardar energía. Antes de aprender a despertar ESP32 del sueño profundo usando un temporizador, comprendamos el concepto de sueño profundo:
¿Qué es el sueño profundo en ESP32?
ESP32 puede ser un dispositivo hambriento de energía debido a su módulo WiFi y Bluetooth integrado. ESP32 típicamente dibuja 75 mA para operaciones nominales mientras puede subir a 240 mM Al transmitir datos a través de wifi. Sin embargo, podemos optimizar esto al habilitar el modo de suspensión profunda.
En el modo de suspensión profunda, los periféricos digitales ESP32, la RAM no utilizada y las CPU se apagan. Solo la siguiente lista de piezas permanece operativa:
Cuando se habilita el modo de suspensión profunda, la CPU principal se apaga; Sin embargo, el coprocesador ULP (UltralowPower) aún puede leer datos de los sensores y despertar la CPU cuando sea necesario.
Esta aplicación de ESP32 es útil cuando queremos generar salida en algún momento específico o cuando ocurre una interrupción o evento externo. Esto ahorra potencia ESP32 ya que su CPU permanece apagada por el resto del tiempo y solo se enciende cuando se llama.
Junto con la memoria principal de CPU ESP32 también se muestra o borrada, por lo que cualquier cosa almacenada dentro de esta memoria ya no estará disponible. Solo la memoria RTC se mantiene ahí. Por lo tanto, ESP32 guarda los datos WiFi y Bluetooth dentro de la memoria RTC antes de entrar en modo de suspensión profunda.
Una vez que se restablece o elimina el modo de suspensión profunda, el chip ESP32 inicia la ejecución del programa desde el principio.
ESP32 se puede despertar del sueño profundo utilizando diferentes fuentes.
Despertar fuentes en ESP32
Hay múltiples fuentes disponibles para despertar ESP32 de Deep Sleep:
En esta guía cubriremos Temporizador despierta Fuente de ESP32.
Cómo usar el temporizador para despertar ESP32 del sueño profundo
El controlador RTC que viene con ESP32 contiene un módulo de temporizador que puede despertar el dispositivo después de un cierto período de inactividad. Esta característica tiene grandes aplicaciones en las que necesitamos estampar el tiempo o necesitamos ejecutar instrucciones en momentos específicos mientras mantenemos un consumo de energía óptimo.
El siguiente comando puede configurar el temporizador ESP32 como fuente de atención. Acepta el tiempo en microsegundos como argumento.
esp_sleep_enable_timer_wakeup (Time_in_micro-s)
Código de ejemplo
Si tiene la placa ESP32 instalada en Arduino IDE, entonces ESP32 viene con un ejemplo de sueño profundo que usaremos en este tutorial. En Arduino IDE, el ejemplo de despertar del temporizador de sueño profundo se puede abrir yendo a: Archivo> Ejemplos> ESP32> Sueño profundo> TimerWakeUp
Se abrirá una nueva ventana con el siguiente boceto:
#define us_to_s_factor 1000000ull
#define Time_to_sleep 5
Rtc_data_attr int bootCount = 0;
void print_wakeup_reason ()
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause ();
Switch (WakeUp_Reason)
Caso esp_sleep_wakeup_ext0: serial.println ("Señal de despojo de señal externa usando RTC_IO"); romper;
Caso esp_sleep_wakeup_ext1: serial.println ("Señal de despertar una señal externa usando rtc_cntl"); romper;
Caso esp_sleep_wakeup_timer: serial.println ("Wakeup causado por el temporizador"); romper;
Caso esp_sleep_wakeup_touchpad: serial.println ("Wakeup causado por Touchpad"); romper;
Caso esp_sleep_wakeup_ulp: serial.println ("Wakeup causado por el programa ULP"); romper;
Valor predeterminado: serie.printf ("El sueño profundo no causó despertar: %d \ n", wakeup_reason); romper;
setup () void
De serie.comenzar (115200);
retraso (1000);
++bootcount;
De serie.println ("número de arranque:" + string (bootCount));
print_wakeup_reason ();
esp_sleep_enable_timer_wakeup (time_to_sleep * us_to_s_factor);
De serie.println ("Configurar ESP32 para dormir para cada" + cadena (Time_to_sleep) +
" Segundos");
De serie.println ("que vaya a dormir ahora");
De serie.enjuagar();
esp_deep_sleep_start ();
De serie.println ("Esto nunca se imprimirá");
bucle void ()
Definir el sueño profundo: El código comienza describiendo el tiempo para el cual ESP32 irá en modo de suspensión. Esto se puede modificar dependiendo del tiempo requerido. Aquí el tiempo se convierte de microsegundos a segundos, por lo que hemos establecido 5 segundos para el modo de suspensión profunda ESP32. Se despertará después de cada 5 segundos.
Memorias de datos RTC: Siguiente usando Rtc_data_attr Guardaremos datos en la memoria RTC. Este ejemplo incluye el puta variable que se almacena dentro de la memoria RTC y cuenta la cantidad de veces que ESP32 se despierta después de cada sueño profundo.
La memoria RTC no se muestra cuando ESP32 está en modo de suspensión profunda. Se incluye 8 kb SRAM dentro de la parte RTC ESP32, también conocida como RTC Fast Memory.
ESP32 Razón de despertar: Siguiente usando el print_wakeup_reason () Función que imprimimos la causa de despertar desde el sueño profundo.
En configuración() La tasa de pareja de baudios se define para la comunicación en serie y el ++puta La variable se incrementa por 1 cada vez que ESP32 se despierta del sueño profundo. El recuento total se imprime en el monitor en serie.
Finalmente usando la función esp_deep_sleep_start (), El ESP32 se pone en modo de suspensión.
Cargar código a ESP32 usando Arduino IDE.
Producción
Se puede observar la siguiente salida en el monitor en serie de Arduino IDE. Aquí podemos ver que después de cada 5 segundos ESP32 se despierta del sueño profundo y el número de arranque se incrementa cada vez que se despierta.
Nota: Si presionamos el botón ES ESP32 restablecerá el recuento de arranque a 0.
Conclusión
Aquí en este tutorial, hemos configurado ESP32 para despertarnos de un sueño profundo usando un programa de temporizador. Simplemente hemos imprimido un mensaje una vez que el ESP32 se despierta; Sin embargo, al usar este artículo uno puede ejecutar cualquier tarea una vez que el ESP32 se despierta del sueño profundo.