AVR chips have a couple of built-in ways to reduce power usage: "sleep" modes, and "Power Reduction Modes". Sleep modes stop the running program (which is the biggest power hog), waiting for an interrupt to wake it up, while Power Reduction Modes can be used any time (including while the processor is asleep).
The sleep modes available to you depends on which type of chip you're on. An ATmega168 may have all of them, while an ATTiny45 only has a couple.
While the processor is asleep, the main program won't be running. The only way to wake it up is via an interrupt, and sometimes only an external INT0 interrupt (depending on the sleep mode).
To set the sleep desired sleep mode, put this in your code:
and to actually put it to sleep:
Make sure you have an interrupt enabled, or the processor will never wake up.
Power Reduction Mode:
In addition to putting the whole thing to sleep, you can also turn off parts of the chip that you aren't using by using the chip's Power Reduction Manager.
Like, if you're not using the ADC, shut it off:
Or if your project doesn't need to do any serial communication:
For maximum power reduction, just run this:
then enable what you want you actually need.