はじめに
先日作ったMachiKania type P簡易キットを使って4桁赤色7セグメントLED OSL40562-LRに簡易キット付属のセンサーBME280で測定した温度・湿度・気圧を表示するプログラムを作成しました。
検証環境
次の環境で実行しました。
- macOS Tahoe 26.1
- MachiKania type P簡易キット
- MachiKania Phyllosoma 1.6.0.0
- 4桁赤色7セグLED : OSL40562-LR(カソードコモン)
- 温度湿度気圧センサ : BME280
配線
Raspberry Pi Picoと7セグLEDは次の表に示す端子で接続しました。表には7セグメントの位置(A〜G、DP)、MachiKaniaでのピン表記も記載しました。GP0からGP7までの8つの端子は150Ωの電流制限抵抗を介してLEDのアノードの端子と接続しています。
| Pico(GPIO) | Pico(物理) | 7セグLED | LED位置 | MachiKani |
|---|---|---|---|---|
| GP0 | 1 | 3 | DP | bit0 |
| GP1 | 2 | 5 | G | bit1 |
| GP2 | 4 | 10 | F | bit2 |
| GP3 | 5 | 1 | E | bit3 |
| GP4 | 6 | 2 | D | bit4 |
| GP5 | 7 | 4 | C | bit5 |
| GP6 | 9 | 7 | B | bit6 |
| GP7 | 10 | 11 | A | bit7 |
| GP20 | 26 | 6 | 1の位のカソード | bit10 |
| GP21 | 27 | 8 | 10の位のカソード | bit11 |
| GP22 | 29 | 9 | 百の位のカソード | bit12 |
| GP26 | 31 | 12 | 千の位のカソード | bit13 |
次にRaspberry Pi PicoとBME-280は次のように接続しました。
| Pico(GPIO) | Pico(物理) | BME-280 |
|---|---|---|
| GND | 38 | GND |
| 3V3 | 36 | VCC |
| GP8 | 11 | SDA |
| GP9 | 12 | SCL |
MACHIKAP.INIの設定
BME-280とRaspberry Pi PicoはI2Cで通思惟するようにします。Raspberry Pi PicoのGP8(SDA)とGP9(SCL)にBME-280を接続しました。このピン設定はMACHIKAP.INIに下記のように記述します。
I2CSDA=8
I2CSCL=9
数字データ
7セグメントLEDで数字を表示するためには数字のパターンデータが必要になります。
7セグメントLEDに表示する数字、小数点付きの数字、空白の21文字分を下記のように定義しました。プログラムでは表の16進データを配列D(0)〜D(20)に格納します。
| 数字 | A | B | C | D | E | F | G | DP | 16進データ |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | FC |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 60 |
| 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | DA |
| 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | F2 |
| 4 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 66 |
| 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | B6 |
| 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | BE |
| 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | E0 |
| 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | FE |
| 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | F6 |
| 0. | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | FD |
| 1. | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 61 |
| 2. | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | DB |
| 3. | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | F3 |
| 4. | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 67 |
| 5. | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | B7 |
| 6. | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | BF |
| 7. | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | E1 |
| 8. | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | FF |
| 9. | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | F7 |
| 表示なし | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 |
プログラム
BME280を使った温度・湿度・気圧測定表示プログラムはケンケンさんのホームページに掲載されているプログラムBME280.BASを使用し、その中に7セグメントLEDに温度・湿度・気圧データを表示するプログラムを追加しました。
LED表示用データ
上記に示した数字のデータを配列Dに格納しておきます。小数点を表示する場合はD(0)からD(9)のデータに1を加算すれば良いのでFORループでD(10)からD(19)に格納し、空白をD(20)に格納しています。
REM LED表示用データ
DIM D(20)
D(0)=$FC:D(1)=$60:D(2)=$DA:D(3)=$F2:D(4)=$66
D(5)=$B6:D(6)=$BE:D(7)=$E0:D(8)=$FE:D(9)=$F6
REM ドット付き数字データ
FOR I=10 TO 19
D(I)=D(I-10)+1
NEXT
D(20)=0 : REM 空白
LED表示プログラム
温度・湿度・気圧のデータをLEDへの出力はタイマ割り込みを使用して常に表示するようにしました。
ケンケンさんのホームページのプログラムで気圧、温度、湿度を表示していコードの次に気圧、温度、湿度の実数値を気圧は整数4桁に、温度と湿度は整数部2桁、小数部1桁にし、各桁の値を取り出してLED表示データを格納した配列の添字として使用します。
それぞのデータは3秒ごとに表示を切り替えるようにしています。
DO
GOSUB GETDAT
PRINT PRS#;"hPa ";TMP#;"deg ";HUM#;"%"
REM ここに気圧、温度、湿度の値を各桁ごとに取り出す
LOOP
タイマ割り込み設定
タイマー割り込みが10msecごとに発生するようにし、処理ルーチン名はDSPとしました。
タイマー割り込み設定後、すべてのLEDの表示をオフ(カソードをハイに)にしています。
REM タイマ割り込み設定 10000μsec間隔
USETIMER 10000
INTERRUPT TIMER,DSP
REM LEDをすべてオフに
OUT 13,1:OUT 12,1:OUT 11,1:OUT 10,1
タイマー割り込み処理ルーチン
タイマー割り込み処理ルーチンDSPはLEDのカソードをロー(0)にし、各桁に気圧、温度、湿度の各桁の値のデータを出力し、2msec後にカソードをハイ(1)にしてオフにします。
各桁の値は後述するコードで変数D1、D2、D3、D4に格納しておきます。
REM タイマ割り込み処理ルーチン
LABEL DSP
OUT 13,0:OUT8L D(D1):DELAYMS 2:OUT 13,1 : REM 最上位桁
OUT 12,0:OUT8L D(D2):DELAYMS 2:OUT 12,1
OUT 11,0:OUT8L D(D3):DELAYMS 2:OUT 11,1
OUT 10,0:OUT8L D(D4):DELAYMS 2:OUT 10,1 : REM 最下位桁
RETURN
気圧の各桁データの取り出し
気圧は4あるいは3桁の整数として表示するようにします。
気圧の実数値が変数PRS#に格納されているのでこれを整数4桁にして変数Pに格納します。その値を1000、100、10で除した値と剰余を求めて各桁の値を求め、変数D1からD4に格納します。
気圧が3桁の場合は最上位桁には何も表示しないようにしています(データ0を出力)。
REM 気圧データを桁ごとに分解
USEVAR D1,D2,D3,D4
P=VAL(SPRINTF$("%4.0f",PRS#))
D1=P/1000 : REM 千の位
IF D1=0 THEN D1=20 : REM 最上位桁が0の場合は表示しない。
P=P%1000
D2=P/100
P=P%100
D3=P/10
D4=P%10
DELAYMS 3000
気温の各桁データの取り出し
気温は整数2桁、小数部1桁で表示するようにしました。
桁の値の求め方は気圧と同じですが1の位(D3)は小数点を含むので10加算しています。
REM 温度データを桁ごとに分解
T=INT(VAL#(SPRINTF$("%3.2f",TMP#))*10)
D1=T/1000
IF D1=0 THEN D1=20
T=T%1000
D2=T/100
T=T%100
D3=T/10+10
D4=T%10
DELAYMS 3000
湿度の各桁データの取り出し
湿度も温度と同じ要領で各桁の値を取り出しています。
REM 湿度データをけた後に分解
H=INT(VAL#(SPRINTF$("%3.2f",HUM#))*10)
D1=H/1000
IF D1=0 THEN D1=20
H=H%1000
D2=H/100:H=H%100
D3=H/10+10
D4=H%10
DELAYMS 300
実行結果
プログラムの実行結果はこちらから確認できます。
最後に
4桁7セグメントLEDに気圧、温度、湿度を表示できるようになりました。タイマー割り込み間隔が短いと全桁0を表示し、長いと表示がちらついてしまいました。
