Power save with Pro Mini, PIR Sensor, and RF Transmitter (External 4 x AA Batts)

Just completed my first project and all is working well. I created a wireless motion sensor that control the lights in my kids room. The only problem is the batteries in the motion sensor only last about 5 days. Not going to work as a long term solution; I’ll end up spending more on batteries than I do on the wasted electricity by them leaving the lights on all the time. Below is my hardware configuration:

Transmitter:
Arduino Pro Mini, ATmega328, 5v
PIR Sensor
433mhz RF Transmitter
Powered by 4 x AA batteries

Receiver:
Arduino Pro Mini, ATmega328, 5v
433mhz RF receiver
120v relay to power the overhead light
120v to 5v buck converter to power the Arduino

Here is the working sketch for my Transmitter:

// Wireless PIR Transmit

#include <VirtualWire.h>

//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 45;        

int led_pin = 13;
int transmit_pin = 4;
int pir_pin = 9;
int val = 0; 
int pir_state = LOW;

void setup()
{
  Serial.begin(9600);
  vw_set_tx_pin(transmit_pin);
  vw_setup(4000); // Transmission rate
  pinMode(led_pin, OUTPUT);
  pinMode(pir_pin,INPUT);
   
  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++)
     {
       Serial.print(".");
       delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
}
 
void loop()
{
  char msg[1] = {'0'};
  // Get sensor value
  val = digitalRead(pir_pin);
  // Change message if motion is detected
  if (val == 1)
  {
      msg[0] = '1';
      digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
      vw_send((uint8_t *)msg, 1);
      vw_wait_tx(); // Wait until the whole message is gone
      if (pir_state == LOW) 
      {
        Serial.println("Motion detected!");
        pir_state = HIGH;
      }
   }
 else
  {
     msg[0] = '0';
     digitalWrite(led_pin, LOW);
     vw_send((uint8_t *)msg, 1);
     vw_wait_tx(); // Wait until the whole message is gone
     if (pir_state == HIGH)
     {
       Serial.println("Motion ended!");
       pir_state = LOW;
     }
   }
}

And the Receiver:

// Relay Receive
#include <VirtualWire.h>

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;

// Pins definition
const int led_pin = 13;
const int receive_pin = 5;
int relay_pin = 9; 
 
void setup()
{
   Serial.begin(9600); // Debugging only
   // Initialise the IO and ISR
   vw_set_rx_pin(receive_pin);
   vw_setup(4000); // Transmission rate
   // Start the receiver PLL
   vw_rx_start();
   // Set LED and realy pins
   pinMode(led_pin, OUTPUT);
   pinMode(relay_pin, OUTPUT);
   digitalWrite(relay_pin, LOW);
}
 
void loop()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
   // Check if a message was received
    if (vw_get_message(buf, &buflen)) 
    {
      if(buf[0]=='1')
      {
        digitalWrite(led_pin, HIGH);   //the led visualizes the sensors output pin state
        digitalWrite(relay_pin, LOW);
        if(lockLow)
        {  
          //makes sure we wait for a transition to LOW before any further output is made:
          lockLow = false;            
          Serial.println("---");
          Serial.print("motion detected at ");
          Serial.print(millis()/1000);
          Serial.println(" sec"); 
          delay(50);
         }         
         takeLowTime = true;
        }
        
     if(buf[0]=='0')
     {
       digitalWrite(led_pin, LOW);  //the led visualizes the sensors output pin state
       digitalWrite(relay_pin, HIGH);

       if(takeLowTime)
       {
         lowIn = millis();          //save the time of the transition from high to LOW
         takeLowTime = false;       //make sure this is only done at the start of a LOW phase
       }
       //if the sensor is low for more than the given pause, 
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause)
       {  
           //makes sure this block of code is only executed again after 
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
       } 
     }
   }
}

In my search for ways to save battery power by putting the arduino in to a sleep state, I found information on pin change events and interrupts from this site:

So, I tried to combine some of that code with my pre-existing transmitter code and came up with the following that does not work:

// Wireless PIR Transmit

#include <Ports.h>
#include <RF12.h>
#include <avr/sleep.h>
#include <PinChangeInt.h>
#include <VirtualWire.h>

ISR(WDT_vect) { Sleepy::watchdogEvent(); }       

int led_pin = 13;
int transmit_pin = 4;
int pir_pin = 9;

int val = 0; 
int pir_state = LOW;

void setup()
{
  Serial.begin(9600);
  vw_set_tx_pin(transmit_pin);
  vw_setup(4000); // Transmission rate
  pinMode(pir_pin,INPUT);
  pinMode(led_pin, OUTPUT);

  PRR = bit(PRTIM1);                           // only keep timer 0 going
  ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC);   // Disable the ADC to save power
  PCintPort::attachInterrupt(pir_pin, wakeUp, CHANGE);  
}

void wakeUp(){}
 
void loop()
{
  char msg[1] = {'0'};
  // Get sensor value
  val = digitalRead(pir_pin);
  // Change message if motion is detected
  if (val == 1)
  {
      msg[0] = '1';
      digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
      vw_send((uint8_t *)msg, 1);
      vw_wait_tx(); // Wait until the whole message is gone
      if (pir_state == LOW) 
      {
      Serial.println("Motion detected!");
      pir_state = HIGH;
      }
   }
 else
 {
   msg[0] = '0';
   digitalWrite(led_pin, LOW);
   vw_send((uint8_t *)msg, 1);
   vw_wait_tx(); // Wait until the whole message is gone
   if (pir_state == HIGH)
   {
      Serial.println("Motion ended!");
      pir_state = LOW;
   }
  }
  Sleepy::powerDown();
}

I am a programming novice, with the exception of MS VB. I do know from my research that Delay() does not work when using interrupts and I removed them but still no luck. Appreciate any advice that can get me back on track.

Sean