Libreria JeeLib y Temporizador bajo consumo

Saludos, estoy intentando hacer un temporizador con un arduino nano conectado a una bateria solar, de manera que no consuma mientras que no tenga que dar ordenes a un relé.

#include <JeeLib.h> // Low power functions library
int led_pin = 13;
int Bomba = 12;
ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Setup the watchdog
void setup() {
 pinMode(led_pin, OUTPUT);
 pinMode(Bomba, OUTPUT);
 

}
void loop() {

 // Enciende y duerme 30 segundos
 digitalWrite(led_pin, HIGH);
 digitalWrite(Bomba,LOW);//Lo tengo invertido por el rele
 Sleepy::loseSomeTime(30000);

 // Apaga y duerme 3600*1000 segundos=1hora
 digitalWrite(led_pin, LOW);
 digitalWrite(Bomba, HIGH);
 Sleepy::loseSomeTime(3600*1000);
}

La idea es que funcione 30 segundos cada hora, ahora hace 30 encendido y 30 apagado… deveria profundizar quizas un poco mas en el tema pero he optado por preguntar por si hay un sistema mejor para hacer esto…
quizas cambiar el tipo de relé por uno que con un pulso cambie de posición para ahorrar 30 segundos de alimentar el solenoide…
Gracias de antemano.

No conocía esta librería pero encontré esto y modificandolo tal vez te sirva

#include <JeeLib.h>  // Include library containing low power functions
int led = 13;
ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Setup for low power waiting
 
void setup() {
  pinMode(led, OUTPUT);
}
 
void loop() {
  digitalWrite(led, HIGH);
  Sleepy::loseSomeTime(30000);      // 30 seg en HIGH pero dormido
  digitalWrite(led, LOW);
  Sleepy::loseSomeTime(3570000);      // En vez de 1h - 30 seg 
}

Pruebalo que yo haré lo mismo. Muy interesante

Sigue haciendo lo mismo 30 on 30 off , creo que hay un tiempo máximo porque cuando reduces el segundo Sleepy::loseSomeTime(3570000);
funciona... habra "tope" en el watchdog?
Añado link de la libreria GitHub - jeelabs/jeelib: JeeLib for Arduino IDE: Ports, RF12, and RF69 drivers from JeeLabs

segun dice aquí …
Parameters
msecs Number of milliseconds to sleep, in range 0…65535.
http://jeelabs.org/pub/docs/jeelib/classSleepy.html
así que el máximo serian 8 segundos… ¿cómo hacer para que aguante 1 hora?
Pues aquí lo explica en inglés, creo que lo que hace es asignar una cadena de bits como definición de tiempo y las repite x veces…

// Example of sleeping and saving power
// 
// Author: Nick Gammon
// Date:   25 May 2011

#include <avr/sleep.h>
#include <avr/wdt.h>

#define LED 13

// watchdog interrupt
ISR(WDT_vect) 
  {
  wdt_disable();  // disable watchdog
  }

void myWatchdogEnable(const byte interval) 
  {  
  MCUSR = 0;                          // reset various flags
  WDTCSR |= 0b00011000;               // see docs, set WDCE, WDE
  WDTCSR =  0b01000000 | interval;    // set WDIE, and appropriate delay

  wdt_reset();
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_mode();            // now goes to Sleep and waits for the interrupt
  } 

void setup()
{
pinMode (LED, OUTPUT);
}  // end of setup

void loop()
{
  digitalWrite (LED, HIGH);  // awake
  delay (2000);    // ie. do stuff here
  digitalWrite (LED, LOW);  // asleep

  // sleep for a total of 20 seconds
  myWatchdogEnable (0b100001);  // 8 seconds
  myWatchdogEnable (0b100001);  // 8 seconds
  myWatchdogEnable (0b100000);  // 4 seconds

}  // end ofloop

// sleep bit patterns:
//  1 second:  0b000110
//  2 seconds: 0b000111
//  4 seconds: 0b100000
//  8 seconds: 0b100001

También aqui explica cómo funciona watchdog

Según la pagina del foro http://forum.arduino.cc/index.php?topic=173850.0

y aquí lo que queria hacer, un temporizador de bajo consumo 30 segundos ON 1 Hora OFF

// Example of sleeping and saving power
// 
// Author: Nick Gammon
// Date:   25 May 2011

#include <avr/sleep.h>
#include <avr/wdt.h>

#define LED 13

// watchdog interrupt
ISR(WDT_vect) 
  {
  wdt_disable();  // disable watchdog
  }

void myWatchdogEnable(const byte interval) 
  {  
  MCUSR = 0;                          // reset various flags
  WDTCSR |= 0b00011000;               // see docs, set WDCE, WDE
  WDTCSR =  0b01000000 | interval;    // set WDIE, and appropriate delay

  wdt_reset();
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_mode();            // now goes to Sleep and waits for the interrupt
  } 

void setup()
{
pinMode (LED, OUTPUT);
}  // end of setup

void loop()
{
  digitalWrite (LED, HIGH);  // awake
 
  int a;  
  for (a = 0; a <4; a++) /// Repite 4 veces  la acción siguiente 
  {  
    myWatchdogEnable (0b100001);  // 8 seconds
  }
  digitalWrite (LED, LOW);  // asleep
 int i;
  for (i = 0; i <450; i++)/// Repite 450 veces  la acción siguiente  que viene a ser 1 H
  {  
    myWatchdogEnable (0b100001);  // 8 seconds
  }
 
}  // end ofloop 

// sleep bit patterns:
//  1 second:  0b000110
//  2 seconds: 0b000111
//  4 seconds: 0b100000
//  8 seconds: 0b100001

Gracias Surbyte.
PD: Finalmente la libreria jeeLib no la he usado, pero estoy viendo que tiene un montón de ejemplos curiosos, ahunque no entienda ni la mitad…