プロジェクト13:7セグストップウォッチ

プロジェクト13:7セグアレイで数字を表示(ストップウォッチ)

このプロジェクトで学ぶこと: 7セグメントLEDの各セグメントを制御して数字を表示する方法と、millis()を使ってdelayに頼らないタイマーを実装する方法を学びます。


完成イメージ

[7セグLEDにストップウォッチの秒数が表示され、ボタンでスタート/ストップできる動画を挿入]


必要な部品

部品名 数量
Arduino Uno R3 1
7セグメントLED(1桁) 1
抵抗 220Ω 7
タクトスイッチ 1
抵抗 10kΩ 1
ブレッドボード 1
ジャンパー線 多数

回路図と配線

[回路図画像を挿入]

配線手順

  1. 7セグメントLEDの各セグメントピン(a〜g)を220Ω抵抗を通じてArduinoの2〜8番ピンに接続する
  2. コモン端子(共通カソード型の場合はGND、共通アノード型の場合は5V)に接続する
  3. ボタンを12番ピンとプルダウン抵抗で接続する

7セグメントLEDのピン配置 a〜gの7本のセグメント(+小数点dp)でそれぞれのLEDを個別にON/OFFします。数字の「8」はすべて点灯、「1」はbとcのみ点灯です。


Arduinoスケッチ(プログラム)

// 7セグLEDストップウォッチ(0〜9秒)

// セグメントa〜gのピン番号
const int SEG_PINS[] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g
const int BUTTON_PIN = 12;

// 0〜9の数字ごとのセグメントパターン(a,b,c,d,e,f,g)
// 1=点灯, 0=消灯(共通カソード)
const byte DIGITS[10][7] = {
  {1,1,1,1,1,1,0},  // 0
  {0,1,1,0,0,0,0},  // 1
  {1,1,0,1,1,0,1},  // 2
  {1,1,1,1,0,0,1},  // 3
  {0,1,1,0,0,1,1},  // 4
  {1,0,1,1,0,1,1},  // 5
  {1,0,1,1,1,1,1},  // 6
  {1,1,1,0,0,0,0},  // 7
  {1,1,1,1,1,1,1},  // 8
  {1,1,1,1,0,1,1}   // 9
};

bool running = false;
unsigned long startTime = 0;
int displayDigit = 0;
bool lastButtonState = LOW;

void showDigit(int num) {
  for (int i = 0; i < 7; i++) {
    digitalWrite(SEG_PINS[i], DIGITS[num][i]);
  }
}

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(SEG_PINS[i], OUTPUT);
  }
  pinMode(BUTTON_PIN, INPUT);
  showDigit(0);
}

void loop() {
  bool buttonState = digitalRead(BUTTON_PIN);

  // ボタンの立ち上がりを検出
  if (buttonState == HIGH && lastButtonState == LOW) {
    running = !running;
    if (running) startTime = millis();
  }
  lastButtonState = buttonState;

  if (running) {
    int elapsed = (millis() - startTime) / 1000;  // 経過秒数
    displayDigit = elapsed % 10;                   // 0〜9でループ
    showDigit(displayDigit);
  }
}

コードのポイント解説

二次元配列 DIGITS[10][7] 10個の数字それぞれの7セグメントパターンを2次元配列で管理します。DIGITS[3]が「3」の点灯パターンを表します。

millis()でノンブロッキングタイマー delay(1000)を使うとその間ボタン入力を受け付けられません。millis()で「今の時刻 – 開始時刻」を計算することで、他の処理をしながらタイミングを管理できます。

エッジ検出(立ち上がり検出) buttonState == HIGH && lastButtonState == LOWで「押した瞬間」だけを検出します。ボタンを押し続けても1回だけ反応します。


動作確認

  1. スケッチをアップロードする
  2. ボタンを押すとカウントが0〜9で進み、もう一度押すと止まれば成功

このプロジェクトで学んだこと

  • 7セグメントの仕組み: セグメントパターンを配列で管理して数字を表示する方法を習得しました
  • ノンブロッキングタイマー: millis()によるdelay()に依存しない時間管理を学びました
  • エッジ検出: ボタンの「押した瞬間」を検出するテクニックを理解しました

次のプロジェクト「74HC595シリアル制御」では、シフトレジスタを使って少ないピンで多くのLEDを制御します。


深掘り:技術の背景と社会への広がり

7セグメントディスプレイの発明

7本のセグメントで数字を表示するアイデアは1910年代にさかのぼりますが、電子部品として実用化されたのは1965年。ゼネラル・エレクトリックのF.W.ヒューレットらが最初の実用的な7セグメント表示器を開発しました。1970年代に電卓・デジタル時計が爆発的に普及したことで、7セグメントディスプレイは家庭に入り込み、「デジタル時代の顔」となりました。

計時技術と社会のデジタル化

正確な時間計測の社会的価値は計り知れません。工場の生産ラインでは秒・ミリ秒単位のタイミング制御が製品品質を左右します。スポーツ競技では1000分の1秒を争う電子計時が公平な競争を支え、2004年のアテネ五輪水泳でマイケル・フェルプスが0.01秒差で金メダルを獲得した逸話は有名です。あなたが今日作ったストップウォッチは、こうした精密計時技術の入口に立つ体験です。


プロジェクト12:超音波センサー全プロジェクト一覧 | 次のプロジェクト:74HC595シリアル制御 →