I got it done, i'll sharing my source:
#include <avr/interrupt.h>
#include <avr/sleep.h>
void setup() {
pinMode(13, OUTPUT);
pinMode(9, OUTPUT);
pinMode(2, INPUT_PULLUP);
for(int i = 0; i<4; i++){
digitalWrite(9, HIGH);
delay(50);
digitalWrite(9, LOW);
delay(50);
}
digitalWrite(13, HIGH);
Serial.begin(9600);
}
boolean in_sleep = false;
boolean on_off_pressed = false;
void sleep(){
in_sleep = true;
digitalWrite(13, LOW);
//1\8 de 16Mhz
CLKPR = 0x80;
CLKPR = 0x06;
for (byte i = 0; i <= A7; i++){
if(i == 2)
continue;
pinMode (i, OUTPUT);
digitalWrite (i, LOW);
}
// disable ADC
ADCSRA = 0;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
// turn off brown-out enable in software
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
//sleep_cpu ();
interrupts();
attachInterrupt(0, wake, LOW);
sleep_mode();
sleep_disable();
detachInterrupt(0);
}
void wake(){
in_sleep = false;
//1\8 de 16Mhz
CLKPR = 0x80;
CLKPR = 0x01;
//Internal Reset
asm volatile (" jmp 0");
/*digitalWrite(13, HIGH);
delay(500);
*/
//delay(5);
noInterrupts();
}
void loop() {
if (digitalRead(2)== LOW && in_sleep == false){
Serial.println("Sleep!");
delay(300);
sleep();
}
}
BTW, something is not right, my arduino out of sleeping consumes 30.4mA and on sleeping 24.1mA.
Might this be because it's a Chinese replica, or i have something wrong?
(I'm using arduino Pro mini v3)