前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Arudino R3 互換ボードを用いてタイマーを創りたいです。
タイマーの構造としてはボタンが1つ。
1つ目のボタンを押すと1分のカウントダウンが液晶画面に表示され始まる。
タイマーが00:00秒になったとき、自動的に10分のカウントダウンが始まるの無限ループ。
発生している問題・エラーメッセージ
まず一分のカウントダウンのタイマーを作成しようと始めました。 以下のソースコードだと、ディスプレイ上には01:00での待機画面で表示されているのですが、 ボタンを押してもカウントダウンしません。 ボタンを押している間のみカウントダウンが始まる結果です。 ボタンを離すと01:00の待機画面に戻ってしまいます。 なんとか完成させたいです。お願いいたします。
該当のソースコード
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 timeUpEdge; //立ち上がりエッジを検出した時間 int numUpEdge = 0;//立ち上がりエッジを検出した回数 int timeDisp; //表示時刻 int setTime = 60; //設定時刻(秒単位) int numDisp[4]; //LEDに表示する数字 int i; int timeState=0; //タイマー状態 0:初期 1:動作 2:完了 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; //一つ前のスイッチ状態 //状態の判定 switch(timeState){ case 1: //動作 if( swCntUpEdge == 1){ timeState = 0; } else if( (timeNow-timeStart)/1000>=(setTime) ){ timeState = 1; } break; case 2: //完了 if( swCntUpEdge == 1 ){ timeState = 0; } break; default : //初期 if( swCntUpEdge == 1 ){ timeState = 1; timeStart = timeNow; } break; } switch(timeState){ case 1: //動作 timeDisp = setTime -( (timeNow-timeStart)/1000 ); //設定値から現在時刻と開始時刻の差を引いた値が表示時刻 break; case 2: //完了 timeDisp = 0; 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); } }
補足情報(FW/ツールのバージョンなど)
Arudino R3 互換ボード
4桁LEDデジタル表示管
タクトスイッチ2つ
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/08 11:49
2018/09/08 11:52