Raspberry Pi PicoでTM1637ディスプレイを活用!カウントダウンタイマーの作成手順とコード解説

目次

はじめに

このディスプレイは数字や一部のアルファベットを非常にきれいに表示することができます。
時間や簡単な文字を表示するのに便利なディスプレイです。

動作の仕組み

正式名称は、「4-digit 7セグメントディスプレイ」です。
直訳すると、4桁 7分割のディスプレイとなります。

4桁:4つの数字または文字を表現できます。
7分割:特定のパターン(「8」の字)に並んだ7つのLEDを指しています。

これらのLEDは「TM1637 Serial LED driverで」制御されています。
LEDのon/off、輝度、各LEDへのアクセスを制御しています。

配線

RaspberryPi Pico4-digitディスプレイ
VSYS(39番)VCC
GND(38番)GND
GP0(1番)CLK
GP1(2番)DIO
()内はピン番号

1分間カウントダウンして「PICO」という文字を出し、消灯する

ライブラリをimportもしくは下記のファイルを準備します。tm1637.pyで保存してください

import time
from machine import Pin

class TM1637:
    def __init__(self, clk, dio):
        self.clk = clk
        self.dio = dio
        self.clk.init(Pin.OUT)
        self.dio.init(Pin.OUT)
        self.dbuf = [0, 0, 0, 0]
        self.cmd(0x40)

    def start(self):
        self.dio(1)
        self.clk(1)
        self.dio(0)
        self.clk(0)

    def stop(self):
        self.clk(0)
        self.dio(0)
        self.clk(1)
        self.dio(1)

    def write_byte(self, b):
        for i in range(8):
            self.clk(0)
            if b & 1:
                self.dio(1)
            else:
                self.dio(0)
            b >>= 1
            self.clk(1)

        self.clk(0)
        self.dio.init(Pin.IN)
        self.clk(1)
        ack = self.dio()
        if ack == 0:
            self.dio.init(Pin.OUT)
        self.clk(0)
        self.dio.init(Pin.OUT)

    def cmd(self, cmd):
        self.start()
        self.write_byte(cmd)
        self.stop()

    def display(self, data):
        self.cmd(0x40)
        self.start()
        self.write_byte(0xc0)
        for i in range(4):
            self.write_byte(data[i])
        self.stop()
        self.cmd(0x88 + 7)

    def clear(self):
        self.display([0, 0, 0, 0])

    def numbers(self, num):
        digits = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]
        self.display([digits[int(d)] for d in "{:04d}".format(num)])

    # 追加: アルファベットを表示する関数
    def show_text(self, text):
        # 表示可能なアルファベットの16進コード
        char_map = {
            'A': 0x77, 'b': 0x7C, 'C': 0x39, 'd': 0x5E,
            'E': 0x79, 'F': 0x71, 'G': 0x3D, 'H': 0x76,
            'I': 0x06, 'J': 0x1E, 'L': 0x38, 'O': 0x3F,
            'P': 0x73, 'S': 0x6D, 'U': 0x3E, ' ': 0x00  # 空白は消灯
        }
        
        # 入力された文字列のうち、4文字分を表示
        data = []
        for char in text[:4]:
            data.append(char_map.get(char.upper(), 0x00))  # マップにない文字は消灯
        while len(data) < 4:
            data.append(0x00)  # 4桁未満なら空白で埋める

        # 表示
        self.display(data)

以下がメインのコードです

from machine import Pin
from tm1637 import TM1637
import time

# GPIOピンの定義
clk = Pin(0)
dio = Pin(1)

# TM1637のインスタンスを作成
tm = TM1637(clk, dio)

# カウントダウンタイマーの関数
def countdown(minutes, seconds):
    # 総秒数を計算
    total_seconds = minutes * 60 + seconds

    # 1秒ずつカウントダウン
    while total_seconds >= 0:
        # 分と秒を計算
        mins = total_seconds // 60
        secs = total_seconds % 60

        # 分と秒を4桁で表示 (例: 01:30 は 0130 と表示)
        tm.numbers(mins * 100 + secs)

        # 1秒待機
        time.sleep(1)

        # 残り秒数を1減らす
        total_seconds -= 1

    # カウントダウン終了後、「PICO」を表示
    tm.show_text("PICO")

    # 10秒待機してから消去
    time.sleep(10)
    tm.clear()

# 1分間のカウントダウンを開始 (1分 = 0分60秒)
countdown(1, 0)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次