ATtiny4313を使ったスイッチインターフェイス


 

 000 ダイレクトモード(スイッチを押すと出力オン、離すとオフ)
 001 ラッチモード(スイッチを押すごとに出力オン、オフをくり返す)
 010 ONパルスモード(スイッチを押すとパルス出力する)
 011 ON・OFFパルスモード(スイッチを押すとき、離したときにパルス出力する)
 100 タイマーモード(スイッチを押すと、5秒間出力オンする)
 101 タイマーモード(   〃    10秒   〃   )
 110 タイマーモード(   〃    30秒   〃   )
 111 タイマーモード(   〃    60秒   〃   )

 3つのディップスイッチの切り替えでモードを変更する





回路





基板





000 ダイレクトモード:

  スイッチを押すと出力オン、離すとオフする。
   (画像をクリックすると動画を再生)



001 ラッチモード:
  スイッチを押すごとに出力オン、オフをくり返す。長押ししてもチカらない
   (画像をクリックすると動画を再生)



010 ONパルスモード:
  スイッチを押すとパルス出力する。
  押してすぐにスイッチから離せない時や素早くマウスクリック出来ない時に有効
   (画像をクリックすると動画を再生)



011 ON・OFFパルスモード:
  スイッチを押したときと離したときにパルス出力する。
  ラッチ入力の機器をダイレクトモードに変換出来る
   (画像をクリックすると動画を再生)



100 タイマーモード(5秒):
  スイッチを押すと5秒間出力オンする
  押しっぱなしになっても押し始めから5秒で出力オフする
   (画像をクリックすると動画を再生)



  5秒以上押し続けても、押し始めから5秒で出力オフする
   (画像をクリックすると動画を再生)



/* ラッチ、パルス&タイマー テストプログラム(ATtiny4313用)
 	000 ダイレクトモード
 	001 ラッチモード
 	010 ONパルスモード(ON時にパルス)
 	011 ON・OFFパルスモード(ON時とOFF時にパルス)
 	100 タイマーモード(5秒)
 	101 タイマーモード(10秒)
 	110 タイマーモード(30秒)
 	111 タイマーモード(60秒) */

//Pin番号の指定
#define input_Pin 0    //外部スイッチ
#define dip100_Pin 5   //ディップスイッチ  百位
#define dip10_Pin 6    //ディップスイッチ  十百位
#define dip1_Pin 7     //ディップスイッチ  一位
#define LED 9          //LED出力
#define RELAY 10       //リレー出力

//状態の定義
#define SW_ON LOW    //入力:ONのときLOW(pullup抵抗なので)
#define SW_OFF HIGH  //      OFFのときHIGH
#define OUT_ON HIGH   //出力:HIGHでON
#define OUT_OFF LOW //      LOWでOFF
#define FLG_ON 1     //フラグ
#define FLG_OFF 0

//変数の定義
int mode = 0;             //入力モード(3ケタの値)
int SW_state = SW_OFF;    //外部スイッチ入力の入力状態
int old_SW_state = SW_OFF;// 古い外部スイッチの状態 (初期設定はOFF)
int LED_state = FLG_OFF;  // LED点滅の状態 (初期設定はOFF)
int pulse_time = 100;	  //パルス出力時間(ミリ秒)
int time = 0;             //タイマー設定時間(秒)

//タイマー関数の定義
//    スイッチを押し始めてから指定時間(秒)の間出力を続ける。
//  指定時間をすぎて押し続けていても指定時間が来たら出力をやめる。
void timer(int sec){
  if(digitalRead(input_Pin) == SW_ON){  //外部スイッチが押されて、かつ
    if(SW_state == 0){        //OFFからONになったときだけ動作する
      SW_state = 1;
      digitalWrite(LED,OUT_ON);		//LED出力ON
      digitalWrite(RELAY,OUT_ON);	//リレー出力ON
      int kaisuu = sec/30;  //delay関数の引数が32767以下になるように分割
      for (int i=0; i < kaisuu; i++){
        delay(30*1000);
      }
      delay((sec - kaisuu*30)*1000);
      digitalWrite(LED,OUT_OFF);	//LED出力OFF
      digitalWrite(RELAY,OUT_OFF);	//リレー出力OFF
    } 
  }
  else if(SW_state == 1){  //ONからOFFになったとき
    SW_state = 0;
  }
}

void setup() {
  //Pinモードの設定
  pinMode(input_Pin,INPUT);   //外部スイッチ用入力
  pinMode(dip100_Pin,INPUT);  //ディップスイッチ
  pinMode(dip10_Pin,INPUT);   //ディップスイッチ
  pinMode(dip1_Pin,INPUT);    //ディップスイッチ
  pinMode(LED,OUTPUT);   //LEDに出力、インジケーター
  pinMode(RELAY,OUTPUT); //リレーに出力

  //出力Pinの初期化
  digitalWrite(LED,OUT_OFF);  //LED出力をOFFに
  digitalWrite(RELAY,OUT_OFF);//リレー出力をOFFに

  //ディップスイッチの状態を読みこみ変数modeに3ケタの整数として格納
  if (digitalRead(dip100_Pin) == SW_ON) {  
    mode = mode + 100;   // pin5がONならmodeの百位を1にする
  }
  if (digitalRead(dip10_Pin) == SW_ON) {
    mode = mode + 10;    // pin6がONならmodeの十位を1にする
  }
  if (digitalRead(dip1_Pin) == SW_ON) {
    mode = mode + 1;    // pin7がONならmodeの一位を1にする
  }
}

void loop() {
  switch (mode) {
  case 0:  //ダイレクトモード
    if(digitalRead(input_Pin) == SW_ON){
      digitalWrite(LED,OUT_ON);		//LED出力ON
      digitalWrite(RELAY,OUT_ON);	//リレー出力ON
    }
    else{
      digitalWrite(LED,OUT_OFF);	//LED出力OFF
      digitalWrite(RELAY,OUT_OFF);	//リレー出力OFF
    }
    break;
  case 1:  //ラッチモード
    //  外部スイッチをONするたびに出力のON・OFFが切り替わる
    // 押し続けてもON・OFFの繰り返しがおこらない
    SW_state = digitalRead(input_Pin);    // 外部スイッチの状態を読み取る
    //スイッチがON、前回がOFFだったとき
    if( SW_state == SW_ON && old_SW_state == SW_OFF ){
      //LED点滅の状態を切り替える
      if(LED_state == FLG_ON){    // フラグがONのとき
        LED_state = FLG_OFF;        // OFF
      } 
      else {                  // フラグがOFFのとき
        LED_state = FLG_ON;        // ON
      }
      delay(50);                // チャタリング防止のウエイト
    }
    old_SW_state = SW_state;        // スイッチの状態をold_SW_stateへ保存
    if (LED_state == FLG_ON){       // LEDの点滅状態がONのとき
      digitalWrite(LED, OUT_ON);    //LED出力ON
      digitalWrite(RELAY, OUT_ON);  //リレー出力ON
    } 
    else {                     	    // OFFのとき
      digitalWrite(LED,OUT_OFF);    //LED出力OFF
      digitalWrite(RELAY,OUT_OFF);  //リレー出力OFF
    }
    break;
  case 10:  //ONパルスモード
    if(digitalRead(input_Pin) == SW_ON){  //外部スイッチが押されて、かつ
      if(SW_state == 0){  //OFFからONになったときだけパルス出力する
        SW_state = 1;
        digitalWrite(LED,OUT_ON);     //LED出力ON
        digitalWrite(RELAY,OUT_ON);   //リレー出力ON
        delay(pulse_time);
        digitalWrite(LED,OUT_OFF);    //LED出力OFF
        digitalWrite(RELAY,OUT_OFF);  //リレー出力OFF
      } 
    }
    else if(SW_state == 1){  //ONからOFFになったとき
      SW_state = 0;
      delay(50);    //チャタリング対策
    }
    break;
  case 11:  //ON・OFFパルスモード
    if(digitalRead(input_Pin) == SW_ON){  //外部スイッチが押されて、かつ
      if(SW_state == 0){         //OFFからONになったときパルスを出力する
        SW_state = 1;
        digitalWrite(LED,OUT_ON);	//LED出力ON
        digitalWrite(RELAY,OUT_ON);	//リレー出力ON
        delay(pulse_time);
        digitalWrite(LED,OUT_OFF);	//LED出力OFF
        digitalWrite(RELAY,OUT_OFF);	//リレー出力OFF
      } 
    }
    else if(SW_state == 1){  //ONからOFFになったときパルスを出力する
      SW_state = 0;
      digitalWrite(LED,OUT_ON);	//LED出力ON
      digitalWrite(RELAY,OUT_ON);	//リレー出力ON
      delay(pulse_time);
      digitalWrite(LED,OUT_OFF);	//LED出力OFF
      digitalWrite(RELAY,OUT_OFF);	//リレー出力OFF
    }
    break;
  case 100:  //タイマーモード(5秒)
    timer(5);
    break;
  case 101:  //タイマーモード(10秒)
    timer(10);
    break;
  case 110:  //タイマーモード(30秒)
    timer(30);
    break;
  case 111:  //タイマーモード(60秒)
    timer(60);
    break;
  }
}