/*
* デジタルストップウォッチ(割り込み)
* 黒ボタンを押すとタイマースタート、白ボタンを押すとタイマーストップ
*/
// 7セグ制御用ヘッダファイルをインクルード
#include <SevSeg.h>
// ピン番号を定数として定義
const int PIN_BTN_START = 3;
const int PIN_BTN_STOP = 2;
// 7セグ制御用
SevSeg sevseg;
// タイマー
unsigned long timer = 0;
bool timer_start = false;
void setup() {
// 7セグメントLEDの設定
byte hardware_config = COMMON_ANODE; // アノードコモン/カソードコモン
byte num_digits = 4; // 桁数
byte digit_pins[] = {5, 4, 19, 18}; // コモン(COM or DIG1~DIG4) ピン番号
byte segment_pins[] = {13, 12, 11, 10, 9, 8, 7, 6}; // セグメント(A~G)&ドット ピン番号
bool resistors_on_segments = false; // セグメント(A~G)&ドット 電流制限抵抗の有無
// begin([アノードコモン/カソードコモン], [桁数], [コモンピン番号配列], [セグメントピン番号配列], [抵抗の有無])
sevseg.begin(hardware_config, num_digits, digit_pins, segment_pins, resistors_on_segments);
// LEDの明るさを指定
sevseg.setBrightness(90);
// 割り込み設定
attachInterrupt(1, stopwatch_start, FALLING); // スタートボタン(黒)
// attachInterrupt(0, stopwatch_stop, FALLING); // ストップボタン(白)
// Serial.begin(115200);
}
void loop() {
// ストップウォッチ
if (timer_start)
{
stopwatch();
}
// 7セグ表示更新
sevseg.refreshDisplay();
}
// ストップウォッチ関数
void stopwatch() {
static int deci_seconds = 0; // 1/10[秒]
if (millis() - timer >= 100)
{
timer += 100;
deci_seconds++; // 100ミリ秒 = 1デシ秒
if (deci_seconds == 10000) { // 1000秒以上は表示できないためタイマーリセット
deci_seconds = 0;
}
// 7セグに数値を設定
sevseg.setNumber(deci_seconds, 1);
}
}
// ストップウォッチ スタート関数
void stopwatch_start() {
// Serial.println("黒ボタン押下");
if (timer_start == false)
{
// タイマースタート
timer_start = true;
// 現在時間を取得
timer = millis();
}
else
{
// タイマーストップ
timer_start = false;
}
}
// ストップウォッチ ストップ関数
void stopwatch_stop() {
// Serial.println("白ボタン押下");
// タイマーストップ
timer_start = false;
}
STOP
START