概要
ArduinoとI2C対応のOLEDディスプレイを組み合わせ、簡単なカウントダウン機能を実装する方法を解説します。このプロジェクトでは、ディスプレイにカウントダウンの進行状況を表示し、LEDを利用して状態を視覚的に確認できます。Mark信号(外部トリガ)に基づいてカウントダウンを制御し、さまざまな状態をリアルタイムで表示します。
仕様
このシステムは以下の仕様に基づいて動作します。
- Mark信号によるカウントダウン制御
- Mark信号を**ON(LOW)**にするとカウントダウンが開始します。
- Mark信号を**OFF(HIGH)**にするとカウントダウンが一時停止します。
- カウントダウンの再開
- 一時停止中に再びMark信号をONにすると、停止した時点からカウントダウンを再開します。
- カウントダウン完了
- カウントダウンが0になると、ディスプレイに「Finished」とメッセージを表示し、LEDを消灯します。
- カウントダウン完了後はMark信号を操作しても再びカウントダウンを開始することはありません。
- LEDの状態
- カウントダウン中はLEDが点灯します。
- カウントダウンが一時停止または完了するとLEDは消灯します。
- ディスプレイ表示
- 現在の状態(
Running,Paused,Finished,Stopped)と残りカウント値をディスプレイにリアルタイムで表示します。
- 現在の状態(
配線
以下のピン配置で接続します。
| Arduinoピン | 接続先 |
|---|---|
VCC*3.3vでも5vでもどっちでもいいです。 | OLEDディスプレイのVCC |
GND | OLEDディスプレイのGND |
A4 | OLEDディスプレイのSDA |
A5 | OLEDディスプレイのSCL |
D2 | Mark信号(入力) |
D13 | LED(出力) |
使用するコード
以下がカウントダウンのコードです。Arduino IDEにコピーして使用してください。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED設定
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ピン設定
const int markPin = 2; // Mark信号が接続されるピン
const int ledPin = 13; // LEDが接続されるピン
// カウントダウン用変数
int countdownValue = 100; // カウントダウンの初期値
bool countdownRunning = false; // カウントダウン中かどうかを示すフラグ
bool countdownFinished = false; // カウントダウンが終了したかどうかを示すフラグ
void setup() {
pinMode(markPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(9600);
// OLED初期化
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED initialization failed.");
while (1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("System Ready");
display.display();
delay(2000);
}
void loop() {
int markState = digitalRead(markPin);
if (countdownFinished) {
updateOLED("Stopped", countdownValue);
return;
}
if (markState == LOW) {
if (!countdownRunning) {
countdownRunning = true;
Serial.println("Countdown started.");
}
if (countdownValue > 0) {
digitalWrite(ledPin, HIGH);
delay(1000);
countdownValue--;
updateOLED("Running", countdownValue);
} else {
Serial.println("Countdown finished.");
digitalWrite(ledPin, LOW);
countdownRunning = false;
countdownFinished = true;
updateOLED("Finished", countdownValue);
}
} else {
countdownRunning = false;
digitalWrite(ledPin, LOW);
updateOLED("Paused", countdownValue);
delay(100);
}
}
void updateOLED(String status, int count) {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.print("Status: ");
display.println(status);
display.print("Countdown: ");
display.println(count);
display.display();
}
I2Cアドレススキャン
OLEDディスプレイのI2Cアドレスを確認するために、以下のI2Cスキャナコードを使用してください。
I2Cスキャナのコード
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2Cスキャナを開始します...");
for (uint8_t address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.print("I2Cデバイスを発見: 0x");
Serial.println(address, HEX);
delay(500);
}
}
Serial.println("スキャン完了");
}
void loop() {}
エラーとトラブルシューティング
以下は、よくあるエラーとその解決法です。
1. OLED初期化失敗
エラー内容:
OLED initialization failed.
解決方法:
- 配線を確認(特に
SDAとSCLがArduinoに正しく接続されているか)。 - I2Cアドレスが正しいかをI2Cスキャナで確認。
2. カウントダウンが動作しない
原因:markPinが期待する信号を受信していない可能性があります。 解決方法:
markPinにプルアップまたはプルダウン抵抗を追加して安定させます。- デジタル信号の状態をシリアルモニタで確認してください。
まとめ
このプロジェクトでは、Arduinoを使って外部信号(Mark信号)に基づくカウントダウン機能を実装しました。OLEDディスプレイを用いることで、状態を視覚的に確認でき、I2Cスキャナを活用して柔軟に設定可能です。このコードをもとに、さらなる機能追加やカスタマイズに挑戦してみてください。
IT・ガジェット・電子工作の知識をこれひとつで

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
PCアプリの操作解説、最新のガジェット情報、そして電子工作の専門書まで。 Kindle Unlimitedなら、あらゆるジャンルのIT・デジタル関連書籍が読み放題です。
「仕事の効率化」から「趣味の深掘り」まで、高価な専門書をわざわざ買わずに、必要な情報をその場で引き出せるのが最大のメリット。 現在は30日間の無料体験や、対象者限定の「3ヶ月499円」プランなどが用意されています。まずはご自身のアカウントでお得なオファーが表示されるかご確認ください。
