プロジェクト13:7セグアレイで数字を表示(ストップウォッチ)
このプロジェクトで学ぶこと: 7セグメントLEDの各セグメントを制御して数字を表示する方法と、
millis()を使ってdelayに頼らないタイマーを実装する方法を学びます。
完成イメージ
[7セグLEDにストップウォッチの秒数が表示され、ボタンでスタート/ストップできる動画を挿入]
必要な部品
| 部品名 | 数量 |
|---|---|
| Arduino Uno R3 | 1 |
| 7セグメントLED(1桁) | 1 |
| 抵抗 220Ω | 7 |
| タクトスイッチ | 1 |
| 抵抗 10kΩ | 1 |
| ブレッドボード | 1 |
| ジャンパー線 | 多数 |
回路図と配線
[回路図画像を挿入]
配線手順
- 7セグメントLEDの各セグメントピン(a〜g)を220Ω抵抗を通じてArduinoの2〜8番ピンに接続する
- コモン端子(共通カソード型の場合はGND、共通アノード型の場合は5V)に接続する
- ボタンを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回だけ反応します。
動作確認
- スケッチをアップロードする
- ボタンを押すとカウントが0〜9で進み、もう一度押すと止まれば成功
このプロジェクトで学んだこと
- 7セグメントの仕組み: セグメントパターンを配列で管理して数字を表示する方法を習得しました
- ノンブロッキングタイマー:
millis()によるdelay()に依存しない時間管理を学びました - エッジ検出: ボタンの「押した瞬間」を検出するテクニックを理解しました
次のプロジェクト「74HC595シリアル制御」では、シフトレジスタを使って少ないピンで多くのLEDを制御します。
深掘り:技術の背景と社会への広がり
7セグメントディスプレイの発明
7本のセグメントで数字を表示するアイデアは1910年代にさかのぼりますが、電子部品として実用化されたのは1965年。ゼネラル・エレクトリックのF.W.ヒューレットらが最初の実用的な7セグメント表示器を開発しました。1970年代に電卓・デジタル時計が爆発的に普及したことで、7セグメントディスプレイは家庭に入り込み、「デジタル時代の顔」となりました。
計時技術と社会のデジタル化
正確な時間計測の社会的価値は計り知れません。工場の生産ラインでは秒・ミリ秒単位のタイミング制御が製品品質を左右します。スポーツ競技では1000分の1秒を争う電子計時が公平な競争を支え、2004年のアテネ五輪水泳でマイケル・フェルプスが0.01秒差で金メダルを獲得した逸話は有名です。あなたが今日作ったストップウォッチは、こうした精密計時技術の入口に立つ体験です。
← プロジェクト12:超音波センサー | 全プロジェクト一覧 | 次のプロジェクト:74HC595シリアル制御 →

