
Hoy en la Buhardilla vamos a ver como podemos aprovechar el ‘modo Sleep‘ para poder ahorrar energía en los montajes en los que usemos Arduino. En muchas ocasiones, cuando trabajamos en un proyecto con Arduino, nos encontramos con la necesidad de alimentarlo con baterías, puesto que no siempre es posible tenerlo conectado a una fuente de alimentación. En estos casos reducir él consume de energía se vuelve primordial, para poder garantizar que el sistema no se quede sin energía. En este punto es donde el ‘modo Sleep‘ de Arduino entre en juego. Este modo nos permite reducir de manera considerable el consumo de energía de Arduino, alargando así el tiempo que se puede alimentar de la energía almacenada en las baterías. Al activar dicho modo ponemos al sistema en un estado semejante al standby. Debido a una señal externa (que definimos nosotros) el sistema saldrá del letargo y volverá a ejecutar las instrucciones definidas en el código que tengamos creado. Sin más dilación empezamos.
Al poner Arduino en el ‘modo Sleep‘ lo que estamos haciendo realmente es desconectar los distintos módulos del chipset. Al desconectar dichos módulos lo que hacemos es ‘anular’ de manera temporal distintas partes del funcionamiento interno de Arduino. Con el consiguiente ahorro de energía que esto representa. Una de las librerías que permite aplicar dicho modo es la librería ‘LowPower‘. Esta no se encuentra para poder descargarla directamente desde el gestor de librerías de Arduino, así que se tendrá que descargar e instalar de manera manual.
Para instalarla solo tenemos que descargar los ficheros en la carpeta donde Arduino guarda las librerías. Por defecto, dicha ubicación es ‘C:\Users\YourUserName\Documents\Arduino\libraries‘. Una vez descomprimido el fichero descargado en dicha ubicación ya podremos proceder a utilizar la nueva biblioteca (#include <LowPower.h>). Arduino cuanta con 6 modos distintos de ahorro de energía, cada uno de ellos con sus propias características y utilidades. Los distintos modos son:
- Idle mode
- ADC Noise Reduction
- Power-down
- Power-save
- Standby
- Extended Standby
Idle mode
Este es una de los modos más utilizados por su simplicidad de uso. Este modo para la CPU, pero permite que los SPI, interfase serial, USART, ‘Watchdog‘ y los contadores siguen operativos. Esto permite que el Arduino pueda despertar y volverá a estar operativa tanto usando una señal interna como externa. Para usar esta función solo tendremos que usar el siguiente código:
#include <LowPower.h>
void setup() {}
void loop() {
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,SPI_OFF, USART0_OFF, TWI_OFF);
}
La función LowPower.idle permite distintos tiempos de desconexión, variando desde 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1s, 2s, 4s y 8s (cambiando la primera variable de la función por ‘sleep_15ms’ o el valor deseado de los mostrados anteriormente). Siendo 8s el máximo tiempo que se puede usar. No obstante, es posible ampliar el tiempo al aplicar un bucle ‘for‘ en el código. En el caso de querer ampliar el tiempo de desconexión a 24s tendremos que aplicar el siguiente código:
#include <LowPower.h>
void setup() {
}
void loop() {
for(int i = 0; i<= 2; i++)
{
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,SPI_OFF, USART0_OFF, TWI_OFF);
}
}
Al aplicar el bucle ‘for’ (con los valores indicados) vamos a aplicar la función LowPower un total de tres veces seguidas, lo que nos va a permitir conseguir un total de 24s (en caso de querer más tiempo solo tenemos que ampliar el número de veces que se quiere aplicar el bucle ‘for‘).
ADC Noise Reduction Mode
Este modo también para la CPU de Arduino. Pero a diferencia del caso anterior, solo podremos poner a trabajar de nuevo Arduino mediante una señal externa o reseteándolo. Las señales que tendrán efecto en nuestro sistema son:
- Reseteo
- Interrupción del ‘Watchdog’
- Interrupción mediante INT
- Interrupción por un Timer
- Interrupción mediante SPM/EEPROM
Power-Down Mode
Este modo para todos los relojes internos de Arduino, así como el osciloscopio externo y solo permite los módulos asincrónicos. En este modo podemos volver a activar nuestro sistema a partir de señales externas, como podrían ser:
- Reseteo
- Interrupción del ‘Watchdog’
- Cambio en el estado del pin indicado
- Interrupción mediante INT
En este caso podemos ver un ejemplo de código para utilizar una señal externa que interrumpa el ‘modo Sleep‘.
#include "LowPower.h"
int despertar = 2; // Pin en el que se va a producir la interrupción
void Interrupcion()
{
Serial.println("He despertado"); // Acción ha realizar una vez producida la interrupción
}
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT); // Usamos el PIN 13 (LED)
pinMode(despertar, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(despertar), Interrupcion, FALLING);
}
void loop()
{
Serial.println("Ha dormir");
delay(100);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
delay(100);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Cambiamos el estado del LED cada vez que se produce la interrupción
}
En este caso, Arduino estará en el ‘modo Sleep‘ de manera permanente hasta que se produzca un cambio de estado en el pin 2 (despertar). Al producirse dicho cambio de estado se va a ejecutar el código que está en la función ‘Interrupción’ (en esta caso informar de que ha despertado) para acto seguido ejecutar el código restante (cambiar el estado del LED). Al finalizar, Arduino volverá a ponerse en ‘modo Sleep‘ a la espera de una nueva señal en el pin ‘despertar’.
Power-save
Este modo es muy similar al modo anterior (Power-Down) con la excepción el Timer/contador sí que está activado, este seguirá estando operativo durante el tiempo que este ‘dormido’. Este factor permite que se puede despertar al Arduino una vez superado el tiempo definido en el Timer. Si no se utiliza la función de Timer/contador, es mejor utilizar el modo Power-Down.
Standby/Extended Standby
Estos modos son idéntico al modo Power-Down (Standby) y Power-save (Extended Standby), con la única diferencia que el osciloscopio externo sigue estando operativo. En este caso el sistema tardará únicamente seis ciclos del reloj para volver a estar operativo.
Como hemos visto, Arduino dispone de distintas maneras de ahorrar energía mediante el uso del ‘modo Sleep‘, cada una de ellas con sus características y aplicaciones. Espero que esta entrada os haya servido para comprender un poco mejor como funciona el ‘modo Sleep‘ de Arduino y así poder utilizarlo en vuestros proyectos, permitiendo de esta manera poder ahorrar energía.
Saludos y hasta la próxima aventura!!!