0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MachiKania type Pで4桁赤色7セグLEDを駆動する

Posted at

はじめに

先日作ったMachiKania type P簡易キットを使って4桁赤色7セグメントLED OSL40562-LRに簡易キット付属のセンサーBME280で測定した温度・湿度・気圧を表示するプログラムを作成しました。

検証環境

次の環境で実行しました。

配線

Raspberry Pi Picoと7セグLEDは次の表に示す端子で接続しました。表には7セグメントの位置(A〜G、DP)、MachiKaniaでのピン表記も記載しました。GP0からGP7までの8つの端子は150Ωの電流制限抵抗を介してLEDのアノードの端子と接続しています。

7SEGLED.png

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に下記のように記述します。

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を表示し、長いと表示がちらついてしまいました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?