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

* 仕様 [#b71a2902]

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

* RasPi側の準備 [#b0aa73f9]

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


** SPIを有効にする [#w7bbecee]
sudo raspi-configでSPIを有効にする

** MAX7219ドライバーのインストール [#v86ead9f]

 $ 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モジュールを接続 [#ma0d10c3]

** 接続順 [#f288d855]

|GPIO|LED1(IN)|LED1(OUT)|LED2(IN)|
|2(5V)|VCC|VCC|VCC|
|20(GND)|GND|GND|GND|
|19(MOSI)|DIN|DOUT|DIN|
|24(CE0)|CS|CS|CS|
|24(CLK)|CLK|CLK|CLK|

** RasPiのGPIO [#s657f2a5]

|3.3V		|1		|&color(black,yellow){2};		|5V			|
|I2C_SDA    |3	    |4	    |5V     	|
|I2C_SCL    |5	    |6	    |GND    	|
|GP04       |7	    |8	    |TxD    	|
|GND        |9	    |10	    |RxD    	|
|GP17       |11	    |12	    |GP18   	|
|GP27       |13	    |14	    |GND    	|
|GP22       |15	    |16	    |GP23   	|
|3.3V       |17	    |18	    |GP24   	|
|SPI_MOSI   |&color(black,yellow){19};	    |&color(black,yellow){20};	    |GND    	|
|SPI_MISO   |21	    |22	    |GP25   	|
|SPI_CLK    |&color(black,yellow){23};	    |&color(black,yellow){24};	    |SPI_CE0	|
|GND        |25	    |26	    |SPI_CE1	|
|ID_SD      |27	    |28	    |ID_SC  	|
|GP05       |29	    |30	    |GND    	|
|GP06       |31	    |32	    |GP12   	|
|GP13       |33	    |34	    |GND    	|
|GP19       |35	    |36	    |GP16   	|
|GP26       |37	    |38	    |GP20   	|
|GND        |39	    |40	    |GP21   	|



* ソースコード [#d064ba1e]
 $ 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セグライブラリは、カスケードすると後ろのモジュールから表示されるみたい。~



* 実行 [#k14c78fb]
 $ sudo python3 date_time.py

* Pi4またはBusterでエラーが出る場合 [#ma5c08ce]
- 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

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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS