const int pinSwCnt = A1; //入力スイッチ //7セグピン const int pin7segA = 6; const int pin7segB = 7; const int pin7segC = 8; const int pin7segD = 9; const int pin7segE = 10; const int pin7segF = 12; const int pin7segG = 13; //7セグ桁制御 const int pin7segDig1 = A3; const int pin7segDig2 = 2; const int pin7segDig3 = 3; const int pin7segDig4 = 4; //時間操作スイッチエッジ検出 int swCntPrevState = 0; //1つ前のスイッチ状態 int swCntCurrState = 0; //現在のスイッチ状態 int swCntUpEdge = 0; //立ち上がりエッジ検出 int pushSingle = 0; //1回押された判定 int pushDouble = 0; //2回押された判定 //時間 long timeNow; //現在時刻 long timeStart; //タイマー開始時刻 long timeStop; //一時停止時刻 long timeUpEdge; //立ち上がりエッジを検出した時間 int numUpEdge = 0;//立ち上がりエッジを検出した回数 int timeDisp; //表示時刻 int setTime = 60; //設定時刻(秒単位) int numDisp[4]; //LEDに表示する数字 int i; int timeState=0; //タイマー状態 0:停止 1:動作 2:完了 3:停止 void setup() { //入出力の初期化 pinMode( pinSwCnt, 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: //動作 if( pushSingle == 1 ){ timeState = 3; timeStop = timeNow; } else if( (timeNow-timeStart)/1000>=(setTime) ){ timeState = 2; } break; case 2: //完了 if( pushSingle==1 || pushDouble==1 ){ timeState = 0; } break; case 3: //停止 if( pushSingle==1 ){ timeState = 1; timeStart = timeNow - (timeStop-timeStart); //開始時刻を停止していた時間の分だけ進める } else if( pushDouble == 1 ){ timeState = 0; } break; default : //初期 if( pushSingle == 1 ){ timeState = 1; timeStart = timeNow; } break; } switch(timeState){ case 1: //動作 timeDisp = setTime -( (timeNow-timeStart)/1000 ); //設定値から現在時刻と開始時刻の差を引いた値が表示時刻 break; case 2: //完了 timeDisp = 0; break; case 3: //停止 timeDisp = setTime -( (timeStop-timeStart)/1000 ); //設定値から現在時刻と停止時刻の差を引いた値が表示時刻 break; default : //初期 timeDisp = setTime; break; } //表示時刻をLEDの数字へ変更 numDisp[0] = timeDisp % 10; numDisp[1] = ( timeDisp % 60 )/10; numDisp[2] = (timeDisp/60) % 10; numDisp[3] = (timeDisp/600) % 10; pushSingle = 0; pushDouble = 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); } }