CircuitPython 10行プログラミング (9) 7セグメントLED

 Tinket 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)

 実行中の様子です。