ATTiny13Aが省電力化できない
ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。
仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。
また、途中で再度、割り込みがあっても時間の延長はしません。
LR44電池2個で1年以上、動けばと思っています。
コードも拙い上、回路図もまともに書けない初心者ですが、よろしくお願いいたします。
#include <avr/wdt.h>
#include <avr/sleep.h>
//LED_PIN
#define LED_PIN (5)
//interrupt pin
#define ACC_IN (2)
//Time_select
#define TIME_PIN1 (0)
#define TIME_PIN2 (4)
#define TIME_PIN3 (1)
volatile int sleep_flg=0;
volatile int counter;
int count_max=15;//4second * 15 = 60 second
int wait_minutes=1;//wait_time (minutes)
//arduino wakeup interrupt
void wakeUp()
{
//wdt_reset();
//sleep end
sleep_flg = 0;
//counter reset
counter = 0;
}
//watch dog timer setup
void wdt_set()
{
wdt_reset();
cli();
MCUSR = 0;
WDTCR |= 0b00011000; //WDCE WDE set
WDTCR = 0b01000000 | 0b100000;//WDIE set |WDIF set scale 4 seconds
sei();
}
//watch dog timer unset
void wdt_unset()
{
wdt_reset();
cli();
MCUSR = 0;
WDTCR |= 0b00011000; //WDCE WDE set
WDTCR = 0b00000000; //status clear
sei();
}
//watch dog timer call
ISR(WDT_vect)
{
//wdt_reset();
if(sleep_flg == 1)
{
counter++;
if( counter >= (count_max * wait_minutes))
{
//sleep end
sleep_flg = 0;
//counter reset
counter = 0;
}
}
else
{
}
}
//status reset
void init_status()
{
counter=0;
}
//sleep arduino
void sleep()
{
wdt_set(); //watch dog timer set
sleep_flg=1; //enable on sleep flag
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set sleep mode
attachInterrupt(0,wakeUp, RISING); //set level interrupt
while(sleep_flg){
noInterrupts(); //cli();
sleep_enable();
interrupts(); //seii();
sleep_cpu(); //cpu sleep
sleep_disable();
byte adcsra_old = ADCSRA; //NEW
ADCSRA = 0; //NEW
ADCSRA = adcsra_old; //NEW
}
wdt_unset(); //watch dog timer unset
detachInterrupt(0); //unset level interrupt
}
//set up
void setup()
{
init_status();
pinMode(LED_PIN,OUTPUT);
pinMode(ACC_IN, INPUT);
pinMode(TIME_PIN1, INPUT);
pinMode(TIME_PIN2, INPUT);
pinMode(TIME_PIN3, INPUT);
}
//main loop
void loop()
{
if(!digitalRead(ACC_IN))
{
sleep(); //sleep
if (digitalRead(0) == HIGH) {
digitalWrite(5, HIGH);
//delay(1800000); // Wait for 1800 second(s)
uint16_t i;
for (i = 0; i < 10*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
if (digitalRead(4) < HIGH) {
digitalWrite(5, HIGH);
//delay(600000); // Wait for 600 second(s)
uint16_t i;
for (i = 0; i < 30*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
if (digitalRead(1) < HIGH) {
digitalWrite(5, HIGH);
//delay(36000000000); // Wait for 3600 second(s)
uint16_t i;
for (i = 0; i < 60*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
delay(1000); // Wait for 1 second(s)
}
}
}
sleep(); //sleep
}
}
お礼
回答ありがとうございます。