Interrupt driven pulse counter and sleep mode

This sketch detects pulses and prints the character P to the serial port.

In order to reduce power consumption, the Atmega 328 is put into sleep mode between pulses. The interrupt pulse input (digital input pin 2 or 3) is used to wake the device.

Unfortunately a power value can't be calculated as the timers do not run in sleep mode.

Kudos to Donal Morrissey for his clear tutorial on Arduino sleep mode: Sleeping Arduino

#include <avr/sleep.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup()
{
  Serial.begin(115200);
  
  /* Setup the interrupt pin */
  attachInterrupt(1, onPulse, FALLING);
  
  cbi( SMCR,SE );      // sleep enable, power down mode
  cbi( SMCR,SM0 );     // power down mode
  sbi( SMCR,SM1 );     // power down mode
  cbi( SMCR,SM2 );     // power down mode
}

void loop()
{
  //-------------------------------------------------------------
  // 1) Enter sleep mode
  //-------------------------------------------------------------
  //cbi(ADCSRA,ADEN);    // switch Analog to Digital converter OFF
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();

  // The arduino is now sleeping...
  
  //-------------------------------------------------------------
  // 2) Program will resume from here on interrupt
  //-------------------------------------------------------------
  sleep_disable();
  sbi(ADCSRA,ADEN);    // switch Analog to Digitalconverter ON
  
  Serial.print('P');
  
  delay(10);
}

void onPulse()
{ 
  // It continues in the main loop 
}