私は電気工事士なので廊下の電灯は人感センサーに変えたのですが、その前で電灯を消すと暗がりを歩く事になるので、LEDライトに遅延スイッチを付けたものを作ってみました。
要求仕様はスイッチを押したら30秒くらいの間点灯して、消灯するもとのします。
遅延回路は古式ゆかしい555でも出来ますが、いろいろいじれるようにマイコンを使うことにしました。
マイコンはPlatformIOでビルドできる8ピンのATTiny13Aにします。
千石のジャンク袋に入っていたLEDライトを使いそれが12Vなので、12Vアダプタで給電して、78L05でATTiny13Aの電源を作ります。
回路とコードはだいだい1日でできたのですが、次の日に欲を出して省電力化しようと思いいろいろ調べました。
CPUクロックを128kHzにするといいということで、fuseを焼いたところUSBTinyISPでATTiny13Aが見えなくなりました。
ATTiny13Aの128kHz設定についてはいろいろなところに情報がありますが、大変危険なのでお勧めしません。
私は以前でんし研(ページが無くなってました)さんのATTiny用のリセッターを作ってあったのでどうにか復活できましたが、なんらかのミスがあると高電圧ライターやリセッターがないと使えないチップになります。
今は2Fでコード書いて1Fで焼いてるので効率が悪く、暖かくなったらまたいじりたいと思います。
#include <avr/sleep.h>
#define LED PB0 // Pin 5
#define RELAY PB4 // Pin 3
#define VOLUME A3 // Pin 2
#define SW PB1 // Pin 6 (INT0)
ISR(INT0_vect)
{
}
void setup()
{
pinMode(LED,OUTPUT);
digitalWrite(LED, LOW);
pinMode(RELAY,OUTPUT);
digitalWrite(RELAY, LOW);
pinMode(SW, INPUT_PULLUP);
GIMSK |= (1 << 6);
sei();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
void loop()
{
int vol;
sleep_mode();
digitalWrite(LED, HIGH);
digitalWrite(RELAY, HIGH);
vol = analogRead(VOLUME);
delay(vol * 2 + 200);
digitalWrite(LED, LOW);
digitalWrite(RELAY, LOW);
}
LEDライトを筒に貼ったのは、光が360度の方向に届くようにするためです。
実際に使ってみたところ、蛍光灯のオンオフでsleepが解除してしまう事があります。誤動作なのですが、ちょっと便利です。
逆転の発想でAC電源のノイズを感知して安定的に動作する仕組みが作れてたら面白いと思います。