見出し画像

Arduino タクトスイッチ×LED点滅

arduinoでmillisを使用し、タクトスイッチを押すとLEDを点滅させる。
タクトスイッチは二個、タクトスイッチ一個につきLED二個使用する。
スイッチ1はLEDが交互に光り、スイッチ2はLEDがそれぞれ異なる周期の点滅を繰り返す。

//millisを使用したLED点滅

//スイッチNo.1
const int switch_1 = 3; //3番ピンにスイッチ1
int val_sw1 = 0; //状態保存用
int old_val_sw1 = 0; //状態保存用
int state_sw1 = 0; //状態保存用
unsigned long old_time_sw1; //時間保存用

//スイッチNo.2
const int switch_2 = 4; //4番ピンにスイッチ2
int val_sw2 = 0; //状態保存用
int old_val_sw2 = 0; //状態保存用
int state_sw2 = 0; //状態保存用
unsigned long old_time_sw2; //時間保存用

//LED No.1
const int LED_1 = 6; //6番ピンにLED1
unsigned long old_time_LED_1; //時間保存用

//LED No.2
const int LED_2 = 7; //7番ピンにLED2
unsigned long old_time_LED_2; //時間保存用

//LED No.3
const int LED_3 = 8; //8番ピンにLED3
unsigned long old_time_LED_3; //時間保存用

//LED No.4
const int LED_4 = 9; //9番ピンにLED4
unsigned long old_time_LED_4; //時間保存用


void setup()
{
pinMode(switch_1, INPUT_PULLUP); //switchを入力に設定
pinMode(switch_2, INPUT_PULLUP); //switchを入力に設定
pinMode(LED_1, OUTPUT); //LEDピンを出力にする
pinMode(LED_2, OUTPUT); //LEDピンを出力にする
pinMode(LED_3, OUTPUT); //LEDピンを出力にする
pinMode(LED_4, OUTPUT); //LEDピンを出力にする
}

void loop()
{
//スイッチNo.1の動作設定
val_sw1 = digitalRead(switch_1); //switch_1の状態を読み込み、valに代入
  old_time_sw1 = millis(); //最新の時間を保存
  if((val_sw1 == HIGH) && (old_val_sw1 == LOW)){
    state_sw1 = 1 - state_sw1;
    while (millis() - old_time_sw1 < 10); //10ミリ秒待つ
  }
  old_val_sw1 = val_sw1;
//スイッチNo.1が押されたら下記実行
  if(state_sw1 == 0){
    if((millis()-old_time_LED_1)%500<250)digitalWrite(LED_1,HIGH); //250ミリ秒光る、250ミリ秒消える
    else digitalWrite(LED_1, LOW);
    if((millis()-old_time_LED_2)%500>250)digitalWrite(LED_2,HIGH); //250ミリ秒消える、250ミリ秒光る
    else digitalWrite(LED_2, LOW);
    }
//スイッチNo.1がもう一度押されたら下記実行
  else{
    digitalWrite(LED_1, LOW); //LED1 消灯
    old_time_LED_1 = millis(); //最新の時間を保存
    digitalWrite(LED_2, LOW); //LED2 消灯
    old_time_LED_2 = millis(); //最新の時間を保存
    }
  

//スイッチNo.2の動作設定
val_sw2 = digitalRead(switch_2); //SW2の状態を読み込み、valに代入
  old_time_sw2 = millis(); //最新の実行時間を保存
  if((val_sw2 == HIGH) && (old_val_sw2 == LOW)){
    state_sw2 = 1 - state_sw2;
    while (millis() - old_time_sw2 < 10); //10ミリ秒待つ
  }
  old_val_sw2 = val_sw2;
//スイッチNo.2が押されたら下記実行
  if(state_sw2 == 0){
    if((millis()-old_time_LED_3)%2000<500)digitalWrite(LED_3,HIGH); //500ミリ秒光る、1500ミリ秒消える
    else digitalWrite(LED_3, LOW);
    if((millis()-old_time_LED_4)%800<200)digitalWrite(LED_4,HIGH); //200ミリ秒光る、600ミリ秒消える
    else digitalWrite(LED_4, LOW);
    }
//スイッチNo.2がもう一度押されたら下記実行
  else{
    digitalWrite(LED_3, LOW); //LED3 消灯
    old_time_LED_3 = millis(); //最新の時間を保存
    digitalWrite(LED_4, LOW); //LED4 消灯
    old_time_LED_4 = millis(); //最新の時間を保存
    }


}

スイッチが押された部分
if ( state == 0 )
「0」は消灯状態から始まり、「1」にすると電源on時に(スイッチを押していないのに)LEDが点滅し始めます。

millisはプログラムの実行を開始してからの経過時間をミリ秒で返します。
if((millis()-old_time_LED)%2000<500)
経過時間からold_time(初回は0)を引き、指定の数値で割り余りを返します。それが指定の数値以下の時、点灯を実行します。
%2000<500は500ミリ秒光り、1500ミリ秒消えるを繰り返します。
比較演算子を反対に「>」すると500ミリ秒消え、1500ミリ秒光る。
なのでスイッチ1は同じ数値にし比較演算子を変えることによって
2個のLEDが交互に250ミリ秒光ります。
もう一度スイッチが押された時に、消灯と同時に、
old_timeにmillisを保存します。
そうすることによって次にスイッチが押された時に初めから剰余カウントが始まります。
この文を抜くと例えば、点灯中にスイッチoffにし、すぐにスイッチonにすると点灯中の残り時間から始まります。

この記事が気に入ったらサポートをしてみませんか?