タイマーを作って動かしてみよう
準備するもの
- 圧電ブザー: 1個
- タクトスイッチ: 2個
- 抵抗(330Ω): 10本
- ジャンパー線: 24本
- 4桁デジタル表示管:1個
ブレッドボードへの接続
(1)ブレッドボードへの接続を行っていきます (※ タクトスイッチなど、しっかりと接続ができていないと正常に動作しません)
プログラムの作成
(1)プログラムを作成します
//入力スイッチ const int pinSwCnt = 13; const int pinSwCnt2 = A0; //7セグピン const int pin7segA = 1; const int pin7segB = 3; const int pin7segC = 5; const int pin7segD = 7; const int pin7segE = 8; const int pin7segF = 2; const int pin7segG = 4; //7セグ桁制御 const int pin7segDig1 = 12; const int pin7segDig2 = 11; const int pin7segDig3 = 10; const int pin7segDig4 = 9; //時間操作スイッチエッジ検出 int swCntPrevState = 0; //1つ前のスイッチ状態 int swCntCurrState = 0; //現在のスイッチ状態 int swCntUpEdge = 0; //立ち上がりエッジ検出 int pushSingle = 0; //1回押された判定 int pushDouble = 0; //2回押された判定 //時間設定スイッチ関連 int swSetPrevState = 0; //1つ前のスイッチ状態 int swSetCurrState = 0; //現在のスイッチ状態 long timeStartSet; //時間設定 long timePrevCtUp; //時間 long timeNow; //現在時刻 long timeStart; //タイマー開始時刻 long timeStop; //一時停止時刻 long timeUpEdge; //立ち上がりエッジを検出した時間 int numUpEdge = 0; //立ち上がりエッジを検出した回数 int setTime = 300; //設定時刻(秒単位) int timeSet = setTime; //スイッチ設定時刻 int timeDisp = setTime; //表示時刻 int numDisp[4]; //LEDに表示する数字 //制御 int i; //タイマー状態 0:初期 1:動作 2:完了 3:停止 int timeState=0; void up_time_disp() { if( timeDisp == 6000 ) timeDisp = 60; else timeDisp += 60; } void setup() { //入出力の初期化 pinMode(pinSwCnt, INPUT); pinMode(pinSwCnt2, INPUT); pinMode(pin7segA, OUTPUT); pinMode(pin7segB, OUTPUT); pinMode(pin7segC, OUTPUT); pinMode(pin7segD, OUTPUT); pinMode(pin7segE, OUTPUT); pinMode(pin7segF, OUTPUT); pinMode(pin7segG, OUTPUT); pinMode(pin7segDig1, OUTPUT); pinMode(pin7segDig2, OUTPUT); pinMode(pin7segDig3, OUTPUT); pinMode(pin7segDig4, OUTPUT); } void loop() { //現在時刻の取得 timeNow = millis(); //時間操作スイッチ立ち上がりエッジ検出 //現在のスイッチ状態 swCntCurrState = digitalRead(pinSwCnt); //現在のスイッチ状態と一つ前のスイッチ状態を比較 if(swCntCurrState==HIGH && swCntCurrState!=swCntPrevState) { swCntUpEdge = 1; if(numUpEdge == 0) timeUpEdge = timeNow; numUpEdge++; } else swCntUpEdge = 0; //一つ前のスイッチ状態 swCntPrevState = swCntCurrState; //スイッチの押された回数が1回か2回かの判定 if( numUpEdge >= 1 ){ if( numUpEdge >= 2 ){ pushDouble = 1; numUpEdge = 0; } else if(timeNow-timeUpEdge > 600) { pushSingle = 1; numUpEdge = 0; } } //動作状態の判定 switch(timeState){ //動作 case 1: //開始時刻と現在時刻の差が表示時刻 timeDisp = timeSet -( (timeNow-timeStart)/1000 ); if(pushSingle == 1){ timeState = 3; timeStop = timeNow; } else if((timeNow-timeStart)/1000>=(timeSet)){ timeState = 2; } break; //完了 case 2: timeDisp = 0; if(pushSingle==1 || pushDouble==1){ timeState = 0; timeDisp = setTime; } break; //停止 case 3: //開始時刻と停止時刻の差が表示時刻 timeDisp = timeSet -((timeStop-timeStart)/1000); if(pushSingle == 1){ timeState = 1; timeStart = timeNow - (timeStop-timeStart); } else if(pushDouble == 1){ timeState = 0; timeDisp = setTime; } break; //初期 default: if(pushSingle == 1){ timeState = 1; timeSet = timeDisp; timeStart = timeNow; } break; } pushSingle = 0; pushDouble = 0; if(timeState == 2) //動作状態が完了ならば、音を鳴らす tone(A1, 1500); else //動作状態が完了でないなら、音を鳴らさない noTone(A1); //時間設定スイッチ立ち上がりエッジ検出 swSetCurrState = digitalRead(pinSwCnt2); //現在のスイッチ状態 //現在のスイッチ状態と一つ前のスイッチ状態を比較 if(timeState==0 && swSetCurrState==HIGH && swSetCurrState!=swSetPrevState){ timeStartSet = timeNow; timePrevCtUp = timeNow; up_time_disp(); } //一つ前のスイッチ状態 swSetPrevState = swSetCurrState; //表示時刻をLEDの数字へ変更 numDisp[0] = timeDisp % 10; numDisp[1] = (timeDisp % 60)/10; numDisp[2] = (timeDisp/60)%10; numDisp[3] = (timeDisp/600)%10; pushSingle = 0; //7セグLEDの制御 for(i=0; i<4; i++){ switch(i){ case 1: digitalWrite(pin7segDig4 , HIGH ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , HIGH ); digitalWrite(pin7segDig1 , HIGH ); break; case 2: digitalWrite(pin7segDig4 , HIGH ); digitalWrite(pin7segDig3 , HIGH ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , HIGH ); break; case 3: digitalWrite(pin7segDig4 , HIGH ); digitalWrite(pin7segDig3 , HIGH ); digitalWrite(pin7segDig2 , HIGH ); digitalWrite(pin7segDig1 , LOW ); break; default: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , HIGH ); digitalWrite(pin7segDig2 , HIGH ); digitalWrite(pin7segDig1 , HIGH ); break; } switch(numDisp[i]){ case 1: digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , LOW ); break; case 2: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , LOW ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , HIGH ); break; case 3: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , HIGH ); break; case 4: digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 5: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 6: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 7: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , LOW ); break; case 8: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 9: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; default : //0 digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , LOW ); break; } delay(5); } }
実行する
(1) プログラムを実行します(スイッチを押して、タイマーが動作し0になったときブザーが鳴れば成功です)
プログラムについては、以下の記事を参考にさせていただきました。
ありがとうございました。