空いたペットボトルにLEDストリングを入れてきらきら光らせる装飾品です。
電源は単4電池1本を昇圧してマイコンとLEDの駆動に使います。ペットボトルのふた部分にプッシュスイッチを付けて、押したら点灯・点灯モード変更して、一定時間がたつと消灯するようにしました。
LEDストリング2本を交互にフェードイン・フェードアウトさせてゆらゆら光っている感じを出すようにしました。
【部品】
・LEDストリング:USB LED Micro Rice Wire Copper String Fairy Lights (中華) 25cm程度 2本
・昇圧モジュール: DC-DC 0.9-3.3V to 3.3V 500mA 0.9-5V to 5V Mini Step Up Boost Power Module DC to DC For Arduino Voltage Converter Module (中華) 1個
・マイコン:ATTiny13A 1個
・トランジスタ: 2sc1815 2個
・抵抗: 1KΩ 2個 (ベース電流制限用)
【注意点】
今回使用した昇圧回路は安かろう悪かろうなので注意が必要です。最初に使用したモジュールは漏電していたため、スリープモードにしていても1週間もしないで電池がなくなってしまいました。モジュールを取り替えたら数か月スリープさせていても電池は消耗しておらず、スイッチを押せば光ります。
そのうちに写真も載せます。
# include <avr/interrupt.h>
# include <avr/sleep.h>
# define SW 2
# define LEDa 0
# define LEDb 1
# define MAX 127 // 最高輝度を50%(127/256)に制限
# define LIFE 9000 // タイムアウトを定義
# define BLINK 4 // 明るさ3段階+ゆらゆらモード
char mode;
int i, j, k, l, phase;
void setup() {
// ピンモード初期化
pinMode(LEDa, OUTPUT);
pinMode(LEDb, OUTPUT);
pinMode(SW, INPUT_PULLUP);
digitalWrite(LEDa, LOW);
digitalWrite(LEDb, LOW);
// その他変数初期化
i=LIFE;
mode=0;
//スリープのための設定
// set timer to 0.5s
WDTCR |= (0<<WDP3) | (1<<WDP2) | (0<<WDP1) | (1<<WDP0);
// Set watchdog timer in interrupt mode
WDTCR |= (1<<WDTIE);
WDTCR |= (0<<WDE);
/* 省電力のために設定したかったけどメモリが足りなかったので諦め
//ADCSRA &= ~(1 << ADEN); // disable ADC
//ACSR |= _BV(ACD); //Disable analog comparator
*/
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei(); // Enable global interrupts
sleep_mode();
}
ISR(WDT_vect) {
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(SW)==LOW){
analogWrite(LEDb, 10);
//analogWrite(LEDa, 10);
do{
delay(10);
}while(digitalRead(SW)==LOW);
mode=(mode + 1) % (BLINK+1);
i=LIFE;
}
if(mode==0){
i=0;
j=0;
k=0;
}else if(mode<BLINK){ // 一定の明るさで点灯 3段階切り替え (段階数はBLINKで定義)
j=constrain(i/10, 0, MAX >> (BLINK - mode));
k=j;
}else if(mode==BLINK){ // ゆらゆら光らせるモード
l=MAX;
phase=abs((i % 101) - 50);
j=(phase*l)/50;
k=l-j;
}
analogWrite(LEDb, j);
analogWrite(LEDa, k);
if(i>0){
i--;
delay(20);
}else{ // タイムアウトしたら初期化してスリープする
setup();
}
}