$prog &HFF , &HE2 , &HD9 , &HFC 'CKDIV8 = 1 , BODLEVEL = 4.3V ' ' **************************************************** ' * RGBフルカラー 32×64ドットマトリクス LEDパネル * ' * 温度・湿度・気圧計+時計 [V3] プログラム * ' * Ver. 3.01 2024. 9.27 * ' **************************************************** ' ' Ver 0.31 [試用版] 初回公開バージョン。2024.10.12 ' Const Prgver = " 0.31" 'プログラム・バージョン。 ' ' Const Ledbuff_length = 64 'LEDバッファーの横軸バイト数。(横64ドット) Const Ledbuff_size = 1024 'LEDバッファーの容量。(横64バイト × 縦16ドット) ' Const Bme280_adr = &HEC 'BME280のI2Cアドレス。 ' $baud = 9600 'ハードウェアUARTの通信速度(ボーレート)を設定。 $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 8000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 32 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Panel_rgb Alias Portb 'RGB LEDパネル [R1,G1,B1,R2,G2,B2]の接続ポート。 Panel_a Alias Portd.7 'RGB LEDパネル [A]の接続ポート.ビット。 Panel_a_p Alias Portd 'RGB LEDパネル [A]の接続ポート。 Panel_a_b Alias 7 'RGB LEDパネル [A]の接続ビット。 Panel_b Alias Portd.6 'RGB LEDパネル [B]の接続ポート.ビット。 Panel_b_p Alias Portd 'RGB LEDパネル [B]の接続ポート。 Panel_b_b Alias 6 'RGB LEDパネル [B]の接続ビット。 Panel_c Alias Portd.5 'RGB LEDパネル [C]の接続ポート.ビット。 Panel_c_p Alias Portd 'RGB LEDパネル [C]の接続ポート。 Panel_c_b Alias 5 'RGB LEDパネル [C]の接続ビット。 Panel_d Alias Portb.7 'RGB LEDパネル [D]の接続ポート.ビット。 Panel_d_p Alias Portb 'RGB LEDパネル [D]の接続ポート。 Panel_d_b Alias 7 'RGB LEDパネル [D]の接続ビット。 Panel_clk Alias Portb.6 'RGB LEDパネル [CLK]の接続ポート.ビット。 Panel_clk_p Alias Portb 'RGB LEDパネル [CLK]の接続ポート。 Panel_clk_b Alias 6 'RGB LEDパネル [CLK]の接続ビット。 Panel_lat Alias Portd.4 'RGB LEDパネル [LAT]の接続ポート.ビット。 Panel_lat_p Alias Portd 'RGB LEDパネル [LAT]の接続ポート。 Panel_lat_b Alias 4 'RGB LEDパネル [LAT]の接続ビット。 Panel_oe Alias Portd.3 'RGB LEDパネル [OE]の接続ポート.ビット。 Panel_oe_p Alias Portd 'RGB LEDパネル [OE]の接続ポート。 Panel_oe_b Alias 3 'RGB LEDパネル [OE]の接続ビット。 ' Sw_1 Alias Pinc.3 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portc.3 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinc.2 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portc.2 'スイッチ[2]の接続ポート(プルアップ用)。 Sw_3 Alias Pinc.1 'スイッチ[3]の接続ポート。 Sw_3pu Alias Portc.1 'スイッチ[3]の接続ポート(プルアップ用)。 Rtc_1s Alias Pinc.5 'RTC [DS3231]の1秒出力接続ポート。 Rtc_1spu Alias Portc.5 'RTC [DS3231]の1秒出力接続ポート(プルアップ用)。 ' ' * 変数の宣言 * ' Dim Ledbuff(1024) As Byte 'RGB LEDパネルのデータ・バッファー。(横64バイト * 縦16ドット) Dim Rowadr As Byte 'LEDバッファーのロー・アドレスカウンター。(0〜7) Dim Ledintf As Byte 'LED表示割り込み発生フラグ。 Dim Transfer_length As Byte 'LEDバッファーに転送するバイト数。 Dim Ledx As Byte 'LED表示の[X]アドレス。(1〜128) Dim Ledy As Byte 'LED表示の[Y]アドレス。(1〜2) Dim Ledcolor As Byte 'LED表示の文字色。(0〜7) Dim Ledback As Byte 'LED表示の背景色。(0〜7) Dim Ledchr As Byte 'LED表示の文字ASCIIコード。(&H20〜&HFF) Dim Ledlen As Byte 'LED表示のXの塗りつぶしドット数。(1〜128) ' Dim Swcount As Byte 'スイッチ入力チェック用タイマーカウンター。 Dim Swflag As Byte 'スイッチ入力検出フラグ。 Dim Swdata As Byte 'スイッチ入力データ。 Dim Swtemp As Byte 'スイッチ入力データの一時保管用。 Dim Timebuff(8) As Byte '時刻データバッファー。 Dim Hourmode As Byte '12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Time100ms As Byte '100mSカウンター。 Dim Brighttemp As Byte '輝度値の保管用。 Dim Brightcount As Byte '輝度値の平均カウンター。 Dim Brightsum As Word '輝度値の平均合計値。 Dim Brightmax As Byte 'LEDパネルの輝度上限値。(12〜123) Dim Dispsta As Byte '表示の状態。(0:表示OFF , 1:表示ON) Dim Dispmode As Byte '表示モード。(0〜2:通常表示, 3:最高値/最低値表示, 4〜6:グラフ表示) Dim Dispmodetemp1 As Byte '表示モードの移行前の保管用。 Dim Dispmodetemp2 As Byte '表示モードの移行前の保管用。 Dim Colcoun As Byte 'コロン消灯用500mSカウンター。 Dim Colmode As Byte 'コロン表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Dim Hourtemp As Byte '[時]更新用テンポラリ。 Dim Daytemp As Byte '[日]更新用テンポラリ。 Dim Serialtime As Byte 'シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Dim Serialbuff(40) As Byte 'シリアル送信バッファー。 Dim Serialcount As Byte 'シリアル送信バッファーのカウンター。 ' Dim Temperature As Integer '温度値。(x0.1) Dim Humidity As Word '湿度値。(x0.1) Dim I2cbuff(30) As Byte 'I2C送受信バッファー。 Dim Baropress As Word '気圧値。(XXXXX -> XXXX.X hP) Dim Tempmax As Integer '温度の最高値。 Dim Tempmin As Integer '温度の最低値。 Dim Humimax As Word '湿度の最高値。 Dim Humimin As Word '湿度の最低値。 Dim Baromax As Word '気圧の最高値。 Dim Baromin As Word '気圧の最低値。 Dim Deviation As Integer '気圧の24時間偏差値。(XXXXX -> XXXX.X hP) Dim Weather As Byte '天気予報値。 Dim Dbuff(24) As Word '24時間のデータバッファー。 Dim Dbuffpoi As Byte '24時間のデータバッファー用ポインター。(1〜24) Dim T64buff1(64) As Byte '温度用の64時間のデータバッファー。 Dim T64buff2(64) As Byte '湿度用の64時間のデータバッファー。 Dim T64buff3(64) As Byte '気圧用の64時間のデータバッファー。 Dim T64buffpoi As Byte '64時間のデータバッファー用ポインター。(1〜64) ' Dim Sqw1hzflag As Byte 'DS3231の[SQW]ピンの1Hz確認フラグ。 Dim Time1s As Byte '1秒経過フラグ。 Dim T As Integer , H As Integer , P As Dword '温度値,湿度値,気圧値の変数。 Dim Tb As Byte , Hb As Byte '温度値,湿度値の整数部のバイト値。 Dim Wbgt As Byte 'WBGT値。 Dim Wbgtlevel As Byte 'WBGT警報レベル。 Dim Wbgtleveltemp As Byte 'WBGT警報レベルの更新保管用。 Dim Deviainsert As Byte '気圧偏差値の差し込み表示。(0:無し , 1〜9:差し込み秒数) ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Temp5 As Byte '汎用テンポラリ変数 Byte型 No.5 Dim Temp6 As Byte '汎用テンポラリ変数 Byte型 No.6 Dim Temp7 As Byte '汎用テンポラリ変数 Byte型 No.7 Dim Temp8 As Byte '汎用テンポラリ変数 Byte型 No.8 Dim Temp9 As Byte '汎用テンポラリ変数 Byte型 No.9 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempw3 As Word '汎用テンポラリ変数 Word型 No.3 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Tempstr As String * 90 '汎用テンポラリ変数 String型 Dim Tempstr2 As String * 10 '汎用テンポラリ変数 String型 Dim Tl1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tl2 As Long '汎用テンポラリ変数 Long型 No.2 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eephourmode As Eram Byte 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Eepdispsta As Eram Byte 'EEPROM 表示の状態。(0:表示OFF , 1:表示ON) Dim Eepdispmode As Eram Byte 'EEPROM 表示モード。(0〜2:通常表示, 3:最高値/最低値表示, 4〜6:グラフ表示) Dim Eepdispmodetemp1 As Eram Byte 'EEPROM 表示モードの移行前の保管用。 Dim Eepdispmodetemp2 As Eram Byte 'EEPROM 表示モードの移行前の保管用。 Dim Eepcolmode As Eram Byte 'EEPROM コロンの表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Dim Eepbrightmax As Eram Byte 'EEPROM LEDパネルの輝度上限値。(12〜123) Dim Eepautoreset As Eram Byte 'EEPROM 最高・最低値の0:00自動リセット。(0:無し , 1:有り) Dim Eepserialtime As Eram Byte 'EEPROM シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Dim Eepagingoffset As Eram Byte 'EEPROM [DS3231] Aging Offset値。 Dim Eepdeviainsert As Eram Byte 'EEPROM 気圧偏差値の差し込み表示。(0:無し , 1〜9:差し込み秒数) Dim Eepgraphoffset As Eram Byte 'EEPROM 気圧グラフのオフセット値。(0〜200) '================================================================================================== ' ' * ポートの初期設定 * ' Config Panel_rgb = Output 'RGB LEDパネル [R1,G1,B1,R2,G2,B2]の接続ポートを出力に設定する。 Config Panel_a = Output 'RGB LEDパネル [A]の接続ポートを出力に設定する。 Config Panel_b = Output 'RGB LEDパネル [B]の接続ポートを出力に設定する。 Config Panel_c = Output 'RGB LEDパネル [C]の接続ポートを出力に設定する。 Config Panel_d = Output 'RGB LEDパネル [D]の接続ポートを出力に設定する。 Config Panel_clk = Output 'RGB LEDパネル [CLK]の接続ポートを出力に設定する。 Config Panel_lat = Output 'RGB LEDパネル [LAT]の接続ポートを出力に設定する。 Config Panel_oe = Output 'RGB LEDパネル [OE]の接続ポートを出力に設定する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップ。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップ。 Set Sw_3pu 'スイッチ[3]の接続ポートをプルアップ。 Set Rtc_1spu 'RTC [DS3231]の1秒出力接続ポートをプルアップ。 Set Portd.0 '[RXD]ポートをプルアップ。 ' ' * I2Cの初期設定 * ' Config Scl = Portd.2 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portc.4 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2Cバスを初期化する。 ' ' * Timerの設定 * ' Gosub Ledclear 'LEDパネル画面を消去する。 ' Config Timer2 = Pwm , Prescale = 32 , Clear Timer = 1 'Timer2の設定。8,000,000Hz / 32 = 250,000Hz Set Tccr2b.wgm22 '高速PWM動作。 Compare2a = 125 - 1 '250,000Hz / 125カウント = 2,000Hz(500us) Compare2b = 50 '輝度値。 On Compare2a Tint2a Nosave 'TIMER2比較一致A割り込みルーチンのラベルを設定。 Enable Compare2a 'TIMER2比較一致A割り込みを許可。 On Compare2b Tint2b Nosave 'TIMER2比較一致B割り込みルーチンのラベルを設定。 Enable Compare2b 'TIMER2比較一致B割り込みを許可。 ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer0の設定。8,000,000Hz / 1024 = 7,812.5Hz Compare0a = 78 - 1 '7,812.5Hz / 78カウント = 約100Hz(10ms) ' ' * A/Dコンバータの設定 * ' Config Adc = Single , Prescaler = 16 , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給する。 Config Aci = Off 'アナログ比較器の電源を切る。 Didr0 = &B0000_0001 'デジタル入力禁止レジスタの設定。 ' ' * Timer2 割り込みの初期値設定 * ' Transfer_length = 64 'LEDバッファーに転送するバイト数を設定する。(64バイト) ' Enable Interrupts 'すべての割り込みを許可。 ' Ledx = 18 'セットアップ中を表示する。 Ledy = 2 Ledcolor = 7 Ledback = 0 Tempstr = "Setup" Gosub Leddisp Ledx = 2 'プログラムバージョンの表示。 Ledy = 4 Ledcolor = 2 Tempstr = "Ver. " + Prgver Gosub Leddisp Wait 1 '[DS3231]と[BME280]のパワーオン時間を待つ。 ' ' * RTC [DS3231]の初期設定 * ' I2cbuff(1) = &H0F '[0Fh] ステータス・レジスターのアドレスを指定する。 I2creceive &HD0 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 If Err <> 0 Then 'If [DS3231]の応答が無いか? Then Gosub Ledclear 'LEDパネル画面を消去する。 Ledx = 2 '[DS3231]のデバイス・エラーを表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Error 01" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "RTC NG" Gosub Leddisp Stop '機能停止。 ' End If ' If I2cbuff(1).7 = 1 Then 'If [DS3231]のバッテリー切れ[OSF=1]か? Then Gosub Ledclear 'LEDパネル画面を消去する。 Ledx = 2 'バッテリーの電圧が下がった警告を表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Error 02" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "Battery NG" Gosub Leddisp Wait 5 '表示の待ち時間。 Gosub Ledclear 'LEDパネル画面を消去する。 ' End If ' Temp2 = I2cbuff(1).7 '[DS3231]のバッテリー状態bit[OSF]を取り出す。 Temp1 = Sw_1 Or Sw_3 If Temp1 = 0 Then 'If [SW1]と[SW3]が同時に押されているか? Then Temp2 = 1 End If If Temp2 <> 0 Then 'If [DS3231]を初期化するか? Then Gosub Ds3231init '[DS3231]を初期化する。 Eepagingoffset = 0 'EEPROM [DS3231] Aging Offset値。 End If Gosub Ds3231read '[DS3231]から日時を読み出す。 ' ' * [BME280]の接続を確認する * ' I2cbuff(1) = &HD0 '[ID]レジスター。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 If I2cbuff(1) <> &H60 Then 'If [BME280]のチップ識別番号が返ってこないか? Then Gosub Ledclear 'LEDパネル画面を消去する。 Ledx = 2 '[BME280]のデバイス・エラーを表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Error 03" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "BME280 NG" Gosub Leddisp Wait 5 '表示の待ち時間。 Gosub Ledclear 'LEDパネル画面を消去する。 ' End If ' Gosub Bme280init 'BME280の初期設定。 Gosub Bme280read 'BME280から測定データを空読みする。 Wait 1 'BME280測定の待ち時間。 Gosub Bme280read 'BME280から測定データを空読みする。 Gosub Ledclear 'LEDパネル画面を消去する。 ' ' * プログラム・バージョンの表示 * ' If Sw_1 = 0 Then 'If [SW1]が押されているか? Then Ledx = 2 'プログラム・バージョンの表示。 Ledy = 1 Ledcolor = 4 Ledback = 0 Tempstr = "Program" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 2 Tempstr = "Ver. " + Prgver Gosub Leddisp End If Gosub Swoffchk 'スイッチが離されるのを待つ。 ' ' * EEPROMのデータを確認する * ' If Eephourmode > 1 Then 'If EEPROMが初期値か? Then Eephourmode = 0 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Eepdispsta = 1 'EEPROM 表示の状態。(0:表示OFF , 1:表示ON) Eepdispmode = 0 'EEPROM 表示モード。(0〜2:通常表示, 3:最高値/最低値表示, 4〜6:グラフ表示) Eepdispmodetemp1 = 0 'EEPROM 表示モードの移行前の保管用。 Eepdispmodetemp2 = 3 'EEPROM 表示モードの移行前の保管用。 Eepcolmode = 1 'EEPROM コロンの表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Eepbrightmax = 123 'EEPROM LEDパネルの輝度上限値。(12〜123) Eepautoreset = 1 'EEPROM 最高・最低値の0:00自動リセット。(0:無し , 1:有り) Eepserialtime = 1 'EEPROM シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Eepagingoffset = 0 'EEPROM [DS3231] Aging Offset 値。 Eepdeviainsert = 7 'EEPROM 気圧偏差値の差し込み表示。(0:無し , 1〜9:差し込み秒数) Eepgraphoffset = 0 'EEPROM 気圧グラフのオフセット値。(0〜200) End If Hourmode = Eephourmode Dispsta = Eepdispsta Dispmode = Eepdispmode Dispmodetemp1 = Eepdispmodetemp1 Dispmodetemp2 = Eepdispmodetemp2 Colmode = Eepcolmode Brightmax = Eepbrightmax Serialtime = Eepserialtime Deviainsert = Eepdeviainsert ' ' * 変数の初期値設定 * ' Dbuffpoi = 1 '24時間のデータバッファーポインターを初期化。(1〜24) T64buffpoi = 1 '64時間のデータバッファーポインターを初期化。(1〜64) Hourtemp = 255 '[時]の更新テンポラリの初期化。 Daytemp = Timebuff(4) '[日]の更新テンポラリの初期化。 Weather = 125 '天気の初期値。(予報が始まるまでの待ち時間) Tempmax = -400 '温度の最高値を初期化する。 Tempmin = 800 '温度の最低値を初期化する。 Humimax = 0 '湿度の最高値を初期化する。 Humimin = 999 '湿度の最低値を初期化する。 Baromax = 5000 '気圧の最高値を初期化する。 Baromin = 11500 '気圧の最低値を初期化する。 ' Restore Serialbuffinit 'シリアル送信バッファーへ初期データを配置する。 For Temp1 = 1 To 38 Read Temp2 Serialbuff(temp1) = Temp2 Next Temp1 Print 'シリアル出力を改行する。 ' Gosub Ledclear 'LEDパネル画面を消去する。 If Dispsta = 0 Then 'If LEDの消灯状態か? Then Stop Timer2 'LEDのDMA点灯を停止する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 End If '-------------------------------------------------------------------------------------------------- ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tifr0.ocf0a = 1 Then 'If 10mS経過したか? Then Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' ' * スイッチの確認 * ' Gosub Swin 'スイッチ入力。 Select Case Swflag Case 1 : Gosub Swon 'スイッチが押された処理。 Swflag = 0 Case 2 : Gosub Swonlong 'スイッチが長押された処理。 Swflag = 0 End Select ' ' * コロンの点滅処理 * ' If Colmode <> 0 Then 'If コロンの点滅が有りか? Then Colcoun = Colcoun + 1 If Colcoun = 50 Then 'If コロンの消灯時間か? Then Ledx = 0 Select Case Dispmode Case 0 : '表示モード[0] 時刻表示 [時:分:秒],[年/月/日]の場合。 Ledx = 19 Case 2 : '表示モード[2] 時刻表示 [時:分],[月/日]の場合。 Ledx = 15 Case 3 : '表示モード[3] 最高値/最低値表示の場合。 Ledx = 15 Case Is > 3 '表示モード[4〜6] グラフ表示の場合。 Ledx = 15 End Select If Ledx <> 0 Then 'If コロンの点滅が有る画面か? Then Ledy = 1 Ledcolor = 7 Ledback = 0 Ledchr = &H20 'コロンを消す。 Gosub Ledwr6 '6x8ドット文字 描画。 End If End If End If ' ' * 100mS毎の処理 * ' Time100ms = Time100ms + 1 If Time100ms = 10 Then 'If 100ms経過したか? Then Time100ms = 0 ' ' * LEDの輝度調整 * ' If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Ledintf = 0 'A/D変換の最中にDMA割り込みが入らないようにする。 Do Loop Until Ledintf <> 0 'If LED表示割り込みが発生したか? Then Tempw1 = Getadc(0) '輝度調整ボリュームの値を読み込む。 Shift Tempw1 , Right , 3 '0〜127に縮小する。 Temp1 = Tempw1 Select Case Temp1 Case Is > Brightmax : 'If 上限値か? Then Temp1 = Brightmax Case Is < 11 : 'If 下限値か? Then Temp1 = 11 End Select If Temp1 > Brighttemp Then 'If 前回の値より大きいか? Then Temp2 = Temp1 - Brighttemp Else Temp2 = Brighttemp - Temp1 End If If Temp2 > 1 Then 'If 輝度値の変化量が2以上か? Then Compare2b = Temp1 'Timer2に輝度値を設定する。 Brighttemp = Temp1 Brightsum = 0 Brightcount = 0 Else '変化量が1以下の場合。 Brightsum = Brightsum + Temp1 '256個の平均用に合計する。(25.6秒に1回輝度を変更する) Brightcount = Brightcount + 1 If Brightcount = 0 Then 'If 256個の合計値が出来上がったか? Then Temp1 = High(brightsum) Compare2b = Temp1 'Timer2に輝度値を設定する。 Brightsum = 0 End If End If End If End If End If ' ' * 1秒毎の処理 * ' If Sqw1hzflag = 0 Then 'If 1Hz出力の[H]チェック中か? Then If Rtc_1s = 1 Then 'If 1Hz出力が[H]か?Then Sqw1hzflag = 1 Time1s = 1 '1秒経過フラグを立てる。 End If Else '1Hz出力の[L]チェック中。 If Rtc_1s = 0 Then 'If 1Hz出力が[L]か?Then Sqw1hzflag = 0 End If End If ' ' If Time1s <> 0 Then '1秒経過したか? Then Gosub Ds3231read '[DS3231]から日時を読み出す。 Colcoun = 0 'コロン消灯用500mSカウンター。 ' ' * 湿度・温度・気圧値の測定 * ' Gosub Bme280read 'BME280から測定データを読み出して補償を行う。 T = T / 10 '温度値の小数点以下を1桁にする。 Temperature = T '温度値に代入する。 H = H / 10 '湿度値の小数点以下を1桁にする。 Humidity = H '温度値に代入する。 P = P / 10 '気圧値の小数点以下を1桁にする。 Baropress = P 'ワード値に代入する。 ' ' * 最高値/最低値の確認 * ' If Tempmax < Temperature Then 'If 温度の最高値を超えたか? Then Tempmax = Temperature End If ' If Tempmin > Temperature Then 'If 温度の最低値を下回ったか? Then Tempmin = Temperature End If ' If Humimax < Humidity Then 'If 湿度の最高値を超えたか? Then Humimax = Humidity End If ' If Humimin > Humidity Then 'If 湿度の最低値を下回ったか? Then Humimin = Humidity End If ' If Baromax < Baropress Then 'If 気圧の最高値を超えたか? Then Baromax = Baropress End If ' If Baromin > Baropress Then 'If 気圧の最低値を下回ったか? Then Baromin = Baropress End If ' ' * LED表示の更新 * ' Gosub Infodisp 'LEDに情報を表示する。 ' ' * シリアル出力 * ' Select Case Serialtime Case 1 : '1秒間隔の場合。 Gosub Serialset '時刻とセンサー値をシリアル出力する。 ' Case 2 : '10秒間隔の場合。 Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 If Temp1 = 0 Then 'If 10秒経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If ' Case 3 : '1分間隔の場合。 If Timebuff(1) = 0 Then 'If 1分経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If ' Case 4 : '10分間隔の場合。 If Timebuff(1) = 0 Then 'If 1分経過したか? Then Temp1 = Timebuff(2) And &H0F '分の下位桁を取り出す。 If Temp1 = 0 Then 'If 10分経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If End If End Select ' ' * 1時間毎の処理 * ' If Timebuff(3) <> Hourtemp Then 'If 1時間経過したか? Then Hourtemp = Timebuff(3) Gosub Weatherreport '気圧値24時間偏差を求めて天気を予報する。 ' If Serialtime = 5 Then 'If シリアル出力が1時間間隔か? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If End If ' ' * 1日毎の処理 * ' If Timebuff(4) <> Daytemp Then 'If 日付が変わったか? Then Daytemp = Timebuff(4) Temp1 = Eepautoreset If Temp1 <> 0 Then 'If 最高・最低値の0:00自動リセットが有りか? Then Gosub Maxminreset '最高値/最低値を初期化する。 End If End If ' ' * 熱中症モニターの処理 * ' Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 If Temp1 = 0 Then 'If 10秒経過したか? Then Tempi1 = Temperature / 10 '温度値の小数点以下を無しにする。 Tb = Tempi1 If Tempi1 < 0 Then 'If 温度値がマイナスか? Then Tb = 0 End If Tempw1 = Humidity / 10 '湿度値の小数点以下を無しにする。 Hb = Tempw1 Gosub Wbgtcal '熱中症モニターのWBGT値と警報レベルを計算する。 End If Time1s = 0 End If ' ' * シリアル出力へ送信とシリアル入力 * ' If Serialcount <> 0 Then 'If シリアル送信が有るか? Then Temp1 = 39 - Serialcount '送信バッファーの位置を計算する。 Printbin Serialbuff(temp1) ; 1 '送信バッファーから1文字をシリアル送信する。 Serialcount = Serialcount - 1 End If ' Gosub Serialin 'シリアル入力処理。 ' Goto Main '================================================================================================== ' ' ************************** ' * スイッチが押された処理 * ' ************************** ' Swon: Select Case Swdata Case &B0000_0001 '[SW1]が押されたか? Then If Dispsta = 0 Then 'If 表示OFF中か? Then Dispsta = 1 '表示ONにする。 Gosub Ledclear 'LEDパネル画面を消去する。 Wbgtleveltemp = 255 '[熱中症モニター]を強制表示する。 Gosub Infodisp 'LEDに情報を表示する。 Start Timer2 'LEDのDMA点灯を開始する。 Set Tccr2b.wgm22 '高速PWM動作。(BASCOMのStart Timer命令が対応していないため) Brighttemp = 0 '輝度調整を強制実行させる。 Else '表示ON中の場合。 Dispsta = 0 '表示OFFにする。 Stop Timer2 'LEDのDMA点灯を停止する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 End If Eepdispsta = Dispsta 'EEPROMに保存する。 ' Case &B0000_0010 '[SW2]が押されたか? Then ' Case &B0000_0100 '[SW3]が押されたか? Then ' Case &B0000_0110 '[SW2]と[SW3]が同時に押されたか? Then If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Toggle Hourmode.0 '12/24時間制表示選択を変更。 Eephourmode = Hourmode 'EEPROMに保存する。 Gosub Infodisp 'LEDに情報を表示する。 End If ' End Select Return ' ' **************************** ' * スイッチが長押された処理 * ' **************************** ' Swonlong: Select Case Swdata Case &B0000_0100 '[SW3]が長押されたか? Then ' Case &B0000_0101 '[SW1]と[SW3]が同時に長押されたか(時刻設定)? Then If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Gosub Timeset '時刻設定処理。 Wbgtleveltemp = 255 '[熱中症モニター]を強制表示する。 Gosub Infodisp 'LEDに情報を表示する。 End If ' Case &B0000_0011 '[SW1]と[SW2]が同時に長押されたか(機能設定)? Then ' End Select Return ' ' *********************** ' * LEDに情報を表示する * ' *********************** ' Infodisp: Select Case Dispmode Case 0 : '表示モード[0] 時刻表示 [時:分 曜日],[年/月/日]の場合。 Ledx = 5 '[時刻]を表示する。 Ledy = 1 Gosub Timedisp ' Ledx = 45 '[曜日]を表示する。 Gosub Weekdisp ' Ledx = 3 '[年]を表示する。 Ledy = 2 Tempstr = "20" + Hex(timebuff(6)) + "/" Gosub Leddisp '文字列の描画。 Ledx = 33 '[月/日]を表示する。 Gosub Datedisp ' Ledx = 1 '[温度]を表示する。 Ledy = 3 Gosub Tempdisp Ledx = 1 '[湿度]を表示する。 Ledy = 4 Gosub Humidisp Ledx = 34 '[気圧値]を表示する。 Ledy = 3 Gosub Barodispins ' Ledx = 34 '[天気予報]を表示する。 Ledy = 4 Gosub Weatherdisp Ledx = 47 '[熱中症モニター]を表示する。 Ledy = 4 Gosub Wbgtfacedisp ' ' End Select Return ' ' ******************** ' * シリアル入力処理 * ' ******************** ' Serialin: Return '================================================================================================== ' ' -------------------------------------- ' * シリアルから数列の入力サブルーチン * (Temp1 = 入力した文字数) ' -------------------------------------- (Temp2 = 入力した数値) ' Keyinsub: Temp1 = 0 '入力文字数。 Tempstr = "" '入力文字列。 Keyinsub1: Temp2 = Inkey() Select Case Temp2 Case &H0D : '[Enter]キー。 Temp2 = Val(tempstr) '文字列を数値に変換する。 Print Return ' Case &H08 : '[Backspace]キー。 Select Case Temp1 Case Is > 1: '2文字以上有る場合。 Temp1 = Temp1 - 1 Tempstr = Left(tempstr , Temp1) '文字列から1文字を消去する。 Print Chr(&H08) ; Chr(&H20) ; Chr(&H08); 'スクリーンの文字を1文字消去する。 Case 1 : '文字数が1の場合。 Tempstr = "" Temp1 = 0 Print Chr(&H08) ; Chr(&H20) ; Chr(&H08); 'スクリーンの文字を1文字消去する。 End Select ' Case Is < &H30 : ' Case Is < &H3A : '0〜9の数字の場合。 Tempstr = Tempstr + Chr(temp2) '文字列を作成。 Temp1 = Temp1 + 1 Print Chr(temp2); End Select Goto Keyinsub1 ' ' ----------------------------- (10mS毎に呼び出す) ' * スイッチ入力 サブルーチン * (Swflag = 1 : スイッチ入力有り , 2 : リピート) ' ----------------------------- (Swdata = スイッチ データ) ' Swin: Select Case Swcount Case 0 : 'スイッチ入力チェック開始。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata <> 0 Then 'If スイッチ入力が有るか? Then Swtemp = Swdata 'スイッチ データを一時保存。 Swcount = 1 End If ' Case Is < 4 : 'チャタリング除去期間。 Swcount = Swcount + 1 ' Case 4 : 'スイッチ入力を再確認。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata = Swtemp Then 'If スイッチ入力が確定か? Then Swflag = 1 Swcount = Swcount + 1 Else 'エラーの場合。 Swcount = 0 End If ' Case Else : 'スイッチが離されるのを待つ。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata <> Swtemp Then 'If スイッチの状態が変わったか? Then Swcount = 0 Else 'スイッチが押し続けられている場合。 If Swcount < 104 Then 'If リピート期間待ち(1秒未満)か? Then Swcount = Swcount + 1 Else '1秒経過した場合。 Swflag = 2 Swcount = 95 'リピートを開始。 End If End If End Select Return ' ' -------------------------------------------------- ' * スイッチ接続ポートからのデータ入力サブルーチン * (Swdata = スイッチ データ) ' -------------------------------------------------- ' Swport: Swdata.0 = Not Sw_1 Swdata.1 = Not Sw_2 Swdata.2 = Not Sw_3 Return ' ' ------------------------------------------ ' * スイッチが離されるのを待つサブルーチン * ' ------------------------------------------ ' Swoffchk: Do Gosub Swport 'スイッチ接続ポートからのデータ入力。 Loop Until Swdata = 0 'If 全てのスイッチが離されたか? Then Waitms 30 'チャタリング・タイマー。 Return ' ' -------------------------------- ' * 温度値を表示するサブルーチン * ' -------------------------------- ' Tempdisp: Tempi1 = Temperature Tempdisp1: Tempstr = Str(tempi1) '数値変数を文字変数に変換する。 If Tempi1 < 0 Then 'If マイナス値か? Then If Tempi1 < -99 Then 'If -10.0℃以下か? Then Tempstr = " " + Left(tempstr , 3 ) '[_-XX]表示。 Else '-9.9℃〜-0.1℃。 Tempstr = Format(tempstr , " 0.0") Tempstr = Mid(tempstr , 2 , 4 ) End If Else Tempstr = Format(tempstr , " 0.0") '0.0℃以上。 End If Ledcolor = 5 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H80 '[℃]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Return ' ' -------------------------------- ' * 湿度値を表示するサブルーチン * ' -------------------------------- ' Humidisp: Tempi1 = Humidity Humidisp1: If Tempi1 = 1000 Then 'If 湿度が100%か? Then Tempstr = " 100" Else Tempstr = Str(tempi1) '数値変数を文字変数に変換する。 Tempstr = Format(tempstr , " 0.0") End If Ledcolor = 6 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H25 '[%]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Return ' ' ------------------------------------------------ ' * 気圧値に偏差値を差し込み表示するサブルーチン * ' ------------------------------------------------ ' Barodispins: If Deviainsert = 0 Then Goto Barodisp 'If 気圧偏差値の差し込み表示がOFFか? Then Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 If Temp1 < Deviainsert Then Goto Barodisp 'If 気圧偏差値の差し込み秒ではないか? Then Gosub Divdisp '気圧の偏差値を表示する。 Ledback = 0 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' -------------------------------- ' * 気圧値を表示するサブルーチン * ' -------------------------------- ' Barodisp: Tempstr = Str(baropress) '数値変数を文字変数に変換する。 Barodisp1: Tempstr = Format(tempstr , " 0") Tempstr = Left(tempstr , 4) '整数部だけにする。(XXXX.X -> XXXX) Ledcolor = 2 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H81 '[hp]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Return ' ' -------------------------------------- ' * 気圧の偏差値を表示するサブルーチン * ' -------------------------------------- ' Divdisp: Tempstr = Str(deviation) '数値を文字列に変換する。 Tempstr = Format(tempstr , "+ 0.0") '[+-XX.X]の書式にする。 (XXXXX -> XXXX.X hP) Tempstr = Mid(tempstr , 2 , 5) '先頭の空白を除去する。 Ledcolor = 2 Ledback = 0 Gosub Leddisp '文字列の描画。 Return ' ' ------------------------------------ ' * WBGT温度値を表示するサブルーチン * ' ------------------------------------ ' Wbgtdisp: Ledcolor = 1 Ledback = 0 Tempstr = "WB" Gosub Leddisp '文字列の描画。 ' Select Case Wbgt Case Is > 44 : 'WBGT値が44℃を超える場合。 Tempstr = "hi" Case Is < 15 : 'WBGT値が15℃未満の場合。 Tempstr = "lo" Case Else : Tempstr = Str(wbgt) '数値を文字列に変換する。 Tempstr = Format(tempstr , " 0") End Select Gosub Leddisp '文字列の描画。 Ledchr = &H80 '[℃]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Return ' ' ---------------------------------------- ' * 熱中症モニターを表示するサブルーチン * ' ---------------------------------------- ' Wbgtfacedisp: If Wbgtlevel <> Wbgtleveltemp Then 'WBGT警報レベルの変更があったか? Then Ledback = 0 Select Case Wbgtlevel Case 1 : '警報レベル[1]。 Ledcolor = 6 '文字と顔の輪郭の色。 Gosub Wbgtfacesub1 'WBGTレベル値と顔の輪郭を表示する。 Restore Wbgtface1 Gosub Leddotdraw 'LEDにドットパターンの描画を行う。 Case 2 : '警報レベル[2]。 Ledcolor = 2 '文字と顔の輪郭の色。 Gosub Wbgtfacesub1 'WBGTレベル値と顔の輪郭を表示する。 Restore Wbgtface2 Gosub Leddotdraw 'LEDにドットパターンの描画を行う。 Case 3 : '警報レベル[3]。 Ledcolor = 3 '文字と顔の輪郭の色。 Gosub Wbgtfacesub1 'WBGTレベル値と顔の輪郭を表示する。 Restore Wbgtface3 Gosub Leddotdraw 'LEDにドットパターンの描画を行う。 Case 4 : '警報レベル[4]。 Ledcolor = 5 '文字と顔面の色。 Gosub Wbgtfacesub1 'WBGTレベル値と顔の輪郭を表示する。 Restore Wbgtface4 Gosub Leddotdraw 'LEDにドットパターンの描画を行う。 Case 5 : '警報レベル[5]。 Ledcolor = 1 '文字と顔面の色。 Gosub Wbgtfacesub1 'WBGTレベル値と顔の輪郭を表示する。 Restore Wbgtface5 Gosub Leddotdraw 'LEDにドットパターンの描画を行う。 Case Else : Ledcolor = 4 '"--"の色。 Tempstr = Str(wbgtlevel) + "--" 'WBGTレベル値と[--]の表示。 Gosub Leddisp '文字列の描画。 End Select Wbgtleveltemp = Wbgtlevel End If Return ' ' * WBGTレベル値と顔の輪郭を表示する * ' Wbgtfacesub1: Tempstr = Str(wbgtlevel) + Chr(152) + Chr(153) 'WBGTレベル値と顔の輪郭の表示。 Gosub Leddisp '文字列の描画。 Ledy = Ledy - 1 'Yアドレスのドットアドレスを計算する。 Ledy = Ledy * 8 Ledy = Ledy + 1 Ledx = Ledx - 9 Return ' ' --------------------------------- ' * [月/日]を表示するサブルーチン * ' --------------------------------- ' Datedisp: Temp1 = Timebuff(4) '[日]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Temp1 = Timebuff(5) '[月]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 + "/" + Tempstr Ledcolor = 3 Ledback = 0 Gosub Leddisp '文字列の描画。 Return ' ' --------------------------------- ' * [時/分]を表示するサブルーチン * ' --------------------------------- ' Timedisp: Ledback = 0 If Hourmode = 0 Then 'If 12時間制表示か? Then Temp1 = Makedec(timebuff(3)) 'BCDを10進数の数値に変換。 If Temp1 < 12 Then 'If [AM]か? Then Ledcolor = 6 '水色を指定。 Ledchr = 32 '[AM]を表示する。 Else Ledcolor = 3 '黄色を指定。 Ledchr = 33 '[PM]を表示する。 End If Gosub Ledwr2 '2x8ドット文字 描画。 If Temp1 = 0 Then Temp1 = 24 '24時間制時刻を12時間制に変換する。 If Temp1 > 12 Then Temp1 = Temp1 - 12 Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Gosub Zerosup '上位桁をゼロサプレスする Tempstr = Tempstr2 Else Temp1 = Timebuff(3) '[時]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 Ledx = Ledx - 2 End If Ledx = Ledx + 2 Tempstr = Tempstr2 + ":" + Hex(timebuff(2)) Ledcolor = 7 Gosub Leddisp '文字列の描画。 Return ' ' -------------------------------- ' * [曜日]を表示するサブルーチン * ' -------------------------------- ' Weekdisp: Temp1 = Timebuff(7) Temp1 = Temp1 - 1 '1〜7を0〜6に変換する。 Tempstr = Lookupstr(temp1 , Weekdata) '[曜日]の文字列を取得する。 Ledcolor = 3 Ledback = 0 Gosub Leddisp '文字列の描画。 Return ' ' ---------------------------------------- ' * 上位桁をゼロサプレスするサブルーチン * (Temp1 = 入力BCDデータ) ' ---------------------------------------- (Tempstr2 = 出力文字列) ' Zerosup: If Temp1 < 10 Then 'If 上位桁が0か? Then Tempstr2 = " " + Str(temp1) Else Tempstr2 = Hex(temp1) End If Return ' ' -------------------------------- ' * コロンを消灯するサブルーチン * ' -------------------------------- ' Colonoff: If Hourmode = 0 Then 'If 12時間制表示か? Then Ledx = 15 Else Ledx = 13 End If Ledcolor = 7 Ledback = 0 Ledchr = &H20 'コロンを消す。 Gosub Ledwr6 '6x8ドット文字 描画。 Return ' ' ---------------------------------- ' * 天気予報を表示するサブルーチン * ' ---------------------------------- ' Weatherdisp: Ledback = 0 Select Case Weather Case 5 : '[晴れ] Ledcolor = 1 Ledchr = &H84 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H85 Gosub Ledwr6 '6x8ドット文字の描画。 Case 4 : '[晴れ+曇り] Ledcolor = 1 Ledchr = &H86 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledcolor = 7 Ledchr = &H87 Gosub Ledwr6 '6x8ドット文字の描画。 Case 3 : '[曇り] Ledcolor = 7 Ledchr = &H88 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H89 Gosub Ledwr6 '6x8ドット文字の描画。 Case 2 : '[雨] Ledcolor = 6 Ledchr = &H8A Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H8B Gosub Ledwr6 '6x8ドット文字の描画。 Case 0 : '予報が出ていない場合。 Ledcolor = 4 Ledchr = &H2D Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H2D Gosub Ledwr6 '6x8ドット文字の描画。 Case Else '[予報が出るまでの待ち時間表示] Ledcolor = 4 Temp1 = Weather - 100 Temp1 = Temp1 * 2 Ledchr = Lookup(temp1 , Waitbar) '横線キャラクター・データを読み出す。 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Temp1 = Temp1 + 1 Ledchr = Lookup(temp1 , Waitbar) '横線キャラクター・データを読み出す。 Gosub Ledwr6 End Select Return ' ' ------------------------------------------------- ' * グラフ表示の[X]軸(時間)を表示するサブルーチン * ' ------------------------------------------------- ' Graphxtime: Ledy = 32 Temp1 = Makedec(timebuff(3)) '[時]データのBCDを10進数の数値に変換する。 If Temp1 < 12 Then 'If 0〜11時か? Then Ledx = 63 - Temp1 Ledcolor = 7 '白色を指定。 Else 'If 12〜23時の場合。 Ledx = 75 - Temp1 Ledcolor = 3 '黄色を指定。 End If Graphxtime1: Gosub Ledpset '1ドットを描画する。 ' If Ledcolor = 7 Then Ledcolor = 3 Else Ledcolor = 7 End If Ledx = Ledx - 12 If Ledx < 2 Then Return 'If [X]が左の表示限界か? Then If Ledx < 64 Then Goto Graphxtime1 'If [X]が表示領域内か? Then Return ' ' -------------------------------------------------------------------- ' * 時刻とセンサー値をシリアル送信バッファーにセットするサブルーチン * ' -------------------------------------------------------------------- ' Serialset: Return '-------------------------------------------------------------------------------------------------- ' ' ******************************************* ' * [DS3231]から日時を読み出すサブルーチン * ' ******************************************* ' Ds3231read: I2cbuff(1) = &H00 'レジスター[00h] Seconds のアドレスを指定する。 I2creceive &HD0 , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 Timebuff(1) = I2cbuff(1) '[秒]データを保存する。 Timebuff(2) = I2cbuff(2) '[分]データを保存する。 Timebuff(3) = I2cbuff(3) '[時]データを保存する。 Timebuff(7) = I2cbuff(4) '[曜日]データを保存する。 Timebuff(4) = I2cbuff(5) '[日]データを保存する。 Timebuff(5) = I2cbuff(6) And &H1F '[月]データを保存する。 Timebuff(6) = I2cbuff(7) '[年]データを保存する。 Return ' ' ************************************ ' * [DS3231]を初期化するサブルーチン * ' ************************************ ' Ds3231init: Restore Ds3231initdata '[DS3231]の初期設定データ・テーブル。 For Temp1 = 1 To 18 '初期設定データの18バイトをバッファーへ転送する。 Read I2cbuff(temp1) Next Temp1 ' I2csend &HD0 , I2cbuff(1) , 18 'I2Cバスで、18バイトのデータを送信する。 Return '-------------------------------------------------------------------------------------------------- ' **************************************************** ' * BME280 温度・湿度・気圧センサー 制御サブルーチン * (オリジナルは「Mrshilov」氏) ' **************************************************** ' ' * BME280用の変数を宣言 * ' Dim Dig_t1 As Word , Dig_t2 As Integer , Dig_t3 As Integer Dim Dig_p1 As Word , Dig_p2 As Integer , Dig_p3 As Integer Dim Dig_p4 As Integer , Dig_p5 As Integer , Dig_p6 As Integer Dim Dig_p7 As Integer , Dig_p8 As Integer , Dig_p9 As Integer Dim Dig_h1 As Word , Dig_h2 As Integer , Dig_h3 As Word Dim Dig_h4 As Integer , Dig_h5 As Integer , Dig_h6 As Integer Dim Adc_t As Dword , Adc_p As Dword , Adc_h As Dword Dim Var1 As Long , Var2 As Long , Var3 As Long , Var4 As Word Dim T_fine As Long ' ' ******************** ' * BME280の初期設定 * ' ******************** ' Bme280init: I2cbuff(1) = &HF2 : I2cbuff(2) = &H05 '湿度のオーバー・サンプリング = ×16 I2cbuff(3) = &HF4 : I2cbuff(4) = &HB7 '温度のオーバー・サンプリング = ×16 , 圧力のオーバー・サンプリング = ×16 , 通常モード I2cbuff(5) = &HF5 : I2cbuff(6) = &HB0 '通常モードの休止期間 = 1s , IIRフィルター = ×16 I2csend Bme280_adr , I2cbuff(1) , 6 'I2Cバスで、6バイトのコマンドを送信する。 ' I2cbuff(1) = &H88 '補償の係数を読み出す。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 26 'I2Cバスで、1バイトのコマンドを送信し、26バイトのデータを受信する。 ' Dig_t1 = Makeint(i2cbuff(1) , I2cbuff(2)) '温度の補償係数を変数にまとめる。 Dig_t2 = Makeint(i2cbuff(3) , I2cbuff(4)) Dig_t3 = Makeint(i2cbuff(5) , I2cbuff(6)) Dig_p1 = Makeint(i2cbuff(7) , I2cbuff(8)) '圧力の補償係数を変数にまとめる。 Dig_p2 = Makeint(i2cbuff(9) , I2cbuff(10)) Dig_p3 = Makeint(i2cbuff(11) , I2cbuff(12)) Dig_p4 = Makeint(i2cbuff(13) , I2cbuff(14)) Dig_p5 = Makeint(i2cbuff(15) , I2cbuff(16)) Dig_p6 = Makeint(i2cbuff(17) , I2cbuff(18)) Dig_p7 = Makeint(i2cbuff(19) , I2cbuff(20)) Dig_p8 = Makeint(i2cbuff(21) , I2cbuff(22)) Dig_p9 = Makeint(i2cbuff(23) , I2cbuff(24)) Dig_h1 = I2cbuff(26) '湿度の補償係数を変数にまとめる。 ' I2cbuff(1) = &HE1 I2creceive Bme280_adr , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 ' Dig_h2 = Makeint(i2cbuff(1) , I2cbuff(2)) '湿度の補償係数を変数にまとめる。 Dig_h3 = I2cbuff(3) Dig_h4 = I2cbuff(4) : Shift Dig_h4 , Left , 4 Dig_h5 = I2cbuff(5) And &H0F : Dig_h4 = Dig_h4 + Dig_h5 Dig_h5 = I2cbuff(5) And &HF0 : Shift Dig_h5 , Right , 4 Dig_h6 = I2cbuff(6) : Shift Dig_h6 , Left , 4 : Dig_h5 = Dig_h5 + Dig_h6 Dig_h6 = I2cbuff(7) Return ' ' ********************************************** ' * BME280から測定データを読み出して補償を行う * ' ********************************************** ' Bme280read: I2cbuff(1) = &HF7 '測定したA/Dデータを読み出す。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 8 'I2Cバスで、1バイトのコマンドを送信し、8バイトのデータを受信する。 ' Var4 = Makeint(i2cbuff(2) , I2cbuff(1)) '3バイトの圧力データを32ビットのDword変数に変換する。 Adc_p = Var4 : Shift Adc_p , Left , 4 Shift I2cbuff(3) , Right , 4 : Adc_p = Adc_p + I2cbuff(3) ' Var4 = Makeint(i2cbuff(5) , I2cbuff(4)) '3バイトの温度データを32ビットのDword変数に変換する。 Adc_t = Var4 : Shift Adc_t , Left , 4 Shift I2cbuff(6) , Right , 4 : Adc_t = Adc_t + I2cbuff(6) ' Var4 = Makeint(i2cbuff(8) , I2cbuff(7)) '2バイトの湿度データを32ビットのDword変数に変換する。 Adc_h = Var4 ' ' -------------------- ' * 温度の補償を行う * ' -------------------- ' ' var1 = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11; ' Shift Adc_t , Right , 3 : Var1 = Adc_t - Dig_t1 : Var1 = Var1 - Dig_t1 Var1 = Var1 * Dig_t2 : Shift Var1 , Right , 11 , Signed ' ' var2 = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) * ((bme280_s32_t)dig_t3)) >> 14; ' Shift Adc_t , Right , 1 : Var2 = Adc_t - Dig_t1 Var2 = Var2 * Var2 : Shift Var2 , Right , 12 , Signed Var2 = Var2 * Dig_t3 : Shift Var2 , Right , 14 , Signed ' ' t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; ' T_fine = Var1 + Var2 : Var2 = T_fine * 5 Var2 = Var2 + 128 : Shift Var2 , Right , 8 , Signed T = Var2 '[T] = 温度値。 [XXXX] -> [XX.XX]℃ ' ' -------------------- ' * 圧力の補償を行う * ' -------------------- ' ' var1 = (((BME280_S32_t)t_fine)>>1) - (BME280_S32_t)64000; ' Var1 = T_fine : Shift Var1 , Right , 1 , Signed Var1 = Var1 - 64000 ' ' var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((BME280_S32_t)dig_P6); ' Var2 = Var1 : Shift Var2 , Right , 2 , Signed Var2 = Var2 * Var2 : Shift Var2 , Right , 11 , Signed Var2 = Var2 * Dig_p6 ' ' var2 = var2 + ((var1*((BME280_S32_t)dig_P5))<<1); ' Var3 = Var1 * Dig_p5 : Shift Var3 , Left , 1 Var2 = Var2 + Var3 ' ' var2 = (var2>>2)+(((BME280_S32_t)dig_P4)<<16); ' Var3 = Dig_p4 : Shift Var3 , Left , 16 Shift Var2 , Right , 2 , Signed Var2 = Var2 + Var3 ' ' var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((BME280_S32_t)dig_P2) * var1)>>1))>>18; ' Var3 = Dig_p2 * Var1 : Shift Var3 , Right , 1 , Signed Shift Var1 , Right , 2 , Signed Var1 = Var1 * Var1 : Shift Var1 , Right , 13 Var1 = Dig_p3 * Var1 : Shift Var1 , Right , 3 , Signed Var1 = Var1 + Var3 : Shift Var1 , Right , 18 , Signed ' ' var1 =((((32768+var1))*((BME280_S32_t)dig_P1))>>15); ' Var1 = 32768 + Var1 Var1 = Var1 * Dig_p1 : Shift Var1 , Right , 15 , Signed ' 'if (var1 == 0) ' If Var1 = 0 Then P = 0 'ゼロ除算による例外を避ける。 Else ' ' P = (((BME280_U32_t)(((BME280_S32_t)1048576)-adc_P) - (var2>>12))) * 3125; ' P = 1048576 - Adc_p : Shift Var2 , Right , 12 , Signed P = P - Var2 : P = P * 3125 ' ' if (P < 0x80000000) ' If P < &H80000000 Then ' ' P = (P << 1) / ((BME280_U32_t)var1); ' Shift P , Left , 1 : P = P / Var1 Else ' ' P = (P / (BME280_U32_t)var1) * 2; ' P = P / Var1 : P = P + P End If ' ' var1 = (((BME280_S32_t)dig_P9) * ((BME280_S32_t)(((p>>3) * (p>>3))>>13)))>>12; ' Var1 = P : Shift Var1 , Right , 3 Var1 = Var1 * Var1 : Shift Var1 , Right , 13 Var1 = Dig_p9 * Var1 : Shift Var1 , Right , 12 , Signed ' ' var2 = (((BME280_S32_t)(p>>2)) * ((BME280_S32_t)dig_P8))>>13; ' Var2 = P : Shift Var2 , Right , 2 Var2 = Var2 * Dig_p8 : Shift Var2 , Right , 13 , Signed ' ' P = (BME280_U32_t)((BME280_S32_t)P + ((var1 + var2 + dig_P7) >> 4)); ' Var1 = Var1 + Var2 : Var1 = Var1 + Dig_p7 Shift Var1 , Right , 4 , Signed P = P + Var1 '[P] = 気圧値。 [XXXXXX] -> [XXXX.XX]hPa End If ' ' -------------------- ' * 湿度の補償を行う * ' -------------------- ' ' v_x1_u32r = (t_fine - ((BME280_S32_t)76800)); ' Var1 = T_fine - 76800 ' ' v_x1_u32r = (((((adc_H << 14) - (((BME280_S32_t)dig_H4) << 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) + ' ((BME280_S32_t)16384)) >> 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) >> 10) * (((v_x1_u32r * ' ((BME280_S32_t)dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) * ' ((BME280_s32_t)dig_H2) + 8192) >> 14)); ' Var2 = Adc_h : Shift Var2 , Left , 14 Var3 = Dig_h4 : Shift Var3 , Left , 20 Var2 = Var2 - Var3 : Var3 = Dig_h5 * Var1 Var2 = Var2 - Var3 : Var2 = Var2 + 16384 Shift Var2 , Right , 15 , Signed Var3 = Var1 * Dig_h6 : Shift Var3 , Right , 10 , Signed T_fine = Var1 * Dig_h3 : Shift T_fine , Right , 11 , Signed T_fine = T_fine + 32768 : Var3 = Var3 * T_fine Shift Var3 , Right , 10 , Signed Var3 = Var3 + 2097152 Var3 = Var3 * Dig_h2 : Var3 = Var3 + 8192 Shift Var3 , Right , 14 , Signed Var1 = Var2 * Var3 ' ' v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((BME280_S32_t)dig_H1)) >> 4)); ' Var3 = Var1 : Shift Var3 , Right , 15 , Signed Var3 = Var3 * Var3 : Shift Var3 , Right , 7 , Signed Var3 = Var3 * Dig_h1 : Shift Var3 , Right , 4 , Signed Var1 = Var1 - Var3 ' ' v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r); ' If Var1 < 0 Then Var1 = 0 ' ' v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r); ' If Var1 > 419430400 Then Var1 = 419430400 ' ' return (BME280_U32_t)(v_x1_u32r>>12); ' Shift Var1 , Right , 12 , Signed Var1 = Var1 * 100 : Shift Var1 , Right , 10 , Signed '小数点以下第2位をまでを整数に桁上げして、1024で割る。 H = Var1 '[H] = 湿度値。 [XXXXX] -> [XXX.XX]% Return '-------------------------------------------------------------------------------------------------- ' ' ****************************************** ' * 気圧値24時間偏差を求めて天気を予報する * ' ****************************************** ' Weatherreport: Tempw1 = Dbuff(dbuffpoi) '24時間前のデータを読み出す。 Dbuff(dbuffpoi) = Baropress '最新の気圧値を格納する。(XXXXX -> XXXX.X hP) Dbuffpoi = Dbuffpoi + 1 '24時間のデータバッファーポインターを更新する。 If Dbuffpoi > 24 Then 'If ポインターが上限か? Then Dbuffpoi = 1 End If ' If Tempw1 <> 0 Then '通電後24時間以上経過しているか? Then Deviation = Baropress - Tempw1 '24時間の差分を求める。(XXXXX -> XXXX.X hP) ' Select Case Deviation Case Is > 50 : '[晴れ] Temp1 = 5 Case Is > 20 : '[晴れ+雲] Temp1 = 4 Case Is < -50 : '[雨] Temp1 = 2 Case Is < -20 : '[曇り] Temp1 = 3 Case Else : '[天候変化無し] If Weather > 10 Then 'If 予報が始まっても気圧差が少ないか? Then Temp1 = 4 '仮に[晴れ+雲]とする。 Else '前の予報を継続する。 Temp1 = Weather End If End Select Weather = Temp1 '天気予報値。 ' Else '通電後24時間以上経過していない場合。 If Weather > 10 Then 'If 予報開始の待機中か? Then Weather = Weather - 1 '予報が始まるまでの残り時間を減算する。 End If End If Return ' ' ***************************** ' * 最高値/最低値を初期化する * ' ***************************** ' Maxminreset: Tempmax = Temperature '温度の最高値を初期化する。 Tempmin = Temperature '温度の最低値を初期化する。 Humimax = Humidity '湿度の最高値を初期化する。 Humimin = Humidity '湿度の最低値を初期化する。 Baromax = Baropress '気圧の最高値を初期化する。 Baromin = Baropress '気圧の最低値を初期化する。 Return ' ' ************************************************************ ' * 熱中症モニターのWBGT値と警報レベルを計算するサブルーチン * ' ************************************************************ ' Wbgtcal: Select Case Tb '温度値の確認。 Case Is > 40 : '温度が40℃を超える場合。 Wbgtlevel = 5 '警報レベル。 Wbgt = 45 'WBGT値。 ' Case Is < 21 : '温度が21℃未満の場合。 Wbgtlevel = 1 '警報レベル。 Wbgt = 14 'WBGT値。 ' Case Else : '温度が21℃〜40℃の場合。 If Hb < 20 Then 'If 湿度値が20%未満か? Then Wbgtlevel = 0 '警報レベル。 Wbgt = 14 'WBGT値。 Else Temp1 = 40 - Tb 'WBGT表の縦軸を反転させる。 Tempw1 = Temp1 * 17 '縦軸を計算する。 Temp2 = Hb - 20 '横軸を計算する。 Temp2 = Temp2 / 5 Tempw2 = Temp2 Tempw1 = Tempw1 + Tempw2 Wbgt = Lookup(tempw1 , Wbgtdata) 'WBGTのテーブルからWBGT値を取得する。 Select Case Wbgt Case Is < 21 : 'WBGTが21℃未満の場合。 Wbgtlevel = 1 '警報レベル。 ' Case Is < 25 : 'WBGTが25℃未満の場合。 Wbgtlevel = 2 '警報レベル。 ' Case Is < 28 : 'WBGTが25℃以上〜28℃未満の場合。 Wbgtlevel = 3 '警報レベル。 ' Case Is < 31 : 'WBGTが28℃以上〜31℃未満の場合。 Wbgtlevel = 4 '警報レベル。 ' Case Else : 'WBGTが31℃以上の場合。 Wbgtlevel = 5 '警報レベル。 End Select End If End Select Return '================================================================================================== ' ' **************** ' * 時刻設定処理 * ' **************** ' Timeset: Compare2b = 50 '輝度値を固定する。 Gosub Ledclear 'LEDパネル画面を消去する。 ' Ledx = 1 '時刻設定のタイトル表示。 Ledy = 1 Ledcolor = 2 Ledback = 0 Tempstr = "Time set" Gosub Leddisp '文字列の描画。 Temp7 = Hourmode Hourmode = 1 '24時間制時刻にする。 ' Ledx = 1 '[年]を表示する。 Ledy = 2 Ledback = 0 Ledcolor = 3 Tempstr = "20" + Hex(timebuff(6)) + "/" Gosub Leddisp '文字列の描画。 Ledx = 31 '[月/日]を表示する。 Gosub Datedisp Ledx = 43 '[曜日]を表示する。 Ledy = 3 Gosub Weekdisp Ledx = 5 '[時刻]を表示する。 Ledy = 4 Gosub Timedisp Ledx = 37 '00秒を表示する。 Tempstr = ":00" Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' ' Ledy = 2 '[年]の設定。 Ledcolor = 5 Ledback = 4 Temp2 = 99 '[年]の設定の上限値。 Temp3 = 0 '[年]の設定の下限値。 Timeset11: Ledx = 13 Tempstr = Hex(timebuff(6)) Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Temp1 = Timebuff(6) Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset12 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(6) = Temp1 Goto Timeset11 ' Timeset12: '[年]の再表示。 Ledx = 13 Ledcolor = 3 Ledback = 0 Tempstr = Hex(timebuff(6)) Gosub Leddisp '文字列の描画。 ' ' '[月]の設定。 Temp2 = 12 '[月]の設定の上限値。 Temp3 = 1 '[月]の設定の下限値。 Ledcolor = 5 Ledback = 4 Timeset21: Ledx = 31 Temp1 = Timebuff(5) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset22 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(5) = Temp1 Goto Timeset21 ' Timeset22: '[月]の再表示。 Ledx = 31 Ledy = 2 Gosub Datedisp '[月/日]を表示する。 ' ' '[日]の設定。 Temp2 = 31 '[日]の設定の上限値。 Temp3 = 1 '[日]の設定の下限値。 Ledcolor = 5 Ledback = 4 Timeset31: Ledx = 49 Temp1 = Timebuff(4) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset32 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(4) = Temp1 Goto Timeset31 ' Timeset32: '[日]の再表示。 Ledx = 31 Ledy = 2 Gosub Datedisp '[月/日]を表示する。 ' ' Ledy = 3 '[曜日]の設定。 Temp2 = 7 '[曜日]の設定の上限値。 Temp3 = 1 '[曜日]の設定の下限値。 Ledcolor = 5 Ledback = 4 Timeset41: Ledx = 43 Temp1 = Timebuff(7) Temp1 = Temp1 - 1 '1〜7を0〜6に変換する。 Tempstr = Lookupstr(temp1 , Weekdata) '[曜日]の文字列を取得する。 Gosub Leddisp '文字列の描画。 Temp1 = Timebuff(7) Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset42 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(7) = Temp1 Goto Timeset41 ' Timeset42: '[曜日]の再表示。 Ledx = 43 Ledy = 3 Gosub Weekdisp '[曜日]を表示する。 ' ' '[時]の設定。 Temp2 = 23 '[時]の設定の上限値。 Temp3 = 0 '[時]の設定の下限値。 Ledy = 4 Ledcolor = 5 Ledback = 4 Timeset51: Ledx = 7 Temp1 = Timebuff(3) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset52 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(3) = Temp1 Goto Timeset51 ' Timeset52: '[時]の再表示。 Ledx = 5 Ledy = 4 Gosub Timedisp '[時/分]を表示する。 ' ' '[分]の設定。 Temp2 = 59 '[分]の設定の上限値。 Temp3 = 0 '[分]の設定の下限値。 Ledy = 4 Ledcolor = 5 Ledback = 4 Timeset61: Ledx = 25 Tempstr = Hex(timebuff(2)) Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Temp1 = Timebuff(2) Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset62 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(2) = Temp1 Goto Timeset61 ' ' Timeset62: Hourmode = Temp7 '12/24時間制表示選択を戻す。 Brighttemp = 0 '輝度調整を強制実行させる。 Gosub Ledclear 'LEDパネル画面を消去する。 Timebuff(1) = 0 '[秒]を00にリセット。 ' Timesetwrs: I2cbuff(1) = &H00 'レジスター[00h] Secondsのアドレスを指定する。 I2cbuff(2) = Timebuff(1) '[秒]データを保存する。 I2cbuff(3) = Timebuff(2) '[分]データを保存する。 I2cbuff(4) = Timebuff(3) '[時]データを保存する。 I2cbuff(5) = Timebuff(7) '[曜日]データを保存する。 I2cbuff(6) = Timebuff(4) '[日]データを保存する。 I2cbuff(7) = Timebuff(5) '[月]データを保存する。 I2cbuff(8) = Timebuff(6) '[年]データを保存する。 I2csend &HD0 , I2cbuff(1) , 8 'I2Cバスで、8バイトのデータを送信する。 Return ' ' * 設定用スイッチ入力サブルーチン * ' Setswin: If Tifr0.ocf0a = 0 Then Goto Setswin 'If 10mS経過していないか? Then Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 Gosub Swin 'スイッチ入力。 If Swflag = 0 Then Goto Setswin 'If スイッチが押されていないか? Then Swflag = 0 Return ' ' * BCD設定値を加算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Setplus: Temp1 = Makedec(temp1) 'BCDを10進数の数値に変換。 Temp1 = Temp1 + 1 '設定値を加算する。 If Temp1 > Temp2 Then 'If 上限値を超えたか? Then Temp1 = Temp3 End If Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Return ' ' * BCD設定値を減算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Setminus: Temp1 = Makedec(temp1) 'BCDを10進数の数値に変換。 If Temp1 = Temp3 Then 'If 下限値か? Then Temp1 = Temp2 Else Temp1 = Temp1 - 1 '設定値を減算する。 End If Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Return '================================================================================================== ' ' **************** ' * 機能設定処理 * ' **************** ' Funcset: Return ' ' * 設定値を加算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Funcplus: Temp1 = Temp1 + 1 '設定値を加算する。 If Temp1 > Temp2 Then 'If 上限値を超えたか? Then Temp1 = Temp3 End If Return ' ' * 設定値を減算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Funcminus: If Temp1 = Temp3 Then 'If 下限値か? Then Temp1 = Temp2 Else Temp1 = Temp1 - 1 '設定値を減算する。 End If Return '========================= LEDパネル 汎用ルーチン ================================================= ' ' *************************************** ' * LEDパネル画面を消去するサブルーチン * ' *************************************** ' Ledclear: For Tempw3 = 1 To Ledbuff_size Ledbuff(tempw3) = 0 Next Tempw3 Return ' ' ****************************** ' * 文字列 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Tempstr = 文字列) ' ****************************** (1〜64) (1〜4) (0〜7) (0〜7) ' Leddisp: Temp8 = Len(tempstr) '文字数を確認する。 For Temp9 = 1 To Temp8 Tempstr2 = Mid(tempstr , Temp9 , 1) Ledchr = Asc(tempstr2) '文字をASCIIコードに変換する。 Gosub Ledwr6 '6x8ドット文字 描画。 Ledx = Ledx + 6 Next Temp9 Return ' ' ************************************* ' * 6x8ドット文字 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Ledchr = 文字ASCIIコード) ' ************************************* (1〜64) (1〜4) (0〜7) (0〜7) (&H20〜&HFF) ' Dim Fontadr As Word , Buffadr As Word , Ledtempw1 As Word , Ledtempw2 As Word Dim Ledtemp1 As Byte , Ledtemp2 As Byte , Ledtemp3 As Byte , Ledtemp4 As Byte , Ledtemp5 As Byte Dim Ledtemp6 As Byte , Ledtemp7 As Byte , Ledtemp8 As Byte , Ledtemp9 As Byte ' Ledwr6: Ledtemp1 = Ledcolor '1-2行目と3-4行目の色のビット配置を選択する。 Ledtemp9 = Ledback If Ledy < 3 Then 'If 1-2行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else Shift Ledtemp1 , Left , 3 '2行目用のビット位置に移動する。 Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 End If Ledtemp3 = Lookup(1 , Rgbled6x8) '指定されたフォントの横ドット数を読み込む。 Ledtemp4 = Ledchr - &H20 'ASCIIコードのオフセットを減算する。 Fontadr = Ledtemp4 * Ledtemp3 '横ドット毎の位置を計算する。 Fontadr = Fontadr + 4 'フォントテーブルにあるフォント情報をスキップする。 Buffadr = Ledx 'LEDバッファーの位置を計算する。 If Ledy.0 = 0 Then 'If 2または4行目か? Then Buffadr = Buffadr + 512 End If Ledtemp3 = Ledtemp3 - 1 For Ledtemp5 = 0 To Ledtemp3 '横ドット分の処理。 Ledtemp6 = Lookup(fontadr , Rgbled6x8) 'フォントデータを読み込む。 Ledtempw1 = Buffadr For Ledtemp7 = 0 To 7 '縦8ドット分の処理。 Ledtemp8 = Ledbuff(ledtempw1) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 If Ledtemp6.ledtemp7 = 1 Then 'If フォントのドットが有るか? Then Ledtemp8 = Ledtemp8 Or Ledtemp1 '色データのビットをセットする。 Else Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 End If Ledbuff(ledtempw1) = Ledtemp8 'LEDバッファーにデータを書き込む。 Ledtempw1 = Ledtempw1 + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp7 Buffadr = Buffadr + 1 '横ドットを進める。 Fontadr = Fontadr + 1 'フォントアドレスを進める。 Next Ledtemp5 Return ' ' ************************************* ' * 2x8ドット文字 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Ledchr = 文字ASCIIコード) ' ************************************* (1〜64) (1〜4) (0〜7) (0〜7) (&H20〜&HFF) ' Ledwr2: Ledtemp1 = Ledcolor '1-2行目と3-4行目の色のビット配置を選択する。 Ledtemp9 = Ledback If Ledy < 3 Then 'If 1-2行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else Shift Ledtemp1 , Left , 3 '2行目用のビット位置に移動する。 Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 End If Ledtemp3 = Lookup(1 , Rgbled2x8) '指定されたフォントの横ドット数を読み込む。 Ledtemp4 = Ledchr - &H20 'ASCIIコードのオフセットを減算する。 Fontadr = Ledtemp4 * Ledtemp3 '横ドット毎の位置を計算する。 Fontadr = Fontadr + 4 'フォントテーブルにあるフォント情報をスキップする。 Buffadr = Ledx 'LEDバッファーの位置を計算する。 If Ledy.0 = 0 Then 'If 2または4行目か? Then Buffadr = Buffadr + 512 End If Ledtemp3 = Ledtemp3 - 1 For Ledtemp5 = 0 To Ledtemp3 '横ドット分の処理。 Ledtemp6 = Lookup(fontadr , Rgbled2x8) 'フォントデータを読み込む。 Ledtempw1 = Buffadr For Ledtemp7 = 0 To 7 '縦8ドット分の処理。 Ledtemp8 = Ledbuff(ledtempw1) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 If Ledtemp6.ledtemp7 = 1 Then 'If フォントのドットが有るか? Then Ledtemp8 = Ledtemp8 Or Ledtemp1 '色データのビットをセットする。 Else Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 End If Ledbuff(ledtempw1) = Ledtemp8 'LEDバッファーにデータを書き込む。 Ledtempw1 = Ledtempw1 + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp7 Buffadr = Buffadr + 1 '横ドットを進める。 Fontadr = Fontadr + 1 'フォントアドレスを進める。 Next Ledtemp5 Return ' ' ************************************ ' * 8ドット塗りつぶし サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledback = 背景色 , ledlen = Xの塗りつぶし数 ' ************************************ (1〜64) (1〜4) (0〜7) (1〜128) ' Ledfill: Ledtemp9 = Ledback '1行目と2行目の色のビット配置を選択する。 If Ledy < 3 Then 'If 1-2行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 End If For Ledtemp3 = 1 To Ledlen '指定数のドットを背景色で埋める。 Buffadr = Ledx 'LEDバッファーの位置を計算する。 If Ledy.0 = 0 Then 'If 2または4行目か? Then Buffadr = Buffadr + 512 End If For Ledtemp4 = 1 To 8 '縦ドット分の処理。 Ledtemp8 = Ledbuff(buffadr) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 Ledbuff(buffadr) = Ledtemp8 'LEDバッファーにデータを書き込む。 Buffadr = Buffadr + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp4 Ledx = Ledx + 1 Next Ledtemp3 Return ' ' *********************************************** ' * LEDにドットパターンの描画を行うサブルーチン * (DATA1 = (b7-b4:描画するドット数(1-15), b3:0=[X]加算 1=[Y]加算, b2-b0:ドット色) (&H00:終了コード) ' *********************************************** (DATA2 = (b7-b4:[Y]アドレスのオフセット値, b3-b0:[X]アドレスのオフセット値)(&H00-&H0F) ' Leddotdraw: Temp1 = Ledx Temp2 = Ledy Leddotdraw1: Read Temp3 '1バイト目を読み出す。 If Temp3 = &H00 Then Return 'If 終了コードか? Then Ledcolor = Temp3 And &B0000_0111 '色データを取り出す。 Read Temp4 '2バイト目を読み出す。 Temp5 = Temp4 And &B1111_0000 '[Y]オフセット値を取り出す。 Shift Temp5 , Right , 4 Ledy = Temp2 + Temp5 '[Y]位置を計算する。 Temp5 = Temp4 And &B0000_1111 '[X]オフセット値を取り出す。 Ledx = Temp1 + Temp5 '[X]位置を計算する。 Temp5 = Temp3 And &B1111_0000 '描画ドット数を取り出す。 Shift Temp5 , Right , 4 For Temp4 = 1 To Temp5 'ドット数分の描画を行う。 Gosub Ledpset '1ドットを描画する。 If Temp3.3 = 0 Then 'If [X]の加算か? Ledx = Ledx + 1 Else '[Y]の加算の場合。 Ledy = Ledy + 1 End If Next Temp4 Goto Leddotdraw1 ' ' ****************************** ' * 1ドット描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 ' ****************************** (1〜64) (1〜32) (0〜7) ' Ledpset: Ledtemp1 = Ledcolor '1-2行目と3-4行目の色のビット配置を選択する。 Ledtemp3 = Ledy - 1 If Ledy < 17 Then 'If 1-2行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else '3-4行目の場合。 Shift Ledtemp1 , Left , 3 '色データを3-4行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 Ledtemp3 = Ledtemp3 - 16 'LEDバッファーのYアドレスを調整する。 End If Buffadr = Ledtemp3 * 64 'LEDバッファーの位置を計算する。 Buffadr = Buffadr + Ledx Ledtemp8 = Ledbuff(buffadr) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 Ledtemp8 = Ledtemp8 Or Ledtemp1 '色データのビットをセットする。 Ledbuff(buffadr) = Ledtemp8 'LEDバッファーにデータを書き込む。 Return '================================================================================================== ' ' *************************************** ' * TIMER2 比較一致(A) 割り込みルーチン * ' *************************************** ' $notransform On 'R23またはR0を使用する命令に自動修正させない。 ' $asm Tint2a: PUSH R2 IN R2,SREG 'ステータス・レジスタを待避。 PUSH R0 PUSH R1 PUSH XL PUSH XH ; LDS XL,{rowadr} 'LEDバッファーのロー・アドレスを読み込む。 LDI XH, 64 'LEDバッファーの横軸バイト数。(横64ドット) MUL XH,XL 'LEDバッファーの位置を計算する。 Loadadr Ledbuff(1) , X 'RGB LEDパネル データ・バッファーの先頭アドレス。 ADD XL,R0 'LEDバッファーにロー・アドレスを加算する。 ADC XH,R1 ; LDS R0,{Transfer_Length} 'LEDバッファーに転送するバイト数。 Tint2a1: LD R1,X+ 'LEDバッファーから点灯データを読み込む。 Out Panel_rgb , R1 'RGBデータをセットする。 SBI Panel_clk_p, Panel_clk_b 'RGB LEDパネル [CLK]を[H]にする。 CBI Panel_clk_p, Panel_clk_b 'RGB LEDパネル [CLK]を[L]にする。 DEC R0 BRNE Tint2a1 'If 横軸バイト数分の転送終了か? Else ; LDS XL,{rowadr} 'ロー・アドレスを読み込む。 SBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[H]にする。(全LEDを消灯する) SBI Panel_lat_p, Panel_lat_b 'RGB LEDパネル [LAT]を[H]にする。 CBI Panel_lat_p, Panel_lat_b 'RGB LEDパネル [LAT]を[L]にする。 ; CBI Panel_a_p, Panel_a_b 'ロー・アドレスをポートに設定する。 CBI Panel_b_p, Panel_b_b CBI Panel_c_p, Panel_c_b CBI Panel_d_p, Panel_d_b SBRC XL,0 SBI Panel_a_p, Panel_a_b SBRC XL,1 SBI Panel_b_p, Panel_b_b SBRC XL,2 SBI Panel_c_p, Panel_c_b SBRC XL,3 SBI Panel_d_p, Panel_d_b INC XL 'ロー・アドレスを進める。 ANDI XL,$0F STS {rowadr},XL ; POP XH POP XL POP R1 POP R0 Out Sreg , R2 'ステータス・レジスタを復帰 POP R2 CBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[L]にする。 RETI $end Asm ' ' *************************************** ' * TIMER2 比較一致(B) 割り込みルーチン * ' *************************************** ' $asm Tint2b: PUSH R24 SBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[H]にする。 LDI R24,$FF STS {Ledintf},R24 'LED表示割り込み発生フラグを立てる。 POP R24 RETI $end Asm ' $notransform Off End '################################################################################################## ' ' * フォント・データ * ' $include "RGBLED6x8_V3.font" '6x8ドット フォント・ファイルの組み込み。 '$include "font16x16.font" '16x16ドット フォント・ファイルの組み込み。 ' Rgbled2x8: '2x8ドット フォント・ファイル。 $asm .db 1 , 2 , 2 , 0 .db &H07 , &H02 '[AM]矢印 .db &H70 , &H20 '[PM]矢印 $end Asm ' ' * RTC [DS3231]の初期設定データ・テーブル * ' Ds3231initdata: Data &H00 '[DS3231]レジスターのスタートアドレス Data &H00 '[00] Seconds Data &H00 '[01] Minutes Data &H00 '[02] Hours Data &H01 '[03] Weekday Data &H01 '[04] Date Data &H01 '[05] Months Data &H24 '[06] Year Data &H00 '[07] Alarm 1 Seconds Data &H00 '[08] Alarm 1 Minutes Data &H00 '[09] Alarm 1 Hours Data &H00 '[0A] Alarm 1 Day,Date Data &H00 '[0B] Alarm 2 Minutes Data &H00 '[0C] Alarm 2 Hours Data &H00 '[0D] Alarm 2 Day,Date Data &B0000_0000 '[0E] Control (/EOSC=0, BBSQW=0, CONV=0, RS2-RS1=00(1Hz), INTCN=0, A2IE=0, A1IE=0) Data &B0000_0000 '[0F] Control/Status (OSF=0, Bit6=0, Bit5=0, Bit4=0, EN32kHz=0, BSY=x, A2F=0, A1F=0) Data &H00 '[10] Aging Offset ' ' * 機能設定の文字テーブル * ' Funconoff: Data "OFF" , " ON" ' Funcbaroins: Data "OFF" , " 1" , " 2" , " 3" , " 4" , " 5" , " 6" , " 7" , " 8" , " 9" ' Funcserialtime: Data "OFF" , " 1S" , "10S" , " 1M" , "10M" , "60M" ' ' * シリアル送信バッファーの初期データ * ' Serialbuffinit: Data "20xx/xx/xx xx:xx:xx xx.x xx.x xxxx.x{013}{010}" ' ' * 天気予報の待ち時間表示 横線キャラクター・データ * ' Waitbar: Data &H20 , &H20 '[100] Data &H97 , &H20 '[101] Data &H96 , &H20 '[102] Data &H95 , &H20 '[103] Data &H94 , &H20 '[104] Data &H93 , &H20 '[105] Data &H92 , &H20 '[106] Data &H92 , &H97 '[107] Data &H92 , &H96 '[108] Data &H92 , &H95 '[109] Data &H92 , &H94 '[110] Data &H92 , &H93 '[111] Data &H92 , &H92 '[112] Data &H91 , &H92 '[113] Data &H90 , &H92 '[114] Data &H8F , &H92 '[115] Data &H8E , &H92 '[116] Data &H8D , &H92 '[117] Data &H8C , &H92 '[118] Data &H8C , &H91 '[119] Data &H8C , &H90 '[120] Data &H8C , &H8F '[121] Data &H8C , &H8E '[122] Data &H8C , &H8D '[123] Data &H8C , &H8C '[124] Data &H8C , &H8C '[125] ' ' * WBGTと気温・湿度との関係(室内で日射がない場合)* ' Wbgtdata: ' 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 % ' Data 29 , 30 , 31 , 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 '40 ℃ Data 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 '39 ℃ Data 28 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 '38 ℃ Data 27 , 28 , 29 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 40 , 41 '37 ℃ Data 26 , 27 , 28 , 29 , 29 , 30 , 31 , 32 , 33 , 34 , 34 , 35 , 36 , 37 , 38 , 39 , 39 '36 ℃ Data 25 , 26 , 27 , 28 , 29 , 29 , 30 , 31 , 32 , 33 , 33 , 34 , 35 , 36 , 37 , 38 , 38 '35 ℃ Data 25 , 25 , 26 , 27 , 28 , 29 , 29 , 30 , 31 , 32 , 33 , 33 , 34 , 35 , 36 , 37 , 37 '34 ℃ Data 24 , 25 , 25 , 26 , 27 , 28 , 28 , 29 , 30 , 31 , 32 , 32 , 33 , 34 , 35 , 35 , 36 '33 ℃ Data 23 , 24 , 25 , 25 , 26 , 27 , 28 , 28 , 29 , 30 , 31 , 31 , 32 , 33 , 34 , 34 , 35 '32 ℃ Data 22 , 23 , 24 , 24 , 25 , 26 , 27 , 27 , 28 , 29 , 30 , 30 , 31 , 32 , 33 , 33 , 34 '31 ℃ Data 21 , 22 , 23 , 24 , 24 , 25 , 26 , 27 , 27 , 28 , 29 , 29 , 30 , 31 , 32 , 32 , 33 '30 ℃ Data 21 , 21 , 22 , 23 , 24 , 24 , 25 , 26 , 26 , 27 , 28 , 29 , 29 , 30 , 31 , 31 , 32 '29 ℃ Data 20 , 21 , 21 , 22 , 23 , 23 , 24 , 25 , 25 , 26 , 27 , 28 , 28 , 29 , 30 , 30 , 31 '28 ℃ Data 19 , 20 , 21 , 21 , 22 , 23 , 23 , 24 , 25 , 25 , 26 , 27 , 27 , 28 , 29 , 29 , 30 '27 ℃ Data 18 , 19 , 20 , 20 , 21 , 22 , 22 , 23 , 24 , 24 , 25 , 26 , 26 , 27 , 28 , 28 , 29 '26 ℃ Data 18 , 18 , 19 , 20 , 20 , 21 , 22 , 22 , 23 , 23 , 24 , 25 , 25 , 26 , 27 , 27 , 28 '25 ℃ Data 17 , 18 , 18 , 19 , 19 , 20 , 21 , 21 , 22 , 22 , 23 , 24 , 24 , 25 , 26 , 26 , 27 '24 ℃ Data 16 , 17 , 17 , 18 , 19 , 19 , 20 , 20 , 21 , 22 , 22 , 23 , 23 , 24 , 25 , 25 , 26 '23 ℃ Data 15 , 16 , 17 , 17 , 18 , 18 , 19 , 19 , 20 , 21 , 21 , 22 , 22 , 23 , 24 , 24 , 25 '22 ℃ Data 15 , 15 , 16 , 16 , 17 , 17 , 18 , 19 , 19 , 20 , 20 , 21 , 21 , 22 , 23 , 23 , 24 '21 ℃ ' ' * WBGTの顔パターンデータ * (DATA1 = (b7-b4:描画するドット数(1-15), b3:0=[X]加算 1=[Y]加算, b2-b0:ドット色) (&H00:終了コード) ' (DATA2 = (b7-b4:[Y]アドレスのオフセット値, b3-b0:[X]アドレスのオフセット値)(&H00-&H0F) Wbgtface1: Data &H2B , &H22 , &H2B , &H26 , &H51 , &H52 , &H31 , &H63 , &H00 Wbgtface2: Data &H2B , &H22 , &H2B , &H26 , &H51 , &H52 , &H00 Wbgtface3: Data &H2E , &H22 , &H2E , &H26 , &H31 , &H43 , &H11 , &H52 , &H11 , &H56 , &H00 Wbgtface4: Data &H16 , &H23 , &H16 , &H25 , &H16 , &H32 , &H16 , &H36 , &H34 , &H43 , &H14 , &H52 , &H14 , &H56 , &H00 Wbgtface5: Data &H16 , &H22 , &H16 , &H26 , &H16 , &H33 , &H16 , &H35 , &H16 , &H42 , &H16 , &H46 Data &H14 , &H53 , &H14 , &H55 , &H14 , &H62 , &H14 , &H64 , &H14 , &H66 , &H00 ' ' * 曜日 データ・テーブル * ' Weekdata: Data "SUN" , "MON" , "TUE" , "WED" , "THU" , "FRI" , "SAT" ' ' * グラフ表示の[Y]軸の色設定値 * ' Graphtemperature: Data 1 , 3 , 7 , 2 , 6 , 4 '温度用。 ' Graphhumiditye: Data 4 , 2 , 7 , 3 , 5 , 1 '湿度用。 ' Graphbaropress: Data 1 , 5 , 7 , 6 , 4 '気圧用。