AVR Sleep Mode Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Medición de Corriente Sleep Mode AVR

En  un tutorial anterior vimos como medir la corriente consumida por la MCU.  El mismo método puede ser utilizado para medir el consumo de corriente de un proyecto completo, al insertar el medidor entre la fuente de poder.  Antes de llegar a ese ejemplo, el cual nos ayudara a medir el consumo energético de un proyecto para poder hacer cálculos de autonomía (por ejemplo cuanta energía tendríamos que producir y almacenar para un proyecto solar por ejemplo), vamos a ver como podemos ahorrar energía poniendo nuestra Arduino a dormir.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO
  3. Medidor de Voltaje/Corriente
  4. Battery Pack
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El proyecto de nuestra Arduino es asi:


Esta vez cargaremos un sketch asi:


#include <avr/sleep.h>
int wakePin = 2; // pin used for waking up
int sleepStatus = 0; // variable to store a request for sleep
int count = 0; // counter
void wakeUpNow() // here the interrupt is handled after wakeup{
}
void setup(){
pinMode(wakePin, INPUT);
Serial.begin(9600);
attachInterrupt(0, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
}
void sleepNow() // here we put the arduino to sleep{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
// so sleep is possible. just a safety pin
attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
// wakeUpNow code will not be executed
// during normal running time.
}
void loop(){
// display information about the counter
Serial.print("Awake for ");
Serial.print(count);
Serial.println("sec");
count++;
delay(1000); // waits for a second
// compute the serial input
if (Serial.available()) {
int val = Serial.read();
if (val == 'S') {
Serial.println("Serial: Entering Sleep mode");
delay(100); // this delay is needed, the sleep
//function will provoke a Serial error otherwise!!
count = 0;
sleepNow(); // sleep function called here
}
if (val == 'A') {
Serial.println("Hola Caracola"); // classic dummy message
}
}
// check if it should go to sleep because of time
if (count >= 10) {
Serial.println("Timer: Entering Sleep mode");
delay(100); // this delay is needed, the sleep
//function will provoke a Serial error otherwise!!
count = 0;
sleepNow(); // sleep function called here
}
}

El código produce este resultado en el Serial Monitor:

Arduino IoT Simple Tutorial Medicion de Corriente AVR Sleep Mode by Santiapps Marcio Valenzuela
Arduino IoT Simple Tutorial Medicion de Corriente AVR Sleep Mode

Como podemos ver el codigo hace que la Arduino duerma luego de 10 segundos.  Es importante entender esto para que a la hora de medir la corriente sepamos que el consumo deberá bajar luego de 10 segundos para ver el ahorro.

Este código esta tomado del sitio Arduino.cc y es importante usar el Resistor 220Ohms entre el pin2 y el pin0(Rx). Subamos el código a la Arduino y luego hagamos las conexiones como hicimos anteriormente para medir la corriente.  La idea es medir la corriente mientras la Arduino esta despierta vs cuando esta dormida.

El resultado final esta aqui, sin embargo es igual a la anterior:


Pero luego de 10 segundos:


Como vemos el consumo baja de 46.5mA a 33.3mA.  Esto representa un ahorro del 28%.

Ahora veámoslos en la Nano:

Leave a Reply