Smart gadget SHT4x を使って電子百葉箱を作る ⑥ ラズパイ+表示器HT16K33
前回、Smart gadget SHT4xからラズパイで温度と湿度を読み出しました。
●表示器HT16K33
I2CのインターフェースをもつコントローラHT16K33は、マトリクスで構成された複数LEDを点灯します。7セグメントLED、14セグメントLED、ドット・マトリクスなどに対応します。
ここでは、4桁の14セグメントLEDを利用します。ebayで緑色を指定したら、最初の2桁が赤色、残りが緑色の製品が届きました。
●表示器をつなぐ
4桁の14セグメントLEDをつないで、温度と湿度を表示します。
接続はI2Cです。写真の右二つの端子は電源用です。
●プログラム
HT16K33を駆動するプログラムをLED14seg.pyで保存します。
Raspberry Pi 4 + Python3入門 <STEP1> (6) 7セグメントLED HT16K33 その1 QUAD ALPHANUMERIC 4桁
Raspberry Pi 4 + Python3入門 <STEP1> (7) 7セグメントLED HT16K33 その2 BME280のデータ表示
import smbus, time
i2c = smbus.SMBus(1)
HT18K33_address = 0x70
# copyright David Johnson-Davies - www.technoblogy.com - 16th December 2019
# 0 1 2 3 4 5 6 7 8 9
num = [0xc3f, 0x6, 0xdb, 0x8f, 0xe6, 0x2069, 0xfd, 0x7, 0xff, 0xef]
minus = 0xc0
i2c.write_byte(HT18K33_address, (0x20 | 0x01)) # system setup
i2c.write_byte(HT18K33_address, (0x80 | 0b00000001)) # dispaly setup blink OFF
def clear():
i2c.write_i2c_block_data(HT18K33_address, 0x00, [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
def digitData(n):
nn = list(str(n))
ff = []
x = 0
number = 0
if '-' in str(n):
number = [minus, minus >> 8]
ff = ff + number
nn = nn[1:]
n = abs(n)
dotnumber = str(n).index('.')
for x in range(len(str(n))-3):
lookupNumber = int(nn[x])
num[lookupNumber] = num[lookupNumber] & ~0x4000
number = [num[lookupNumber], num[lookupNumber] >> 8]
ff = ff + number
# dot number
lookupNumber = int(nn[dotnumber-1])
num[lookupNumber] = num[lookupNumber] | 0x4000 # dot
number = [num[lookupNumber], num[lookupNumber] >> 8]
ff = ff + number
# last digit
lookupNumber = int(nn[dotnumber+1])
num[lookupNumber] = num[lookupNumber] & ~0x4000
number = [num[lookupNumber], num[lookupNumber] >> 8]
ff = ff + number
return ff
def disp14seg(nnnn):
i2c.write_i2c_block_data(HT18K33_address, 0x00, digitData(nnnn))
本体のプログラムはsht40-HK.pyの名前で保存しました。
from bluepy import btle
import struct
import time
import LED14seg as LED14
LED14.clear()
LED14.disp14seg(0.0)
T_Characteristic_UUID = "00002235-b38d-4985-720e-0f993a68ee41"
H_Characteristic_UUID = "00001235-b38d-4985-720e-0f993a68ee41"
deviceAddr = "fb:b0:25:a6:9c:d9"
time.sleep(5)
LED14.disp14seg(1.0)
peri = btle.Peripheral()
peri.connect(deviceAddr, btle.ADDR_TYPE_RANDOM)
#print('connect')
LED14.disp14seg(1.1)
Temp = peri.getCharacteristics(uuid=T_Characteristic_UUID)[0]
Humi = peri.getCharacteristics(uuid=H_Characteristic_UUID)[0]
while 1:
try:
readTemp = Temp.read()
temperature = struct.unpack('<f', readTemp)[0]
#print(round(temperature,1))
LED14.clear()
LED14.disp14seg(str(round(temperature,1)))
time.sleep(5)
readHumi = Humi.read()
humidity = struct.unpack('<f', readHumi)[0]
#print(round(humidity,1))
LED14.clear()
LED14.disp14seg(str(round(humidity,1)))
except btle.BTLEException:
print('err! continue')
#print("")
time.sleep(5)
peri.disconnect()
温度と湿度を交互に表示します。
●ブート時に自動実行
ラズパイが立ち上がったら自動起動するように設定します。
上記のプログラムは、/home/pi/sht40-HK.pyに保存しています。
sudo nano /lib/systemd/system/sht40.service
でエディタを立ち上げ、次の内容を記述し、保存します。
[Unit]
Description = humidity&temperature
[Service]
ExecStart = /usr/bin/python /home/pi/sht40-HK.py
Restart = always
[Install]
WantedBy = multi-user.target
ターミナルから、
sudo systemctl enable sht40.service
で起動時に実行の設定を行い(一度でよい)、リブートします。
電源だけ有効にして起動し、動作を確認します。