Raspberry Pi 4 + Python3入門 <STEP1> (6) 7セグメントLED HT16K33 その1 QUAD ALPHANUMERIC 4桁

 アマゾンで入手した4桁のQUAD ALPHANUMERICは、コントローラHT16K33を搭載しています。インターフェースはI2Cで、電源は3.3Vで動作します。表示色は赤色です。電源端子はVccとVi2Cと二つありますが、全桁を同時に表示することはないので、消費電流はそれほど多くないと推定し、ショートしました。
 LEDのセグメントは、DPを含んで全部で14個です。14 segment LEDとも呼ばれるようです。

 接続です。

HT16K33 ラズパイ
SCL SCL
SDA SDA
GND GND
VCC 3.3V
Vi2C 3.3V

プログラム

 ディスプレイ・ボードのスレーブ・アドレスは0x70です。14セグメントなので、1桁の表示データは2バイトの構成になります。正論理なので、'0'は消灯です。
 データシートから、system setupコマンドのデフォルトは0x20で、LSBを'1'にすると、スタンバイ・モードから、発振器がONになってノーマル・モードに移行します。dispaly setupコマンドのデフォルトは0x80で、LSBを'1'にすると、DisplayはONになります。この二つのコマンドで初期が終わります。

 4桁のLEDに、それぞれ2バイトのデータを送ります。最初の2バイトが一番左の桁で、最後の2バイトが一番右の桁のデータです。clear()関数は、すべて'0'なので、消灯します。

import smbus

i2c = smbus.SMBus(1)

HT18K33_address = 0x70

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

clear()
i2c.write_i2c_block_data(HT18K33_address, 0x0, [0xc3f,0x00,0x6,0x00,0xdb,0x00,0x8f,0x00])

 実行例です。

 これらのセグメント表示データは、こちらの方の記事を利用をさせていただきました。ありがとうございます。セグメントa~g1/g2は7segmentLEDと同じ振り方です。

  copyright David Johnson-Davies - www.technoblogy.com - 16th December 2019

4桁の数値を表示

 数字だけ抜き出しました。数値データは2バイトの値です。

0 1 2 3 4 5 6 7 8 9
c3f 6 db 8f e6 2069 fd 7 ff ef

 上記の数値はnumリストに代入しました。

testnumber = 5900

のように、4桁の数値を表示するプログラムです。先頭の数字が0のときはエラーになります。

import smbus
i2c = smbus.SMBus(1)
HT18K33_address = 0x70
#         0    1     2     3     4      5      6    7     8     9
num = [0xc3f, 0x6, 0xdb, 0x8f, 0xe6, 0x2069, 0xfd, 0x7, 0xff, 0xef]

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 number(n):
    return [num[int(n)], num[int(n)] >> 8]

def digitData(nn):
    return number(str(nn)[0]) + number(str(nn)[1]) + number(str(nn)[2]) + number(str(nn)[3])

clear()

testnumber = 5900
nnn = digitData(testnumber)
print(nnn)
i2c.write_i2c_block_data(HT18K33_address, 0x00, nnn)

 実行結果です。