В любых автономных устройствах самая острая проблема - это энергопотребление. Отключение устройства по таймеру или включение.выключение по нажатию кнопки можно реализовать с помощью спящего режима, но ток сна велик и забытое устройство будет полностью разряжено когда его снова возьмут в руки. Для сбережения заряда аккумулятора выключенного устройства и не использовать кнопку без фиксации приведу пример схемы на Bascom-AVR.
Схема управления питанием основана на небольшом количестве дискретных элементов. В микроконтроллере AVR использует одно прерывание:

Нажатие на кнопку S1 приводит к открытию транзистора Q1. Напряжение от батареи идет в схему. Что бы транзистор Q1 не закрылся, нужно открыть транзистор Q2. Для этого подаем на затвор положительный потенциал. Пока на затворе Q2 будет положительный потенциал, схема будет в состоянии "включено". Для перевода в "выключено" нужно снять подачу напряжения с этого вывода. Оба транзистора закроются тем самым обесточивая электро схему.
В схеме лучше использовать транзисторами с логическим уровнем управления, чтобы они полностью открывались от напряжения питания схемы. Тестовая схема была собрана на первых попавшихся под руку транзисторах. Для Q1 использовался IRF5305, а для Q2 - IRF530. Оба транзистора от 5 вольт открываются почти полностью.

Пример кода для включение и выключение питания по нажатию кнопки.
$regfile = "m8def.dat" $crystal = 1000000 Dim flag as Byte 'переменная для выполнения основной программы Config PORTB.0=OUTPUT 'выход светодиода Led alias portb.0 Config portd.3 =OUTPUT 'управление питанием pwr alias portd.3 Config INT0=low level 'кнопка включения/выключения On Int0 Zapusk: Enable int0 'разрешаем прерывания Enable interrupts 'основной цикл Do If flag=1 then 'выполнение основной программы Led=1 End if Loop end 'прерывание при нажатии на кнопку zapusk: toggle pwr 'включение / выключение flag=1 'поднимаем флаг do loop until pind.2=1 'пока нажата кнопка крутимся здесь waitms 100 Gifr = 64 return
Пример кода с защитой от случайного включения.выключения - используется задержка при нажатии. Код незначительно изменен, добавлен счетчик трехсекундной задержки.
$regfile = "m8def.dat" $crystal = 1000000 dim flag as Byte 'переменная для выполнения осовной программы dim a as Byte 'для организации задержки config PORTB.0=OUTPUT 'выход светодиода led alias portb.0 config portd.3 =OUTPUT 'управление питанием pwr alias portd.3 config INT0=low level 'кнопка включения/выключения On Int0 Zapusk: enable int0 'разрешаем прерывания enable interrupts 'основной цикл do if flag=1 then 'выполнение основной программы '.... '.... end if loop end 'прерывание при нажатии на кнопку zapusk: flag=1 'поднимаем флаг do incr a wait 1 if a=3 then 'если прошло 3 секунды toggle pwr 'включение / выключение toggle led goto ext 'выход из цикла end if loop until pind.2=1 'пока нажата кнопка крутимся здесь ext: a=0 waitms 100 Gifr = 64 return
Программу можно немного доработать - добавить таймер с помощью которого по отсчету времени бездействия можно принудительно отключить питание на устройстве.