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;
}
}
}
}
条件はストップウォッチの機能をボタン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;
}
}
}
}
Phrozenで新レジン登場。Aqua Clear Resin
2022.02.23
Phrozenから新レジン登場のお知らせが届きました!
Aquaシリーズに透明色の追加です。
今までなぜなかったんでしょうかね?
そういえば私も透明色だけは他社のを使っていた気がします。
これからはPhrozen純正で行こうかな。
4Kや8Kタイプではなく無印タイプ用なので、
精密印刷ではどうなるのか気になるところです。
アンケートに答えると5%オフクーポンがもらえます。
・カラフルなミニチュアに最適な「フローズンアクア」(クリア/1KG)が5%OFFになります。
・お一人様1回のご利用。
・2022年3月15日(日本時間)まで有効。
・本クーポンは、他の自動割引、キャンペーン、
販売イベントとの併用はできませんので、ご注意ください。