設定した時間(秒)でカウントダウンするタイマーを作っています。LCDモジュールにタイムを表示
スイッチになるボタンを押している間だけカウントダウンし、ボタンを離すとタイマーがストップ、また押すとタイムを継続して測る。
設定した時間が経過すると表示は0になる。コードです。そして、リセット・ボタンで設定してある時間表示に戻る。
ここまでは、とりあえず動いています。
しかし、ボタンを押している間だけカウントさせるため、実際にボタンを押した時間をわかるようにしたいので、
カウントダウンと同時にカウントアップ(ストップウォッチとして)も表示したいと思っています。
今のコードでは、設定した時間(15.5秒)でカウントダウンして3行目に表示、
4行目に0から押している間の時間を表示します。ボタンを押し終わるのが、15.5秒以内であれば問題ありません。
例:3行目 Set Time 0.50 4行目 Time Up 15.0 と表示します。
しかし、設定した時間より長くボタンを押しているときには、
例:3行目 Set Time 0.00 4行目 Time Up 0.0 と Time Up の部分が0になってしまいます。
この部分を15.5秒から継続して計測、表示できるように(16.75秒などのように)
するにはどのようにすればいいのでしようか?
#include <Wire.h> #include <LiquidCrystal_I2C.h> float SetTime = 15.5; // 設定時間(秒単位) const int Time_Switch = 14; // 入力スイッチ ( A0 ) const int TimeReSet_Botann = 6; // 時間リセット ( D12 ) const int Switch_ON = LOW; // スイッチはプルアップ仕様のためONでLOW const int Switch_OFF = HIGH; // OFFでHIGH // ----------- 時間設定スイッチ関連 --------------------------------------------------------------- int swPrevState = 0; // 1つ前のスイッチ状態 int swCurrState = 0; // 現在のスイッチ状態 int SwitchOn = 0; // 立ち上がりエッジ検出 int ResetOn = 0; // 立ち上がりエッジ検出 int TimeState = 0; // タイマー状態 0:初期状態 1:動作 2:完了 3:停止 int TimeSet1 = 0; // 設定時刻プラス int TimeSet2 = 0; // 設定時刻マイナス int TimeReset = 0; // 設定時刻リセット int TimeSet = SetTime; // スイッチ設定時刻 float TimeDisp = SetTime; // 表示時刻 float Time_On = 0; // 設定時間 float TimeTotal = 0; // 設定時間 float TimeNow; // 現在時刻 float TimeStart; // タイマー開始時刻 float TimeStop; // 一時停止時刻 float TimeStart2; // タイマー開始時刻 float TimeStop2; // 一時停止時刻 LiquidCrystal_I2C lcd(0x27, 20, 4); // --------------------------------------------------------------------------------------------- void setup() { Wire.begin(); // LCDディスプレイ ------------ lcd.init(); lcd.backlight(); displayEntryScreen(); showEnteredTime(); // -------------------------- pinMode(Time_Switch, INPUT_PULLUP); // スイッチ pinMode(TimeReSet_Botann, INPUT_PULLUP); // リセット・スイッチ } void loop() { TimeNow = millis(); //現在の時間取得 //-------------- スイッチ設定 立ち上がりエッジ検出 ----------------------------------------- swCurrState = digitalRead(Time_Switch); //現在のスイッチ状態 if (swCurrState == Switch_ON) { SwitchOn = 1; // スイッチONで1 } else { SwitchOn = 0; // スイッチOFFで0 } //-------------- スイッチ動作状態の判定 ------------------------------------------------- switch (TimeState) { case 1: // 動作 if (SwitchOn == 0) { TimeState = 3; TimeStop = TimeNow; } else if ((TimeNow - TimeStart) / 1000 >= (TimeSet)) { TimeState = 2; } break; case 2: // 完了 if (SwitchOn == 1) { TimeState = 0; } break; case 3: // 停止 if (SwitchOn == 1) { TimeState = 1; TimeStart = TimeNow - (TimeStop - TimeStart); // TimeStart = TimeStart; } else if (TimeReset == LOW) { TimeState = 0; TimeSet = TimeDisp; TimeStart = TimeNow; } break; default: // 初期 if (SwitchOn == 1) { TimeState = 1; TimeSet = TimeDisp; TimeStart = TimeNow; } break; } //------------------ 表示時間の計算 --------------------------------------------------------- switch (TimeState) { case 1: //動作 TimeDisp = TimeSet - ((TimeNow - TimeStart) / 1000); TimeTotal = (TimeNow - TimeStart) / 1000; break; case 2: //完了 TimeDisp = 0; TimeTotal = (TimeNow - TimeStart) / 1000; break; case 3: //停止 TimeDisp = TimeSet - ((TimeStop - TimeStart) / 1000); TimeTotal = (TimeStop - TimeStart) / 1000; break; default: //初期 break; } //------------- リセット ------------------------------------------------------------------- TimeReset = digitalRead(TimeReSet_Botann); if (TimeReset == LOW) { TimeDisp = SetTime; TimeTotal = 0; delay(100); } lcd.setCursor(15, 2); lcd.print(TimeDisp,2); lcd.setCursor(15, 3); lcd.print(TimeTotal,2); } // ---------------- SetUp LCD --------------------------------------------------------------- void showEnteredTime() { lcd.setCursor(15, 3); lcd.print(TimeDisp,2); } void clearScreen() { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 2); lcd.print(" "); lcd.setCursor(0, 3); lcd.print(" "); } void displayEntryScreen() { clearScreen(); lcd.setCursor(0, 0); lcd.print("Set Time"); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 2); lcd.print("Set Time"); lcd.setCursor(15, 2); lcd.print(SetTime,2); lcd.setCursor(0, 3); lcd.print("Time Up"); lcd.setCursor(15, 3); lcd.print(TimeDisp,2); }
回答2件
あなたの回答
tips
プレビュー