En este caso os traigo una forma de reducir el consumo de energía en Arduino. Esto os será muy útil si vuestro proyecto va a ser alimentado por baterías e incluso por paneles solares. Si tu proyecto es básicamente leer un sensor cada cierto tiempo, puedes llegar a reducir el consumo de energía hasta más de 30 veces.

Lo primero para reducir el consumo de energía de nuestro Arduino es olvidarnos de la placa de Arduino. Esta placa tiene un regulador de tensión y una serie de componentes que sólo aumentarán el consumo de energía. Para este propósito te puedes pasar por mi post de cómo crear un Arduino básico, en el cual creo el circuito con los componentes básicos.

Una vez que tengas el circuito básico, habrás conseguido reducir el consumo de tu Arduino de 46ma a aproximadamente 8,5ma. Esto ya de por si representa un ahorro de energía de más del 80%, por lo que es un buen inicio.

Ahorro de energía con TaskScheduler

Este es quizá el método más fácil de ahorrar energía en nuestros Arduino. Tan sólo tendrás que usar esta librería para programar las tareas, e indicar que el resto del tiempo se quede en modo Sleep.

El ahorro de energía de este método es medio, y es equivalente al del modo Sleep. La diferencia es que no tendrás que encargarte de gestionar cuándo se tiene que echar a dormir.

Dado que ya hablé de esta librería en el post anterior, te recomiendo que te le eches un vistazo en este enlace.

Ahorro de energía con librería LowPower

El segundo método fácil de hacerlo es con la librería LowPower. Esta librería hará por nosotros el tedioso trabajo de pegarnos con los registers de Arduino.

Lo primero que tendremos que hacer, es instalarla. Para poder instalarla podemos descargarla desde su página de github, pero yo recomiendo utilizar el Administrador de Bibliotecas.

Instalar librería LowPower

Para instalar la librería usando el Administrador de Bibliotecas, sólo tendremos que seguir estos pasos:

  • Abrimos el administrador dando al menú Herramientas > Administrador de Bibliotecas, o pulsando Ctrl + Shift + I.
  • Una vez ahí, buscaremos «Low-Power» (el guión es importante)
  • De la inmensa lista que nos saldrá, tendremos que buscar la que se llama exactamente «Low-Power» de Rocket Scream Electronics.

Una vez instalada, ya podremos comenzar a hacer uso de ella en nuestros proyectos.

Modos disponibles

Hay en total 6 modos de ahorro de energía en nuestro Arduino, entre los que podemos observar:

  • Idle
  • ADC Noise Reduction
  • Power-down
  • Power-save
  • Standby
  • Extended Standby

Aquí os dejo una tabla con información acerca de los modos de ahorro de energía y a qué partes del microcontrolador mantiene encendidas:

Temporizadores disponibles

Por desgracia el Arduino no se puede dormir un tiempo concreto, sino que dispondremos de los siguiente temporizadores:

  • SLEEP_15MS
  • SLEEP_30MS
  • SLEEP_60MS
  • SLEEP_120MS
  • SLEEP_250MS
  • SLEEP_500MS
  • SLEEP_1S
  • SLEEP_2S
  • SLEEP_4S
  • SLEEP_8S
  • SLEEP_FOREVER

No creo que haga falta explicaros de cuánto tiempo es cada modo :P. Lo que si haré es deciros que SLEEP_FOREVER es un modo que hace que nuestro Arduino no sea capaz de despertar nunca. La única forma de despertarlo sería utilizando una interrupción, de las cuales os hablo en otro post mío. Es muy útil si por ejemplo estamos esperando a que el usuario pulse un botón para hacer algo, y el microcontrolador está dormido mientras tanto.

Ejemplos y consumo en los distintos modos

Una vez sabidos los distintos modos de los que disponemos, es hora de poner unos ejemplos con el consumo que tienen. Para unificarlo, voy a calcular el consumo basándome en un sensor que se lea 1 segundo cada minuto. Por supuesto, si en tu código levantas al Arduino cada mucho tiempo el consumo bajará, y si lo haces muy a menudo, aumentará. En cualquier caso, siempre será menor al que tiene estando en funcionamiento.

En los ejemplos usaré un led que parpadee cada 2 segundos y su consumo distará mucho de indicado, pero es para que veáis como funciona.

Modo Idle

Este es el primer modo del que hablaré, y con él conseguiremos bajar el consumo de nuestro Arduino hasta 1.9ma. Con esto conseguiremos una reducción del consumo de aproximadamente el 78%. Si encendemos el Arduino un segundo cada minuto, el consumo medio será de 2ma, consiguiendo un ahorro real del 77.4%.

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.idle(SLEEP_2S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
}

En la función además podemos indicarle si queremos mantener alguna de las opciones activadas, aunque esto aumentaría el consumo.

Modo ADC Noise Reduction

Este modo activa la reducción de ruido de las entradas ADC, lo cual nos puede ser útil para leer datos con ellas. De todas formas recomiendo hacer un sampleo de varias muestras y sacar la media en lugar de usar este modo.

Este modo no aporta mucho más, y el consumo es similar al del modo Idle.

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.adcNoiseReduction(SLEEP_2S, ADC_OFF, TIMER2_OFF);
}

Modo PowerDown

Este es sin duda uno de los modos que más ahorro de energía nos dará, pero por supuesto, el que menos cosas tendrá activas. Esto hará que no sea válido para todos los proyectos, pero si tu proyecto es leer de un sensor, seguramente sea el mejor.

Con este modo el consumo se reduce a 0,024ma, lo cual es una reducción increible (una reducción real del 98%). Si ponemos BOD a off podemos conseguir aún más ahorro, siendo el consumo de sólo 0.005ma (una reducción real del 98.3%).

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_ON);
}

Modo PowerSave

Este modo es muy parecido al modo PowerDown, y el consumo de energía que nos dará es el mismo que nos proporciona este.

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.powerSave(SLEEP_4S, ADC_OFF, BOD_ON, TIMER2_OFF);
}

Modo Standby

El penúltimo modo de los disponibles es el modo Standby. Este modo es un intermedio entre el modo Idle y el modo PowerDown, y tiene un consumo de aproximadamente 0,47ma. Esto nos dará una reducción del consumo de un 92,9%. Si desactivamos el BOD el consumo se reduce a 0,45ma, lo cual aumenta el ahorro al 93.2%.

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.powerStandby(SLEEP_4S, ADC_OFF, BOD_ON);
}

Modo ExtendedStandby

Este es ya el último de los modos de los que os hablaré. Este modo ofrecerá un ahorro energético ligeramente inferior al modo Standby, siendo el consumo de 0,48ma. Esto nos dará una reducción del consumo de un 92,8%. Si desactivamos el BOD el consumo se reduce a 0.45ma, lo cual aumenta el ahorro al 93.2%.

#include "LowPower.h"

void ledBlink(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
}

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  ledBlink();
  LowPower.powerExtStandby(SLEEP_4S, ADC_OFF, BOD_ON, TIMER2_OFF);
}

Información acerca del BOD

El BOD o Brown-Out-Detection, es un sistema del microcontrolador que monitoriza el voltaje que está recibiendo. Si dicho valor es demasiado bajo, el microcontrolador se apaga para evitar dañosy es por ese motivo que salvo que tengas otros modos de monitorizar la energía y de apagar el microcontrolador, no recomiendo que se desactive.

Un saludo!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.