const int pinSwCnt = A1; //入力スイッチ const int pinSwSet = A0; //入力スイッチ const int pinLED = A2; //赤いLED //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回押す //時間設定スイッチ関連 int swSetPrevState = 0; //1つ前のスイッチ状態 int swSetCurrState = 0; //現在のスイッチ状態 long timeStartSet; //時間設定 long timePrevCtUp; //カウント long timeNow; //現在時刻 long timeStart; //タイマー開始時刻 long timeStop; //一時停止時刻 long timeUpEdge; //立ち上がりエッジを検出した時間 int numUpEdge = 0; //立ち上がりエッジを検出した回数 int setTime = 432; //設定時刻(秒単位) int timeSet = setTime; //スイッチ設定時刻 int timeDisp = setTime; //表示時刻 int numDisp[4]; //LEDに表示する数字 //制御 int i; int timeState=0; //タイマー状態 0:初期状態 1:動作 2:完了 3:停止 void setup() { //入出力の初期化 pinMode( pinSwCnt, INPUT ); pinMode( pinSwSet, 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 ); pinMode( pinLED, OUTPUT); //デバッグ用シリアル //Serial.begin(9600); } void loop() { timeNow = millis(); //現在時刻の取得 timeNow *= 5; //12進の秒に合わせるため(5/6)倍する timeNow /= 6; //時間操作スイッチ立ち上がりエッジ検出 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>=(timeSet) ){ timeState = 2; } break; case 2: //完了 if( pushSingle==1 || pushDouble==1 ){ timeState = 0; timeDisp = setTime; } break; case 3: //停止 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; //表示時刻の計算 switch(timeState){ case 1: //動作 timeDisp = timeSet -( (timeNow-timeStart)/1000 ); //開始時刻と現在時刻の差が表示時刻 break; case 2: //完了 timeDisp = 0; break; case 3: //停止 timeDisp = timeSet -( (timeStop-timeStart)/1000 ); //開始時刻と停止時刻の差が表示時刻 break; default : //初期 break; } switch(timeState) { case 0: digitalWrite(pinLED , LOW ); //動作状態が初期状態なら、赤いLED 消灯 break; case 1: digitalWrite(pinLED , HIGH); //動作状態が動作なら、赤いLED 点灯 break; case 2: digitalWrite(pinLED , LOW); //動作状態が完了なら、赤いLED 消灯 break; case 3: digitalWrite(pinLED , LOW); //動作状態が停止なら、赤いLED break; default: digitalWrite(pinLED , LOW); //どれでも無ければ、赤いLED消灯 } //if( timeState == 2 ) //動作状態が完了ならば、音を鳴らす // tone( A2, 440 ); //else //動作状態が完了でないなら、音を鳴らさない // noTone(A2); //時間設定スイッチ立ち上がりエッジ検出 swSetCurrState = digitalRead(pinSwSet); //現在のスイッチ状態 if( timeState==0 && swSetCurrState==HIGH && swSetCurrState!=swSetPrevState ){ //現在のスイッチ状態と一つ前のスイッチ状態を比較 timeStartSet = timeNow; timePrevCtUp = timeNow; up_time_disp(); } swSetPrevState = swSetCurrState; //一つ前のスイッチ状態 if( swSetCurrState==HIGH && timeState==0 ){ if( (timeNow-timePrevCtUp)>= 1000){ //押してから10秒以内は1秒ごとにカウントアップ show_param(); up_time_disp(); timePrevCtUp = timeNow; } else if( (timeNow-timeStartSet)>5000 && (timeNow-timePrevCtUp)>= 333){ //押してから20秒以内は1/3秒ごとにカウントアップ show_param(); up_time_disp(); timePrevCtUp = timeNow; } else if( (timeNow-timeStartSet)>10000 && (timeNow-timePrevCtUp)>= 100){ //押してから20秒以降は0.1秒ごとにカウントアップ show_param(); up_time_disp(); timePrevCtUp = timeNow; } else if( (timeNow-timeStartSet)>15000 && (timeNow-timePrevCtUp)>= 33){ //押してから20秒以降は0.1秒ごとにカウントアップ show_param(); up_time_disp(); timePrevCtUp = timeNow; } } //表示時刻を7セグメントLED用に変換 numDisp[0] = timeDisp % 12; //1秒単位 numDisp[1] = (timeDisp % 72)/12; //10秒単位 numDisp[2] = (timeDisp/72) % 12; //1分単位 numDisp[3] = (timeDisp/864) % 12; //10分単位 //7セグLEDの制御 if( i ==3 ) i = 0; else i++; switch(i){ case 1: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , HIGH ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , LOW ); break; case 2: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , HIGH ); digitalWrite(pin7segDig1 , LOW ); break; case 3: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , HIGH ); break; default : digitalWrite(pin7segDig4 , HIGH ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , LOW ); break; } disp_7seg( numDisp[i] ); delay(5); } void up_time_disp() { if( timeDisp == 2160 ) timeDisp = 432; else timeDisp += 432; Serial.print(timeDisp); Serial.print("\n"); } void show_param( ) { Serial.print(timeNow); Serial.print("\t"); Serial.print(timeStartSet); Serial.print("\t"); Serial.print(timeNow-timeStartSet); Serial.print("\t"); Serial.print("\n"); } void disp_7seg( int numDisp ) { switch(numDisp){ 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; case 10: //12進数の"A"を表示する digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 11: //12進数の"A"を表示する digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); 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; } }