CHDK Wiki
Advertisement

This script was written to demonstrate and test the various methods known to extend battery life when using an intervalometer (time lapse) script.  These are :

  1. Lock the autofocus.
  2. Turn the backlight off.
  3. Turn the display off (on camera that supports that - typically models with an OVF)\
  4. Switch to playback mode between shots.
  5. Enter sleep mode between shots (on cameras with a "short cut" button)

Testing indicates that the using the first two methods will extend battery life about 20%.  The other three methods can double or even quadruple battery life.

Discussion thread for this script is here : Battery Intervalometer​ .  Save it with .lua file extension - something like miser2.lua

--[[
@title Battery Miser 6.1
@param s Interval (sec)
@default s 60
@param b Turn Backlight Off
@default b 0
@range b 0 1
@param d Turn Display Off
@default d 0
@range d 0 1
@param p Wait in Playback Mode
@default p 0
@range p 0 1
@param k Use shortcut key to sleep
@default k 0
@range k 0 1
@param a Enable AF Lock
@default a 0
@range a 0 1
@param l Log to File
@default l 1
@range l 0 1
@param r Lens Retract Delay (sec)
@default r 60
@param v Batttery Stop Voltage (mV)
@default v 1000
@range v 0 10000
--]]

props=require("propcase")

shortcut_key="print"   -- edit this if using shortcut key to enter sleep mode
sleep_mode=false


function restore()
    set_backlight(1)
    set_aflock(0)
    sleep_disable()
end

function sleep_enable()
  if( sleep_mode==false) then
      print("enter sleep mode via shortcut")
      press(shortcut_key)
      sleep(2000)
      release(shortcut_key)
      sleep_mode=true
  end
end
  
function sleep_disable()
  if( sleep_mode==true) then
      print("exit sleep mode via shortcut")
      press(shortcut_key)
      sleep(2000)
      release(shortcut_key)
      sleep_mode=false
  end
end
  

function log_to_file( string )
   if ( l == 1 ) then
      print_screen(-10)
         print(string)
      print_screen(false)
   else
     print(string)
   end
end


function switch_mode( m )   -- change between shooting and playback mode
   if ( m == 1 ) then
      if ( get_mode() == false ) then
         print("switching to record mode")
         set_record(1)
         while ( get_mode() == false ) do
            sleep(100)
         end
      end
   else
      if ( get_mode() == true ) then
         print("switching to playback mode")
         set_record(0)
         while ( get_mode() == true ) do
            sleep(100)
         end
       end
   end
end

function display_off()   -- turn off display by pressing DISP button
   print("blanking display")
   count=5
   disp_save = get_prop(props.DISPLAY_MODE)   
   repeat
      disp = get_prop(props.DISPLAY_MODE)   
      if ( disp ~= 2 ) then
          click("display")
          sleep(500)
      end
      count=count-1
   until ((disp==2) or (count==0))
   if ( count>0 ) then 
       print("display blanked")
   else
       print("unable to blank the display")
   end
end

set_console_layout(0,0,45,12)

if ( l==1 ) then
   print_screen(-10)
   print("  ")
   print("============================================")
   print(os.date("%d.%m.%y  %X"))
   print("interval=",s,"retract=",r,"AFL=",a)
   print("backlight=",b,"playback_idle=",p)
   print("display off=",d, "vbatt cutout=", v)
   print("sleep mode=",k,"logging=",d)
   print("============================================")
   print_screen(false)
end

sleep(2000)

shotcount=0
interval=s*1000
retract=r*1000
b=1-b


switch_mode(1)

if( a == 1 ) then            -- focus lock ?
    press( "shoot_half" )
    while ( get_shooting() == true ) do
      sleep(100)
    end
    release("shoot_half")
    set_aflock(1)
    print( "--focus locked")
    sleep(500)
end

if ( d==1 ) then             -- turn display off ?
   if( p==1 ) then 
	print("**Warning: Wait in Playback mode")
	print("**conflicts with Display Off mode.")
        print("**Disabling Playback Idle mode")
        sleep(2000)
        p=0
   end
   display_off()
   sleep(5000)
end


battery = get_vbatt()
nextshot=get_tick_count()
start=nextshot
abort = false


-- intervalometer loop starts here

repeat 
   switch_mode(1)
   print("short wait =", (nextshot-get_tick_count())/1000 )
   while (nextshot > get_tick_count()) do
     set_backlight(b)
     sleep(500)
   end

   shotcount = shotcount + 1
   tic  = get_tick_count()-start
   nextshot = nextshot + interval
   lens_retract = get_tick_count() + retract
   log_to_file(string.format("shot:%d %2.2d:%2.2d %d.%2.2dV", shotcount, tic/3600000, (tic%3600000)/60000, battery/1000, (battery%1000)/10))

   if (k==1) then sleep_disable() end

   shoot()

   sleep(200)

   if( p==1) then switch_mode(0) end

   if (k==1) then sleep_enable() end

   print( "next shot wait ..", (nextshot-get_tick_count())/1000 )
   repeat
      if( (p==1) and (lens_retract < (get_tick_count()+2000) )) then
         switch_mode(1)
         switch_mode(0)
         lens_retract = get_tick_count() + retract
      end
      set_backlight(b)
      battery = (get_vbatt() + (battery*15)) / 16
      if ( battery < v ) then abort=true end
      if ( is_pressed("menu")) then abort=true end
      sleep(100)
   until ((nextshot < (get_tick_count()+3000) ) or abort)
until ( abort )

-- all done - user abort or battery below limit

if( battery < v ) then
   log_to_file("battery limit reached")
else
   log_to_file("user abort")
end

if ( d==1 ) then
   print("unblanking display")
   count=5
   repeat
      disp = get_prop(props.DISPLAY_MODE)
      if ( disp ~= disp_save) then
         click("display")
         sleep(500)
      end
      count=count-1
   until ((disp==disp_save) or (count==0))
end
restore()
Advertisement