【プログラミング自由研究】初心者キットで作る「LCDカウントダウンタイマー」|数字が減っていくのを目で見る装置

数字が減る! LCDタイマー自由研究

LCDに数字が出るカウントダウンタイマーを作ろう

プログラミングで「数字を画面に表示する」みたいな作例ない? シリアルモニタじゃなくて、実物の画面が欲しいんだ。

じゃあ「LCDカウントダウンタイマー」を作ろう! LCD1602っていうキットに入ってる画面に数字を表示して、ボタンを押すと10秒のカウントダウンが始まるんだ。

今回は、プログラミング自由研究で画面表示にチャレンジしたいお子さんに向けて、初心者キットだけで作れる「LCDカウントダウンタイマー」を紹介します。

ELEGOOのキットに入っているLCD1602 (I2C接続) を使って、数字を表示する装置です。お料理タイマー、勉強の集中タイマー、ゲーム時間制限など、生活で使えるシーンが豊富です。

この記事で作るもの
  1. LCDに残り秒数が表示される
  2. ボタンを押すと10秒からスタート
  3. 毎秒数字が1ずつ減る
  4. 0になるとブザーが鳴る

使う部品

部品役割個数
Arduino UNO R3頭脳1
LCD1602 (I2C版)数字表示1
タクトスイッチスタート1
パッシブブザー終了音1
ブレッドボード配線1
ジャンパーワイヤーつなぐ10本前後

配線図

        a b c d e
       +─────────+
[+]rail| . . . . . | ← 5V
[-]rail| . . . . . | ← GND
       +─────────+
row 5  | X . . . . | ← SW 片足 (D2)
row 7  | X . . . . | ← SW 反対 ([-])
row 11 | X . . . . | ← ブザー+ (D8)
row 12 | X . . . . | ← ブザー- ([-])
       +─────────+

LCD1602 (I2C版) はSDA/SCLでArduinoに直結:
  GND → GND
  VCC → 5V
  SDA → A4
  SCL → A5

プログラム

LCDを使うには「LiquidCrystal_I2C」というライブラリが必要です。Arduino IDEのライブラリマネージャからインストールしてください。

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BTN_PIN 2
#define BUZZER 8

LiquidCrystal_I2C lcd(0x27, 16, 2);
int countdown = 0;
bool running = false;
unsigned long lastTick = 0;

void setup() {
  Serial.begin(9600);
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Push to start");
}

void loop() {
  if (!running && digitalRead(BTN_PIN) == LOW) {
    countdown = 10;
    running = true;
    lastTick = millis();
    lcd.clear();
    showCount();
    delay(300);
  }

  if (running && millis() - lastTick >= 1000) {
    countdown--;
    showCount();
    lastTick = millis();

    if (countdown <= 0) {
      running = false;
      tone(BUZZER, 1500, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Time up!");
    }
  }
}

void showCount() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Count: ");
  lcd.print(countdown);
  Serial.println(countdown);
}

プログラムの動き

flowchart TD A[起動] --> B["LCD
Push to start"] B --> C{"ボタン
押された?"} C -->|Yes| D[10からスタート] C -->|No| B D --> E[1秒待つ] E --> F[数字-1] F --> G{0以下?} G -->|No| H[LCD更新] H --> E G -->|Yes| I["Time up!
ブザー"]

プログラミングのポイント

このプログラムの「millis()を使った1秒判定」がポイントです。delay(1000)で1秒待つのと違い、ボタンの読み取りや警告音の追加などを並行して書きやすくなります。

プログラミングの学び
「待つ」と「同時に処理する」を両立する仕組み (ノンブロッキング処理) を体験できる。
delay(1000) で待たないのはなんで?

delay中はボタンを読めないからなんだ。今回はカウント中も止まるだけだから問題ないけど、いずれ「カウント中に別のボタンで停止」みたいな機能を入れたい時、millis方式じゃないとできなくなるんだよ。

自由研究としての展開

研究テーマのアイデア
  1. 料理タイマーとして使い、本物のキッチンタイマーと精度比較
  2. 10秒、30秒、60秒、5分でカウントできるよう改造
  3. 勉強25分→休憩5分の「ポモドーロタイマー」化
  4. 残り3秒で警告ブザーを鳴らす機能追加

レポートの書き方

レポート構成
  1. 研究のきっかけ
  2. LCDの表示の仕組み
  3. 本物のタイマーと精度比較
  4. millis方式の利点
  5. 改造して作った機能

改造のアイデア

発展アイデア
  1. ポテンショメータでタイマー秒数を選べるように
  2. LCD2段目に「経過時間」も同時表示
  3. 残り3秒からブザーが「ピッピッ」とカウント
  4. EEPROMに最後の設定時間を保存

まとめ

今回は、プログラミング自由研究で取り組める「LCDカウントダウンタイマー」を紹介しました。Arduinoでの画面表示とノンブロッキング処理の入門に最適な題材です。

大切なのは、完成後に毎日使い、改造を重ねることです。実用品として育てれば、それが研究レポートのストーリーになります。

他にも初心者キットだけで作れる作例を別の記事で紹介しているので、興味があれば見てみてね。