タイムコードみたいな表示をする時計

仕様

  • RaspberryPi OS Stretch
  • Python3
  • SPI 7セグ 8桁 LEDモジュール(MAX7219使用)を2個カスケード
    https://amzn.to/3gw7GpT
  • NTP同期
  • 1/30秒のケタをそれっぽく表示(正確ではなくフェイクです)

RasPi?側の準備

NTP

そのままでもInternetにつながっていれば時刻同期している模様。
ntpdをインストールしても良い。

SPIを有効にする

sudo raspi-configでSPIを有効にする

MAX7219ドライバーのインストール

$ sudo apt-get install python3-dev python3-pip
$ sudo pip3 install max7219

$ git clone https://github.com/rm-hull/max7219.git
$ cd max7219
$ sudo pip3 install -e .

$ sudo python setup.py install

RaspPi?にLEDモジュールを接続

接続順

GPIOLED1(IN)LED1(OUT)LED2(IN)
2(5V)VCCVCCVCC
20(GND)GNDGNDGND
19(MOSI)DINDOUTDIN
24(CE0)CSCSCS
24(CLK)CLKCLKCLK

RasPi?のGPIO

3.3V125V
I2C_SDA345V
I2C_SCL56GND
GP0478TxD
GND910RxD
GP171112GP18
GP271314GND
GP221516GP23
3.3V1718GP24
SPI_MOSI1920GND
SPI_MISO2122GP25
SPI_CLK2324SPI_CE0
GND2526SPI_CE1
ID_SD2728ID_SC
GP052930GND
GP063132GP12
GP133334GND
GP193536GP16
GP263738GP20
GND3940GP21

ソースコード

$ cat date_time.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
from datetime import datetime

from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.virtual import viewport, sevensegment


def opening(seg):
        seg.text = "    v1.00TC CLOCK"

def clock(seg):
    """
    Display current time on device.
    """
    interval = (1/60)*2-0.007
    frm = 0
    old_sec = ""

    while True:
        now = datetime.now()

        if old_sec != now.strftime("%S"):
            frm = 0
            old_sec = now.strftime("%S")

        if frm <= 2:
            seg_text1 = now.strftime("20%y.%m.%d")
            seg_text2 = now.strftime("%H%M%S")
        elif frm >= 3:
            seg_text1 = now.strftime("20%y.%m.%d")
            seg_text2 = now.strftime("%H.%M.%S.")

        if frm < 10:
            frm2 = "0" + str(frm)
        else:
            frm2 = str(frm)

        seg_text2 = seg_text2 + frm2

        # LED output
        seg.text = seg_text2 + seg_text1
        frm = frm + 1

        time.sleep(interval)


def main():
    # create seven segment device
    serial = spi(port=0, device=0, gpio=noop())
    device = max7219(serial, cascaded=2)
    seg = sevensegment(device)

    opening(seg)
    time.sleep(3)
    clock(seg)


if __name__ == '__main__':
    main()

システムクロックを取得してLEDに表示させている。
1/30秒でループを回してカウンターを回し、1/30秒の桁を作っている。
1/30秒の桁のリセットは、システムクロックの秒の値が変わった時に行っている。
ループの速度はRasPi?の種類で少し変わる。
デジマルポイントを点滅させている。(00.00〜00.03が消灯)
7セグライブラリは、カスケードすると後ろのモジュールから表示されるみたい。

実行

$ sudo python3 date_time.py

Pi4またはBusterでエラーが出る場合

  • spidevのバージョンが3.5にアップされているとエラーになる
    $ pip3 list | grep spidev
    spidev            3.5
  • 3.4に落とす
    $ sudo pip3 install spidev==3.4 --force-reinstall
    $ pip3 list | grep spidev
    spidev            3.4

メモ書き

  • RasPi3B+でテスト&調整
    • CLI/GUIでの負荷の差は無い
    • 更新周期1/60は厳しい
  • PiZero?では1/30桁の表示が間に合わない
    シングルコアではCLIでもPythonはきついみたい

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-09 (日) 15:47:30 (49d)