En una gran cantidad de casos, será necesario alimentar tu Arduino a través de baterías o paneles solares. En estos casos, optimizar y reducir el consumo de energía será vital para la viabilidad del proyecto.
Si es tu caso, y estás pensando en implementar un proyecto en Arduino en una zona remota, en este artículo te mostraremos los métodos más eficientes para reducir el consumo de energía.
Reducir el consumo de energía mediante cambios en el hardware
Modelos como el Arduino UNO requieren una fuente de alimentación de 12 V, con un consumo de corriente aproximado de 50 mA.
Si logramos reducir el voltaje de 12 a 9 V, es posible reducir el consumo de corriente a unos 33 mA.
Sin embargo, realizar esta modificación reducirá la vida de las baterías, y no es la mejor manera para implementar proyectos en lugares remotos.
En este escenario, es posible lograr nuestro cometido realizando cambios al hardware de nuestra placa.
Podemos por ejemplo prescindir de varios LED, que pueden consumir hasta 2 mA cada uno. También en algunos casos podemos eliminarlos por completo, sino son vitales para los resultados que esperamos.
Otra forma de limitar el consumo de energía es alimentar los dispositivos mediante un puerto de E/S que permita apagar el dispositivo cuando no esté en uso.
Para ver de forma más didáctica el consejo anterior, más adelante en este artículo te mostraremos como conectar un sensor a los pines GPIO que solo se encederá cuando se registre una lectura. Esta configuración permite reducir el consumo de batería y de igual forma aumenta la vida útil del sensor.
Sin embargo, algunos dispositivos no se pueden apagar cuando están inactivos. Dispositivos como los lectores de tarjetas SD, no permiten la desconexión y el inicio usando pines GPIO.
Así mismo, los módulos como los relojes, también deben permanecer encendidos de forma permanente.
Existen dispositivos que permiten reducir desde 4,5-24 V a 5 V de forma eficiente.
Además también ofrece una ventaja adicional al permitir desactivar la salida de energía simplemente conectando a tierra el pin de activación (cable amarillo).

En el diagrama, el cable negro es la tierra común y el rojo es el voltaje de entrada. El cable verde es el voltaje de salida.
CambiE el regulador de voltaje original que viene incluído en el Arduino con un convertidor reductor, reduce la corriente de 52 ma a aproximadamente 23 ma:

Reducir el consumo de energía mediante cambios en el software
En primer lugar es posible reducir el consumo de energía en un Arduino, a través de los propios ajustes de energía del chip ATMEGA328.
A través de la librería LowPower de Arduino es posible aprovechar las funciones de ahorro energético deshabilitando ciertos procesos e incluso deteniendo el procesador si es necesario.
La tabla siguiente te ilustrará en cuanto al ahorro que se puede lograr a través de la librería LowPower.
Los valores de referencia han sido medidos en una placa Arduino UNO y un convertidor reductor:
Sin usar librería LowPower | Usando la librería LowPower |
12V usando el regulador de voltaje incorporado = 50 ma | 12V usando regulador de voltaje a bordo = 45 ma |
Convertidor reductor 5V=27 ma | Convertidor reductor 5V=25 ma |
Convertidor reductor de 3,3 V = 10 mA | 3.3V macho convertidor = 8 ma |
Cómo usar la librería LowPower
El código a continuación muestra el uso de la función: LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
#include <LowPower.h>
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
digitalWrite(LED_BUILTIN, LOW);
LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
}
El argumento SLEEP_2S
, indica al procesador que debe entrar en reposo durante dos segundos.
Para liberar el procesador, la señal PWM se crea en un reloj externo, que se desactiva, desactivando la función ADC para ahorrar energía adicional. El temporizador Brown Out (BOT), que se usa para garantizar que se suministre el voltaje adecuado, también se desactiva temporalmente.
El tiempo de suspensión se puede configurar en 15, 30, 60, 120, 250 o 500 ms y 1, 2 ,4 u 8 segundos.
Sin embargo también existen otros métodos para poner en reposo el dispositivo más allá de los 8 segundos, como se explicará más adelante.
Proyecto ejemplo de medición de temperatura y humedad para baja potencia de Arduino
En este proyecto ejemplo, vamos a hacer uso de un sensor DHT22 que tomará lecturas de humedad y temperatura. Luego éstas lecturas de almacenarán en un chip EEPROM.
Otro componente de este montaje será un reloj para asociar una marca de tiempo a cada lectura del sensor.
El AT24C256 viene preprogramado de fábrica con una dirección hexadecimal de 0x50. Una vez que tenga todas las partes, conecte todo siguiendo este diagrama de cableado:

Funcionamiento:
Se usará una memoria de solo lectura programable y borrable eléctricamente (EEPROM) para almacenar datos del sensor DHT22.
Otra manera para almacenar dicho datos, pudiera ser un lector de tarjetas SD. Sin embargo, para reducir el consumo de energía, las tarjetas SD no son la mejor opción pues requieren consumir hasta 30 mA para funcionar.
En caso contrario el EEPROM y para los fines de este proyecto, será mucho más fiable pues consume menos de 3 mA.
Para hacer funcionar este montaje es necesario implementar 3 códigos de Arduino.
El primer bloque de código escribirá los datos desde el sensor hasta la EEPROM.
Un segundo código permite leer los datos almacenados en la EEPROM.
Por último, el tercer programa borra los datos de la EEPROM.
Código para escribir los datos
// Almacena datos de temperatura y humedad en una EEPROM
#include <DHT.h>
#include <LowPower.h>
#include <Wire.h>
#include <EEPROM.h>
#include <RTClib.h>
RTC_DS1307 rtc;
#define Led 13
#define DHTPIN 5
//#define DHTTYPE DHT11
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int address = 0;
void setup() {
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
//Elimina el comentario en la próxima linea para regitrar la fecha, luego comenta nuevamente al recompilar
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
if (!rtc.isrunning()) {
Serial.println("RTC Not running!");
}
dht.begin();
Wire.begin();
} // End setup()
void loop() {
delay(500);
DateTime now = rtc.now();
float h = dht.readHumidity();
delay(500);
float t = dht.readTemperature();
delay(500);
float f = dht.readTemperature(true);
delay(500);
EEPROM.update(address, (now.month()));
address++;
delay(500);
EEPROM.update(address,(now.day()));
address++;
delay(500);
EEPROM.update(address,(now.hour()));
address++;
delay(500);
EEPROM.update(address,(now.minute()));
address++;
delay(500);
EEPROM.update(address,h);
address++;
delay(500);
EEPROM.update(address,f);
address++;
delay(500);
//Included to allow you to view your output
Serial.print("Humidity:" );
Serial.println(h);
Serial.print("Temperature:");
Serial.println(f);
Serial.print("Time ");
Serial.print(now.hour());
Serial.print(":");
Serial.println(now.minute());
delay(1000);
// Timer delays about 15 minutes between readings
for (int i = 0; i < 100; i++) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}
La función LowPower tiene un límite máximo de ocho segundos. Pero al configurar un ciclo for para recorrer LowPower 100 veces, nos brindará un tiempo de espera de un poco más de 13 minutos.
Los tiempos se pueden aumentar o disminuir según se requiera.
Código para leer los datos
#include <EEPROM.h>
int i = 0;
int address = 0;
byte value;
void setup() {
Serial.begin(9600);
while (!Serial) {
}
}
void loop() {
value = EEPROM.read(address);
while (value > 1) {
for (i = 0; i < 6; i++) {
Serial.print("Date-");
Serial.print(value);
Serial.print("/");
address++;
value = EEPROM.read(address);
delay(50);
Serial.println(value);
address++;
value = EEPROM.read(address);
delay(50);
Serial.print("Hours:");
Serial.print(value);
address++;
value = EEPROM.read(address);
delay(50);
Serial.print(" Minutes:");
Serial.println(value);
address++;
value = EEPROM.read(address);
delay(50);
Serial.print("Humidity:");
Serial.print(value);
Serial.println("%");
address++;
value = EEPROM.read(address);
delay(50);
Serial.print("Temperature:");
Serial.print(value);
Serial.println(" Degrees Fahrenheit");
address++;
Serial.println("\n");
break;
}
break;
}
}
El bucle for se ha configurado para leer hasta 6 registros. Este es el número de entradas realizadas cada vez que se ejecuta el programa de captura de datos.
Si desea aumentar el número de registros de datos, primero modifica el código de captura de datos agregando el número que desees registrar.
Finalmente aumenta el número en la instrucción if para el número de datos que ha configurado.

Código para borrar datos
#include <EEPROM.h>
void setup() {
// initialize the LED pin as an output.
pinMode(13, OUTPUT);
for (int i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0);
}
// turn the LED on when we're done
digitalWrite(13, HIGH);
}
void loop() {
}
Esperamos que este artículo te haya mostrado las formas es que es posible reducir el consumo de energía en tu Arduino.