¿Sleep con tiempo e Interrupciones?

Buenas Noches.
Estoy en medio de un proyecto y en una de las pruebas he estado midiendo el consumo de arduino.
Estoy usando un NANO y tiene puesto:
*Dos dht 22
*Un Shield de 4 reles que apenas consume cuando no esta activado (cuando enciendo cada rele son unos 50 mA)
*Un receptor de 4 canales de 315mhz que apenas consume.
*Un Shield NANO RTC DS1207 y MicroSD

Esto en en estado normal son unos 46-50ma

A pesar de que esto va a estar alimentado por una bateria de coche, y el encendido de relés va a ser muy escaso( 1-2 horas a la semana como mucho) me preocupa lo que pueda durar la bateria (estamos hablando de unos 50A).

LLevo toda la tarde buscando la manera de:
*poner el arduino en modo SLEEP durante un periodo determinado (59 minutos)
*Si se pulsa un botón conectado al Pin 2 (interrupción 0) debe recobrar el el funcionamiento

La cosa es que he visto y probado maneras de poner en sleep el arduino, pero que también controle el tiempo de dormido, sin embargo se me queda dormido el tiempo y las interrupciones no funcionan.

¿Alguna idea de cómo hacer esto?
¿Tendre que buscar la opcion de un RTC con alarmas para tener una doble interrupción?

A ver si hay suerte....

Esto que pones

LLevo toda la tarde buscando la manera de:
*poner el arduino en modo SLEEP durante un periodo determinado (59 minutos)
*Si se pulsa un botón conectado al Pin 2 (interrupción 0) debe recobrar el el funcionamiento

Es un ejemplo de la libreria Low Power

MIra el ejemplo powerDownWakeExternalInterrupt.ino

// **** INCLUDES *****
#include "LowPower.h"

// Use pin 2 as wake up pin
const int wakeUpPin = 2;

void wakeUp()
{
    // Just a handler for the pin interrupt.
}

void setup()
{
    // Configure wake up pin as input.
    // This will consumes few uA of current.
    pinMode(wakeUpPin, INPUT);   
}

void loop() 
{
    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(0, wakeUp, LOW);
    
    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    // Disable external pin interrupt on wake up pin.
    detachInterrupt(0); 
    
    // Do something here
    // Example: Read sensor, data logging, data transmission.
}

Esto lo despierta con un low en pin2 o sea.. un pulsador directo entre pin y gnd. presionas y despierta.

Ahora como extiendes el tiempo?

Esto lo pone a dormir por 8 seg que es la máxima duración

// Enter power down state for 8 s with ADC and BOD module disabled
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

Para extener el tiempo simplemente lo pones en un loop de multiplos de 8 segundos y ya.
se duerme, se despierta, sigue el loop, se duerme se desierta sigue otro paso del loop y asi.

Muchas gracias por tu pronta respuesta.
He estado "jugando" con la libreria de JEELIB y el comando [u]Sleepy::loseSomeTime/u.

¿Realmente se ahorra tanto levantando y durmiendo al ARDUINO?

He visto muchos ejemplos que con RTC con alarmas lo hace cuando quieren con dos Interrupciones (Botón fisico a Pin y Alarma a Pin), con eso duerme como un bebe.hasta que llega uno de los dos y corta.

Entonces con el MIX que me dices.... a ver si lo entiendo.....

*Tener el sleep en un loop hasta que una variable flag cambie y salga
*Sea la función de interrupción la que cambie el flag

¿Estoy en lo correcto? ¿Aunque este dormido entiendo que la interrupción va a saltar de todas maneras ?

es que me estoy haciendo un lio de la leche, pues entre otras cosas tengo que tener cuidado de que no se me pase un segundo porque tengo programaciones por tiempo parametrizadas.

Y aunque sea pesado....¿Tanto merece la pena estar (pongamos) cada 5 segundos durmiendo?

Gracias por todo

cascade:
¿Realmente se ahorra tanto levantando y durmiendo al ARDUINO?

Vale la pena si:

  • Lo vas a alimentar con batería.
  • Quitas los LEDs incorporados.
  • Logras prescindir de todo regulador de voltaje (o al menos del incorporado).

cascade:
Entonces con el MIX que me dices.... a ver si lo entiendo.....

*Tener el sleep en un loop hasta que una variable flag cambie y salga
*Sea la función de interrupción la que cambie el flag

¿Estoy en lo correcto? ¿Aunque este dormido entiendo que la interrupción va a saltar de todas maneras ?

Que la interrupción cambie el flag; así sería posible salir del "ciclo de sueño" prematuramente.

cascade:
pues entre otras cosas tengo que tener cuidado de que no se me pase un segundo porque tengo programaciones por tiempo parametrizadas.

Pues entonces ponlo a dormir cuando el "tiempo muerto" (sin hacer nada) sea lo suficientemente prolongado.

cascade:
Y aunque sea pesado....¿Tanto merece la pena estar (pongamos) cada 5 segundos durmiendo?

Por supuesto. Lapsos con menor consumo implica un menor promedio; lo que lleva a alargar la duración de la carga de la batería. Si el "tiempo muerto" fuera mucho mayor al activo (como en controles remotos), la duración de la carga puede extenderse por meses e incluso años; aún en capacidades inferiores a los 100 mAh.

un millón de gracias......
la verdad es que como aplica la logica de este tema me es complejo y yo buscaba una idea que fuera inmediata la recuperación, pero luego dando vueltas, creo que se puede esperar unos 5 segundos a que le responda el mando,

Creo que más adelante haré pruebas de consumo mas a fondo de las distintas placas que tengo(Nano, UNO, y Mega) así de los distintos componentes anejos que uso, pues me puedo llevar una sorpresa.

Otra de las cosas que tengo pendiente en el proyecto es sacar fuera la alimentación de los DHT22 y la Placa de Relés. La idea es montar unas líneas de pines externos, gnd y 5v con una tercera que conecte con la de GND mediante un Trasnsistor PNP y una resistencia a un pin del arduino, para que lo active.
El problema es que eso lo he hecho ya para interruptores de camaras de fotos o Mp3, practicamente puenteando el pulsador de los dispositivos (3,3v) con un BC547C. Pero claro, ese esta limitado a 100ma, y lo que tengo que meter es 5v. y que aguante 1A.
A ver si encuentro cual tengo que comprar y que me sableen en la tienda de electronica

Si sabeis del par resistencia transistor que me puede servir par aeso os lo agradecería, pues la alectronica llevo sin tocarla mas de 20 años.

Saludos

Lo mejor para eso es o bien un Transitor MOSFET canal P y cortas la linea VCC o usas un Canal N y cortas la linea GND. Un BC547C como bien lo dices esta limitado, ademas tendrás una Vce que puede ser importante y a veces condiciona el dispositivo que controlas.

Si consigues un IRL5XX con un 510 te alcanza pero este es Canal N y entonces debes montralo con source a GND y con el dispositivo a controlar al DRAIN.