CircuitPython 10行プログラミング (9) 7セグメントLED
Trinket M0マイコン・ボードとCircuitPythonを使って、7セグメントLED(QUAD ALPHANUMERIC)に温度を表示します。接続するケーブルは最小限にしたいので、I2Cで接続できるモジュールを使います。コントローラは、ht16k33用のライブラリがあったので、これを導入します。
数値と文字の表示ができるので、温度計にしてみます。温度センサはLM35が定番ですが、そのままでは零下が測れません。400mVのオフセットがついているMCP9701を利用します。
●MCP9701のおもなスペック
- 電源電圧 3.1~5.5V
- 0℃の出力電圧 400mV
- 温度係数 19.5mV/℃
●接続
アナログ温度センサMCP9701のVoutをA4(シルク印刷では4)に、GNDはGND、Vddは3Vへつなぎます。
7セグメントLEDの接続は次のとおりです。
HT16K33 | Trinket M0 |
---|---|
SCL(C) | 0(SCL) |
SDA(D) | 2(SDA) |
GND(-) | GND |
VCC(+) | USB |
Vi2C(+) | 3V |
(※)2019/02/27 上記の配線図にプルアップ抵抗を入れ忘れています。実験では6.8kΩをSCL/SDA信号に入れました。4.7k~10kΩならOKでしょう。
●温度の読み取り
from analogio import AnalogIn
from board import *
from time import sleep
pin = AnalogIn(A4)
while 1:
print(((pin.value / 65535 * 3.3) - 0.4) / 0.0195)
sleep(3.14)
温度データがすごくばらつきます。オシロスコープでA4端子(赤色)を観測すると、50Hzのハムが乗っています。電源ラインに何種類かのコンデンサを入れましたが、改善されませんでした。
●ht16k33ライブラリの導入
今までいろいろなライブラリに追加してadafruit_ht16k33フォルダをコピーしようとしたら、容量が足らないとアラートが出ました。したがって、不要なライブラリは削除し次の三つだけをlibに保存しました。
●7セグLEDへの表示
50Hzで揺らいでいる中で最低値が、別の温度計の値とほぼ同じなので、30回測定し、その最低の値を温度に変換しました。
温度変換時に、3V端子が3.28Vだったので、3.3の代わりに利用しています。-0.4はオフセットの400mVです。
ht16k33用のライブラリはQUAD ALPHANUMERIC以外に、普通の7セグLED、マトリクスなどに対応しています。
from board import *
from busio import I2C
from analogio import AnalogIn
from time import sleep
import adafruit_ht16k33.segments
i2c = I2C(SCL, SDA)
display = adafruit_ht16k33.segments.Seg14x4(i2c, address=0x70)
pin = AnalogIn(A4)
while 1:
Vdata = []
for i in range(30):
Vdata.append(pin.value)
T0 = ((min(Vdata) / 65535 * 3.28) - 0.40) / 0.0195
print(T0)
display.print(round(T0,1))
display.print('C')
display.show()
sleep(2)
実行中の様子です。