Consulta sobre modo sleep

Hola,

Utilizo la librería "LowPower.h" para "dormir" al arduino UNO. El caso es que si pongo el código para "dormir" en una función que pueda ser llamada desde otra para "dormlrlo", tal como esta:

void duermeArduino () { //Duerme al arduino
attachInterrupt(0, pin2Interrupt, HIGH); // Al pin 2 se asigna como el receptor del interrupt = INT0 segun atmega328 y se le dice
//que despierte cuando el pin 2 esté a HIGH
//
//Duerme al arduino
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
//  Aquí va el código para cuando despierta el arduino
//
//}

No funciona, la llama, pero no entra en sleep.
Si este mismo código (igual, pero sin la función, claro) está dentro del código del "loop", funciona perfectamente.

La función pin2Interrupt está creada.

He buscado pero no he encontrado nada al respecto.

¿sabría alguien comentarme por lo que es y si se podría solucionar?.

Muchas gracias de antemano

Tengo entendido que las rutinas de activación de cualquiera de los modos de bajo consumo tienen que estar definidas dentro de main(), o en su defecto, en una función inline (el compilador, en lugar llamar a la función, reemplaza la llamada por todo el código de la función, tal cual está ahí).

Prueba definiendo duermeArduino() como inline (agrega "inline" antes de void), y nos comentas que tal.

Saludos!

pepepotero porque te complicas de ese modo?

Si ves cualquiera de los dos o 4 ejemplos de Lowpower verás que la forma apropiada es, definir en el setup como llamaras a tu rutina.
En realidad lo que pones en la INT del Pin2 es algo para poder despertarlo.

void setup () { //Duerme al arduino
attachInterrupt(0, pin2Interrupt, HIGH); // Al pin 2 se asigna como el receptor del interrupt = INT0 segun atmega328 y se le dice
//que despierte cuando el pin 2 esté a HIGH
//

void loop() {
//Duerme al arduino
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
//  Aquí va el código para cuando despierta el arduino
//
//}

Y ese código para despertarlo no esta incluído en lo que has puesto.

Este es el ejemplo que resume lo que digo..

powerDownWakeExternalInterrupt.ino

En primer lugar muchísimas gracias por la respuesta.

Ferminolaiz
Ya había deducido que deben ir en el main (loop) :slight_smile: pero no se me había ocurrido usar "inline". Lo probaré.

Surbyte
Tienes toda la razón en colocar el attachInterrupt(0, pin2Interrupt, HIGH);
en el setup, pero la llamada para dormirlo sigue estando dentro del loop, así que hay que colocar el código LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); tantas veces como sea necesario su uso. Con una función quedaría más limpio y mantenible.
En mi caso la función

void pin2Interrupt(){
}

está vacía ya que no tiene que hacer nada especial al despertar. Al poner el pin 2 en HIGH salta a esta función y devuelve el control de ejecución a la instrucción siguiente al sleep, por tanto sigue con el código donde lo dejó (que es lo que necesito)

Voy a probar ambas recomendaciones.

Muchas gracias

Estas confundido al menos con mi ejemplo.
La llamada para dormirlo esta donde quieras que este setup o loop.
Esa es una llamada para despertarlo via interrupción. Me refiero al ejemplo que te suegerí.