4 bits Segment Display(TM1637) JP

概要
TM1637は7セグメントディスプレイを制御するドライバICで、Arduinoのようなマイコンと簡単に接続して使用できます。数字の間に「:」があるためデジタル時計の実装に特によく使用され、温度計、カウンターなどさまざまな電子プロジェクトで広く活用されています。
仕様
TM1637モジュール仕様
| 項目 | 仕様 |
|---|---|
| 電源供給 | 3.3V ~ 5V |
| インターフェース | I2C(TWI) |
| ディスプレイ | 7セグメントディスプレイ(4桁) |
| 制御ピン | CLK(クロック)、DIO(データ) |
| 温度範囲 | -20°C ~ 70°C |
| サイズ | 42 * 29 * 12 (mm) |
固定穴
| 項目 | 詳細 |
|---|---|
| 穴の数 | M2ネジ用の穴 4個 |
| 穴のサイズ | 2.2mm |
活用例
回路構成
| ピン | Arduino |
|---|---|
| GND | GND |
| VCC | 5V |
| DIO | D3 |
| CLK | D2 |

ライブラリ
TM1637Display.h ライブラリを使用します。
ライブラリマネージャで「TM1637」と検索すれば簡単にインストールできます。
ライブラリの使い方については Arduino ライブラリ ページをご参照ください。
TM1637 ライブラリの主な関数
| 関数 | 説明 |
|---|---|
TM1637Display(CLK, DIO, delay)
|
TM1637オブジェクトの生成コンストラクタ。CLKとDIOピンを設定。 |
setBrightness(uint8_t b, OnOff)
|
ディスプレイの明るさを設定(0x00~0x0f)。 |
showNumberDec(int num, bool leading_zero)
|
整数を10進数で表示。leading_zeroがtrueなら先頭に0を追加。 |
showNumberHex(uint8_t num, bool leading_zero)
|
16進数で数値を表示。 |
clear()
|
ディスプレイを消去。 |
setSegments(const uint8_t segments[], uint8_t size)
|
カスタムセグメントを表示。 |
1. 数字表示
0~10の数字を0.5秒ごとに変更しながら表示します。表示する数字は4桁まで簡単に調整可能です。
showNumberDec(int num, bool leading_zero)
|
整数を10進数で表示。leading_zeroがtrueなら「0001」のように表示。 |
leading_zeroをtrueにすると、1を表示する際に「0001」の形式になります。
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
void setup() {
display.setBrightness(0x0f);
}
void loop() {
for (int i = 0; i <= 10; i++) {
display.showNumberDec(i, false);
delay(500);
}
}
実行結果
2. デジタル時計表示
時間と分を24時間形式で表示します。
showNumberDecEx関数は、中央のコロンを表示するために使われる拡張バージョンです。
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
void setup() {
display.setBrightness(0x0f);
}
void loop() {
int hour = 12;
int minute = 0;
for (int i = 0; i < 60; i++) {
display.showNumberDecEx(hour * 100 + minute, 0b11100000, true);
delay(60000);
minute = (minute + 1) % 60;
if (minute == 0) hour = (hour + 1) % 24;
}
}
実行結果

3. setSegments 関数を使った文字表示
7セグメントパターンの構造は以下の通りです。
「GONG」という文字を表示するには、次のような設定をします。

| 文字 | G | F | E | D | C | B | A | 2進数 | 16進数 |
|---|---|---|---|---|---|---|---|---|---|
| G | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 111101 | 3d |
| O | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1011100 | 5c |
| N | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1010100 | 54 |
点灯させる部分を1、消灯させる部分を0に設定し、目的の文字に対応する2進数を求めた後、16進数に変換して配列に適用します。
以下はそのコード例です:
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
byte data[] = {0x3d, 0x5c, 0x54, 0x3d};
void setup() {
display.setBrightness(0x0f);
}
void loop() {
display.setSegments(data);
}
実行結果

4. 文字をスクロール表示する効果
4桁を超える文字列を表示する際、左方向にスクロールさせて見せることができます。
「GONGZIPSA」という文字列を前の例のように定義し、1文字ずつ左に流れていくように表示します。
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
// セグメントパターン
byte data[] = {0x3D, 0x5C, 0x54, 0x3D, 0x49, 0x30, 0x73, 0x6D, 0x77};
void setup() {
display.setBrightness(0x0f);
}
void loop() {
int stringLength = sizeof(data) / sizeof(data[0]);
int displaySize = 4;
for (int i = 0; i < stringLength + displaySize; i++) {
byte displayData[displaySize] = {0, 0, 0, 0};
for (int j = 0; j < displaySize; j++) {
if (i + j >= 0 && i + j < stringLength) {
displayData[j] = data[i + j];
}
}
display.setSegments(displayData);
delay(500);
}
}
実行結果

