4桁の7セグをラズパイで動かす

時計やセンサーの値をリアルタイムで表示させる勉強として、4桁の7セグを扱ってみました。
Pythonでダイナミック点灯させます。こんな感じ↓↓↓
<img width="500" alt="IMG_0364.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/b52e41f0-6470-1077-0eb3-4635758bbb89.jpeg">

1桁の7セグの記事は[こちら](https://qiita.com/umet787X/items/cc2596145f8d02cffd70)

#動作環境
Raspberry Pi 4 Model B
Python3.7.3

#準備するもの
- 4桁7セグメント (今回は、白色の [A-574SR-LF B/W](https://akizukidenshi.com/catalog/g/gI-15752/) を使用)
- 抵抗 (白色の場合は、330Ω)
- ブレッドボード
- ジャンパ線

#配線

A-574SR-LF B/W での７セグのピン番号とGPIOのポート番号は以下の通りです。

- 桁数側

| 7セグ ピン番号 | 12 | 9 | 8 | 6 |
|:-:|:-:|:-:|:-:|:-:|
| GPIO | 11 | 13 | 15 | 16 |

- 数字盤側

| 7セグ ピン番号 | 11(A) | 7(B) | 4(C) | 2(D) | 1(E) | 10(F) | 5(G) | 3(DP) |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| GPIO | 31 | 33 | 35 | 37 | 40 | 32 | 36 | 38 |


#プログラム
###好きな4桁の整数を表示させるプログラム

<details><summary>クリックすると開きます</summary><div>

```python:7seg4_A.py
import RPi.GPIO as GPIO
from time import sleep

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
segmentpins = [31,33,35,37,40,32,36,38] #数字盤側
digitpins = [16,15,13,11] #桁数側
GPIO.setup(segmentpins, GPIO.OUT)
GPIO.setup(digitpins, GPIO.OUT)

numbers = [
    #a,b,c,d,e,f,g,p
    [1,1,1,1,1,1,0], #0
    [0,1,1,0,0,0,0], #1
    [1,1,0,1,1,0,1], #2
    [1,1,1,1,0,0,1], #3
    [0,1,1,0,0,1,1], #4
    [1,0,1,1,0,1,1], #5
    [1,0,1,1,1,1,1], #6
    [1,1,1,0,0,1,0], #7
    [1,1,1,1,1,1,1], #8
    [1,1,1,0,0,1,1], #9
    ]

def displayNumber(n):
    ns = numbers[n]
    for i,n in enumerate(ns):
        n = 1 if n == 0 else 0
        GPIO.output(segmentpins[i],n)

def displayNumbers(vs):
    for i in range(4):
        GPIO.output(digitpins[i], 1)
        displayNumber(vs % 10)
        digitalclear()
        GPIO.output(digitpins[i], 0)
        vs = vs // 10

def digitalclear():
    for i in range(8):
        GPIO.output(segmentpins[i], 1)

no = int(input(“表示する値を入力してください”))
while True:
    displayNumbers(no)

GPIO.cleanup()
```
</div></details>


###好きな4桁の小数を表示させるプログラム
<b>！14.62など整数2桁、小数2桁の形で入力！</b>
<details><summary>クリックすると開きます</summary><div>

```python:7seg4_B.py
import RPi.GPIO as GPIO
from time import sleep

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
segmentpins = [31,33,35,37,40,32,36] #数字盤側
digitpins = [16,15,13,11] #桁数側
GPIO.setup(segmentpins, GPIO.OUT)
GPIO.setup(digitpins, GPIO.OUT)

numbers = [
    #a,b,c,d,e,f,g,p
    [1,1,1,1,1,1,0,0], #0
    [0,1,1,0,0,0,0,0], #1
    [1,1,0,1,1,0,1,0], #2
    [1,1,1,1,0,0,1,0], #3
    [0,1,1,0,0,1,1,0], #4
    [1,0,1,1,0,1,1,0], #5
    [1,0,1,1,1,1,1,0], #6
    [1,1,1,0,0,1,0,0], #7
    [1,1,1,1,1,1,1,0], #8
    [1,1,1,0,0,1,1,0], #9
    ]

def displayNumber(n,dot = False):
    ns = numbers[n]
    for i,n in enumerate(ns):
        n = 1 if n == 0 else 0
        GPIO.output(segmentpins[i],n)
    v = GPIO.LOW if dot else GPIO.HIGH
    GPIO.output(segmentpins[7], v)

def displayNumbers(no):
    no = int( no * 100 ) #小数を整数にして表示している
    for i in range(4):
        GPIO.output(digitpins[i], 1)
        dot = True if i==2 else False #小数点の位置は、i==の値を変える
        displayNumber(no % 10, dot)
        digitalclear()
        GPIO.output(digitpins[i], 0)
        no = no // 10

def digitalclear():
    for b in range(8):
        GPIO.output(segmentpins[b], 1)

no = int(input(“表示する値を入力してください”))
while True:
    displayNumbers(no)
    
GPIO.cleanup()
```
</div></details>

#参考サイト
[4桁7セグメントLEDで始めるArduino](https://garretlab.web.fc2.com/arduino/introduction/beginning_with_7segment_led/)