昨年作った ハロウィン用LEDチカを今年も作ってみました
今回は秋月のLEDストリングを使ってやってみます。
LEDストリングは4-5個づつ切り取って、抵抗値は 220Ωでやってみます。
今回はATTiny13Aのウォッチドッグタイマーを使ってDeppSleepをさせながら動かしてみました。
512msecのWDタイマーで0.5sec点灯 1sec消灯にしてみます。
ウォッチドッグの省電力化はなかなかです。CR2032一個で2週間くらい点灯しっぱなしですが、まだ光っています。
消費電力を計算してみます LEDの電圧降下2.8V として
(3-2.8)/220 * 2 = 0.9 mA
これが連続ではなく1.5sec間に0.5sec なので消費電力約1/3。 CR2032ボタン電池の容量が 220mAHなので、、、ATTinyの待機電流は10μAとかなのでとりあえず無視。
220/(0.9/3) = 733h ... 30日
大分長持ちする計算です。少なくとも20日くらいは持つと考えて良いでしょう。
スケッチはこんな感じ
/*
Blink 2 LEDs
for ATTiny13 LED Board
2018/10/17
PCINT5/A0/D5/RST |1---O---8| VCC
*PCINT3/A3/D3 |2 7| D2/A1/INT0/PCINT2*
PCINT4/A2/D4 |3 6| D1/PWM/PCINT1
GND |4-------5| D0/PWM/A0/PCINT0*
*Use PIN
PIN5 (D0) ... PCINT SW ON/OFF connect to GND
*/
//#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define LED1 3
#define LED2 4
#define LED3 0
#define LED4 1
#define LED5 2
volatile int pcint;
volatile bool wait;
/*
* Random
*/
unsigned int randshort(unsigned int init)
{
static unsigned int seed;
if(init!=0){
seed ^= init;
}
seed *= 52341;
seed += 37;
return(seed ^ 0x1234);
}
ISR(PCINT0_vect) {
if(digitalRead(0)==0){
pcint=pcint ^ 1;
}
}
void setup() {
randshort(analogRead(0));
pinMode(LED1, OUTPUT);
// pinMode(LED2, OUTPUT);
// pinMode(LED3, OUTPUT);
// pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(0, INPUT_PULLUP);
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT0); // Use PB1 as interrupt pin for My Board
// set timer to 0.5s
WDTCR |= (1<<WDP2) | (1<<WDP0);
// set timer to 4 sec
// WDTCR |= (1<<WDP3);
// Set watchdog timer in interrupt mode
WDTCR |= (1<<WDTIE);
WDTCR |= (0<<WDE);
sei(); // Enable global interrupts
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
ISR(WDT_vect) {
}
void loop() {
static unsigned char d;
static unsigned char t;
if(pcint){
sleep_mode();
return;
}
// d = randshort(0) & 0x60;
// digitalWrite(LED1,(d & 0x11));
// digitalWrite(LED2,(d & 0x22));
// digitalWrite(LED4,(d & 0x44));
// digitalWrite(LED5,(d & 0x88));
// digitalWrite(LED3,(d & 0x41));
d = randshort(0) & 0x05;
// d++;
digitalWrite(LED1,(d));
digitalWrite(LED5,(d^0x01));
// digitalWrite(LED2,(d^0x01));
sleep_mode();
digitalWrite(LED1,0);
digitalWrite(LED5,0);
// digitalWrite(LED2,0);
sleep_mode();
sleep_mode();
}
Blink 2 LEDs
for ATTiny13 LED Board
2018/10/17
PCINT5/A0/D5/RST |1---O---8| VCC
*PCINT3/A3/D3 |2 7| D2/A1/INT0/PCINT2*
PCINT4/A2/D4 |3 6| D1/PWM/PCINT1
GND |4-------5| D0/PWM/A0/PCINT0*
*Use PIN
PIN5 (D0) ... PCINT SW ON/OFF connect to GND
*/
//#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define LED1 3
#define LED2 4
#define LED3 0
#define LED4 1
#define LED5 2
volatile int pcint;
volatile bool wait;
/*
* Random
*/
unsigned int randshort(unsigned int init)
{
static unsigned int seed;
if(init!=0){
seed ^= init;
}
seed *= 52341;
seed += 37;
return(seed ^ 0x1234);
}
ISR(PCINT0_vect) {
if(digitalRead(0)==0){
pcint=pcint ^ 1;
}
}
void setup() {
randshort(analogRead(0));
pinMode(LED1, OUTPUT);
// pinMode(LED2, OUTPUT);
// pinMode(LED3, OUTPUT);
// pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(0, INPUT_PULLUP);
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT0); // Use PB1 as interrupt pin for My Board
// set timer to 0.5s
WDTCR |= (1<<WDP2) | (1<<WDP0);
// set timer to 4 sec
// WDTCR |= (1<<WDP3);
// Set watchdog timer in interrupt mode
WDTCR |= (1<<WDTIE);
WDTCR |= (0<<WDE);
sei(); // Enable global interrupts
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
ISR(WDT_vect) {
}
void loop() {
static unsigned char d;
static unsigned char t;
if(pcint){
sleep_mode();
return;
}
// d = randshort(0) & 0x60;
// digitalWrite(LED1,(d & 0x11));
// digitalWrite(LED2,(d & 0x22));
// digitalWrite(LED4,(d & 0x44));
// digitalWrite(LED5,(d & 0x88));
// digitalWrite(LED3,(d & 0x41));
d = randshort(0) & 0x05;
// d++;
digitalWrite(LED1,(d));
digitalWrite(LED5,(d^0x01));
// digitalWrite(LED2,(d^0x01));
sleep_mode();
digitalWrite(LED1,0);
digitalWrite(LED5,0);
// digitalWrite(LED2,0);
sleep_mode();
sleep_mode();
}
----------------------