ゆるく楽しむプログラミング

自己保持回路付き ラーメンタイマー

自分自身の電源スイッチを操作する回路を付けたラーメンタイマーを作ってみた
・スイチは押しボタンが一個だけ、節電のために普段はスイッチOFF
・ボタンPushでスイッチON
・3分間だけ動作して、3分たったらメロディーを演奏して
・自分自身のスイッチOFF


自己保持回路

トランジスタを使用したスイッチの基本形(エミッタ接地)
ベース-エミッタ間に電流が流れると、コレクタ-エミッタ間にも電流が流れる


コレクタ側に接続する負荷をATTiny85に変更、エミッタに流す電流をATTiny85で制御
ただし、この接続だとエミッタに電流を流さないとATTiny85が起動せず、ATTiny85が起動しないとエミッタエミッタに電流がながれないのでスイッチが入らない


手動スイッチを並列に接続
スイッチを押すとATTiny85が起動、ベース-エミッタに電流が流れ、コレクタ-エミッタにも電流流れる
ATTiny85起動後はスイッチを離してもベース-エミッタの電流は途切れないのでスイッチが切れる事はない


スピーカーと動作確認用のLEDを付けて完成
トランジスタには2SC1815を使用、ATTiny85の1番ピンはリセットが掛かる恐れがあるのでプルアップ接続しておきます
プルアップ用の抵抗は10KΩ、電流制限用の抵抗は1KΩを付けています
ベースエミッタ間に100μF位の電解コンデンサを入れた方が良いかも


RamenTimer.zip

※ <>を全角<>に置き換えています。コピペの際は注意してください。
// ATTiny85 ラーメンタイマー
#define SPKPIN 1    // スピーカー
#define POWERPIN 3  // 電源スイッチ
#define LED 0       // 動作確認用LED

void setup() {
  pinMode(POWERPIN,OUTPUT) ;
  pinMode(LED,OUTPUT) ;
  pinMode(SPKPIN,OUTPUT) ;

  // --- 電源ON
  digitalWrite(POWERPIN,HIGH) ;
  digitalWrite(LED,HIGH) ;
  digitalWrite(SPKPIN,LOW) ;

  // ----- 3分待つ -----
  unsigned long time = millis();
  int blink = HIGH ;
  while(millis() - time < 1000L * 60 * 3) {
    blink = (blink == HIGH) ?LOW : HIGH ;
    digitalWrite(LED,blink) ;   // Lチカ
    delay(500) ;
  }
  // --- チャルメラ演奏
  digitalWrite(LED,HIGH) ;
  Sound( ) ;
  delay(1000) ;
  Sound( ) ;
  // --- 電源OFF
  digitalWrite(POWERPIN,LOW) ;
}

void loop() {
}

// --- チャルメラ演奏ルーチン
void Sound( ) {
  tone(SPKPIN, 392, 200); delay(200);
  tone(SPKPIN, 440, 200); delay(200);
  tone(SPKPIN, 494, 800); delay(800);
  tone(SPKPIN, 440, 200); delay(200);
  tone(SPKPIN, 392, 200); delay(800);
  tone(SPKPIN, 392, 200); delay(200);
  tone(SPKPIN, 440, 200); delay(200);
  tone(SPKPIN, 494, 200); delay(200);
  tone(SPKPIN, 440, 200); delay(200);
  tone(SPKPIN, 392, 200); delay(200);
  tone(SPKPIN, 440, 1000); delay(1000);
}

解説動画