He hecho un clon de arduino que tiene un sensor PIR, tengo la intención de ejecutarlo en 2AA, estoy usando el convertidor de refuerzo LT1302, porque el sensor PIR funciona a 5 V, si se detecta movimiento, el mensaje se enviará a mi sitio web utilizando el tablero de ruptura cc3000 de adafruit. Todo está funcionando, pero ahora estoy agregando el bloque de código de suspensión para ahorrar energía. Para propósitos de prueba, escribí el siguiente código.
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
//PIR sensor,led and disconnect button
#define PIR 2 //INT 0 PIN 4
#define DISCONNECT 19//A5 pulled up, not used for now
#define LED 16 //A2 high on
volatile int pirState = LOW; // we start, assuming no motion detected
volatile char sleep;
int val = 0; // variable for reading the pin status
void static inline pwrDown(void);
void setup() {
ADCSRA = 0; //Disable ADC
// turn off various modules
//PRR =0x81; //0b10000001; TWI and ADC off
// 7 1 0
//TWI uart ADC
pinMode(LED, OUTPUT); // declare LED as output
pinMode(PIR, INPUT); // declare sensor as input
Serial.begin(9600);
attachInterrupt(0, motion, RISING);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep = 1;
// cli();
// pwrDown();
}
void loop(){
delay(500);
Serial.println(pirState);
digitalWrite(LED,pirState);
cli();
pwrDown();
}
//ISR for INT0
void motion() {
pirState = !pirState;
}
void static inline pwrDown(void)
{
//PRR =0xFF; //turn off all modules
MCUCR = MCUCR | bit(BODSE) | bit(BODS); //timed sequence
MCUCR = MCUCR & ~bit(BODSE) | bit(BODS);//to turn off BOD in sleep
sei(); //enable int
sleep_mode(); //sleeping set SE got sleep and clear SE when waking up
//sleep_enable(); //slee_mode() does all three.
//sleep_cpu();
//sleep_disable();
// PRR =0x81; //0b10000011; turn off all except uart and spi
// sleep = 0;
}
Al funcionar, el LED se enciende y se apaga como se supone que debe hacerlo, el bucle no se ejecuta de manera continua significa que el AVR está en modo de apagado, pero para Serial.println obtengo un valor de basura. por ejemplo, j para 1 y Lc para 0