Arduinoでボタン1つで行うストップウォッチ
2022.02.23
知り合いに相談を受けたのでサササっと記述。
条件はストップウォッチの機能をボタン1つでスタート、ストップ。
リセット機能は要件になし。
液晶にはストップしたときにH:M:S:MSで表示する。
ボタンの動作はデジタル3番ピンを使用。
不安定防止の為、5Vで受けるようにする。
やり方はいろいろあると思うけど、深夜の殴り書き程度ならこんなもんかな?
もっと最適化できる? ウン、ソウダネ。
CASE文を嫌う人って結構いるけど、
IFの階層が深いよりはコードが見やすく
バグも発見しやすいので、私はためらいもなく使います。
インデントをタブで行ってたところは
ブログにコピペしたら消されちゃった(;´Д`)
なので「}」なんかは左寄せになってしまって読みにくくなってしまったけど
我慢してください(;´Д`)


#include
LiquidCrystal_I2C lcd(0x27,16,2);

unsigned long W_time = 0; //タイマーの値
unsigned long W_counttime = 0; //経過時間

int W_msec = 0; //ミリ秒の保存
int W_sec = 0; //秒の保存
int W_min = 0; //分の保存
int W_hr = 0; //時間の保存
int W_amari = 0;

int Push_Count = 0; //何回押したか。1回目ならスタート、2回目ならストップ&表示
int Push_Flg = 0; //現在押しているかのフラグ

unsigned long Click_konkai = 0; //長押し誤動作の対策
unsigned long Click_zenkai = 0;

int Work_int = 0;
int B_Switch = 0; //スイッチの判断用

void setup() {
//***シリアル定義*******************
Serial.begin(9600);

//***液晶初期化******************
lcd.init();
lcd.begin(20,2); //LCD2004の表示範囲を指定
//LCD2004は20x2キャラクタ表示なので、20,2といれる。
lcd.clear(); //表示をクリアしてカーソルを上段の先頭の位置に移動
lcd.backlight(); //LCD2004のバックライトを点ける
lcd.print("READY");
//***ピン定義*******************
pinMode(3,INPUT); //デジタルピン3番をスイッチ用として使用する

}

void loop(){
B_Switch = digitalRead(3);//ボタンが押されたかを確認する
if(B_Switch == HIGH){
delay(10); //チャタリングじゃないかを判断するために10ms後も押し続けたかで判断
B_Switch = digitalRead(3);//ボタンが押されたかを確認する
if(B_Switch == HIGH){
Push_Flg = 1;
}else{
Push_Flg = 0;
}
}else{
Push_Flg = 0;
}


if (Push_Flg == 1){
Click_konkai = millis();
Work_int = Click_konkai - Click_zenkai;
if (Work_int > 1000 ){ //1秒未満の再クリックは押しっぱなしの可能性があるので無視する

Click_zenkai = Click_konkai;

switch(Push_Count){
case 0:
W_time = millis(); //開始時刻を記録
lcd.clear();
lcd.print("START");
Push_Count = 1;
break;
case 1:
W_counttime = millis() - W_time; //経過時間を導く
W_msec = W_counttime % 1000; //1000で割った余りをmsにする
W_counttime = W_counttime /1000; //経過時間を1000で割って最小単位を秒にする。
W_hr = W_counttime / 3600; //経過時間を3600で割って時間を導く。
W_amari = W_counttime % 3600; //経過時間を3600で割った余りを保存。
W_min = W_amari / 60; //経過時間を60で割って分を導く。
W_sec = W_amari % 60; //経過時間を60で割った余りを秒にする。
lcd.clear();
lcd.print("STOP");
lcd.setCursor(0,1);
lcd.print(W_hr); lcd.print("h:");
lcd.print(W_min); lcd.print("m:");
lcd.print(W_sec); lcd.print("s:");
lcd.print(W_msec); lcd.print("ms");
Push_Count = 0;
break;
}
}
}
}
トラックバックURL
トラックバック一覧

- CafeNote -