$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' ********************************************** ' * * ' * LPS331AP 気圧センサー / AQM0802A LCD * ' * 気圧・温度・高低差 計 プログラム * ' * * ' * AVR is using ATtiny85-20PU * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 6.22 * ' ********************************************** ' ' Ver 1.01 初回公開バージョン。 2013. 6.22 ' $regfile = "ATtiny85.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 40 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * 動作設定値の初期値 * ' Const Setcontrast = 32 'LCDのコントラスト値。(0〜63) Const Setatptime = 1 '自動電源OFFの設定時間。(0,1,2,3,4 Min) Const Setaltcoeff = 9 '気圧差から高低差を計算する係数。(1hPa = 8〜12m) ' Const Setmode = 1 '設定モードの有無。(0:無し[BASCOM-試用版用] , 1:有り) ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.2 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.2 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinb.1 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portb.1 'スイッチ[2]の接続ポート(プルアップ用)。 Lcd_power Alias Portb.3 'LCDの電源接続ポート。 ' ' * 変数の宣言 * ' Dim Average(32) As Long '移動平均用バッファー。 Dim Avgpoi As Byte '移動平均のポインター。 Dim Avgpoi2 As Byte '移動平均のポインター。(高速モード用) Dim Avgsum As Long '移動平均の合計値。 Dim Avgsum2 As Long '移動平均の合計値。(高速モード用) Dim Baropress As Long '気圧値。(xxxx.xx hPa ×100倍) Dim Temperature As Integer '温度値。(xxx.x ℃ ×10倍) Dim Sampmode As Byte '気圧のサンプリング・モード。(0:通常 , 1:高速モード) Dim Sampchf As Byte '気圧のサンプリング時間変更フラグ。 Dim Barobase As Long '高低差計算用の基準気圧値。(xxxx.xx hPa ×100倍) Dim Altcoeff As Byte '気圧差から高低差を計算する係数。(1hPa = 8〜12m) Dim Dispmode As Byte 'LCDの表示モード。(0:温度表示, 1:高低差表示) Dim T500msf As Byte '500mS経過フラグ。 Dim T1scount As Byte '1秒カウンター。 Dim T1sflag As Byte '1秒経過フラグ。 Dim Atptime As Byte '自動電源OFFの設定時間。 Dim Atpowcun As Byte '自動電源OFFカウンター。 Dim Swoffchf As Byte 'スイッチOFFチェックフラグ。 Dim Lpushcun As Byte 'スイッチ長押しカンター。 ' Dim Rxbuff(5) As Byte 'I2Cの受信データ・バッファー。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 8 '汎用テンポラリ変数 String型 No.1 Dim Tempstr2 As String * 8 '汎用テンポラリ変数 String型 No.2 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eepcontrast As Eram Byte 'EEPROM LCDのコントラスト値。(0〜63) Dim Eepatptime As Eram Byte 'EEPROM 自動電源OFFの設定時間。(0,1,2,3,4 Min) Dim Eepaltcoeff As Eram Byte 'EEPROM 気圧差から高低差を計算する係数。(1hPa = 8〜12m) ' ' * ハードウェアの初期設定 * ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップする。 Config Aci = Off 'アナログ比較器の電源を切る。 Config Lcd_power = Output 'LCDの電源接続ポートを出力に設定する。 Waitms 500 'AVR起動の安定待ち時間。 Set Lcd_power 'LCDの電源をONにする。 Waitms 100 'LCDの起動待ち時間。 ' Config Scl = Portb.4 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portb.0 'I2CバスのSDAラインを接続するポートピンを設定。 Const Lps331ap_adr = &HBA 'LPS331APのI2Cアドレスを指定。 ' Const Aqm0802a_vdd = 3 '[AQM0802A]の電源電圧。(3.5V以下 = 3 , 3.5V以上 = 5) $lib "Lcd_AQM0802A.lib" 'I2C-LCD [AQM0802A]用のライブラリ。 ' I2cinit 'I2Cバスを初期化する。 Gosub Lcdiniset 'LCDを初期化してカスタム文字を書き込む。 ' Pcmsk = &B0000_0100 'スイッチ[1]のピン変化割り込みを許可する。 On Pcint0 Intsw1 Nosave 'スイッチ[1]のピン変化割り込みルーチンを設定。 ' ' * タイマーの設定 * ' Tccr1 = &B0100_1100 'Timer1 = PWM , Prescale = 2048 (1,000,000 / 2048 = 488.28Hz) Ocr1c = 244 - 1 '488.28Hz / 244 = 2Hz (500mS) ' ' * LPS331APの初期化 * ' Rxbuff(1) = &H21 'ソフトウェアRESETを起動する。(CTRL_REG2のSWRESET) Rxbuff(2) = &H04 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 10 'SWRESETの起動待ち時間。 ' Rxbuff(1) = &H21 'ソフトウェアRESETを解除する。(CTRL_REG2のSWRESET) Rxbuff(2) = &H00 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 10 'SWRESETからの起動待ち時間。 ' Gosub Lps331set 'LPS331APの初期設定と移動平均バッファーの初期化。 Barobase = Baropress '高低差計算用の基準気圧値を初期化する。 ' ' * EEPROMのデータを確認する * ' If Eepcontrast > 63 Then 'If EEPROMが初期値か? Then Eepcontrast = Setcontrast 'EEPROM LCDのコントラスト値。(0〜63) Eepatptime = Setatptime 'EEPROM 自動電源OFFの設定時間。(0,1,2,3,4 Min) Eepaltcoeff = Setaltcoeff 'EEPROM 気圧差から高低差を計算する係数。(1hPa = 8〜12m) End If _temp1 = Eepcontrast 'LCDのコントラスト値。(0〜63) !CALL _LCD_CONTRAST 'コントラスト設定ルーチン。 Temp1 = Eepatptime '自動電源OFFの設定時間。(0,1,2,3,4 Min) Atptime = Temp1 * 60 Altcoeff = Eepaltcoeff '気圧差から高低差を計算する係数。(1hPa = 8〜12m) ' Gosub Sw1on1 'LCDに単位を表示する。 Gosub Sampmdisp '圧力のサンプリング・モードを表示する。 Gosub Barodisp '気圧値の移動平均データをLCDに表示する。 Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Gosub Tim500ms '500mSごとの処理。 Gosub Atpower '電源の自動管理処理。 Gosub Swcheck 'スイッチ入力処理。 Goto Main ' ' ******************* ' * 500mSごとの処理 * ' ******************* ' Tim500ms: If Tifr.tov1 = 0 Then Return 'If 500mS経過していないか? Then Set Tifr.tov1 'Timer1 オーバーフロー・フラグをクリアする。 T500msf = 1 '500mS経過フラグを立てる。 ' ' * 気圧値と温度値の取得 * ' Gosub Ptrdconv 'LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する。 ' ' * 気圧値を移動平均する * ' Avgsum = Avgsum - Average(avgpoi) '一番古いデータを減算する。 Average(avgpoi) = Templ1 '移動平均バッファーに格納する。 Avgsum = Avgsum + Templ1 '新しいデータを合算する。 ' Avgsum2 = Avgsum2 - Average(avgpoi2) '一番古いデータを減算する。(高速モード用) Avgsum2 = Avgsum2 + Templ1 '新しいデータを合算する。(高速モード用) ' Avgpoi = Avgpoi + 1 '移動平均ポインターを更新する。 If Avgpoi > 32 Then 'If ポインターが上限か? Then Avgpoi = 1 End If Avgpoi2 = Avgpoi2 + 1 '移動平均ポインターを更新する。(高速モード用) If Avgpoi2 > 32 Then 'If ポインターが上限か? Then Avgpoi2 = 1 End If ' If Sampmode = 0 Then 'If 圧力のサンプリング・モードが通常モードか? Then Baropress = Avgsum Shift Baropress , Right , 5 '32個の移動平均を取る。 Else '気圧のサンプリング・モードが高速モードの場合。 Baropress = Avgsum2 Shift Baropress , Right , 3 '8個の平均合計を取る。 End If ' Gosub Barodisp '気圧値の移動平均データをLCDに表示する。 ' ' * 温度値または高低差値をLCDに表示する * ' T1scount = T1scount + 1 '1秒カウンターを更新する。 If T1scount >= 2 Then 'If 1秒経過したか? Then T1scount = 0 T1sflag = 1 '1秒経過フラグを立てる。 If Dispmode = 0 Then 'If 温度表示モードか? Then Gosub Tempdisp '温度値をLCDに表示する。 Else '高低差表示の場合。 Gosub Altdisp '高低差値をLCDに表示する。 End If End If ' ' * 次回の気圧と温度変換を開始する * ' Rxbuff(1) = &H21 'LPS331APをワンショット・モードで変換開始する。(CTRL_REG2のONE_SHOT) Rxbuff(2) = &H01 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 Return ' ' ********************** ' * 電源の自動管理処理 * ' ********************** ' Atpower: If T1sflag <> 0 Then '1秒経過したか? Then T1sflag = 0 If Atptime <> 0 Then '自動電源OFFが有効か? Then Atpowcun = Atpowcun + 1 '自動電源OFFカウンターを更新する。 If Atptime = Atpowcun Then 'If 自動電源OFF時間か? Then Atpower1: Reset Lcd_power 'LCDとLPS331APの電源をOFFにする。 Reset Gifr.pcif 'ピン変化割り込みフラグをリセットする。 Enable Pcint0 'ピン変化割り込みを許可する。 ' Power Powerdown 'AVRをパワーダウン・モードに移行する。([SW1]で再起動する) ' Disable Pcint0 'ピン変化割り込みを禁止する。 Set Lcd_power 'LCDの電源をONにする。 Waitms 50 'LCDの起動待ち時間。 Gosub Lcdiniset 'LCDを初期化してカスタム文字を書き込む。 ' Gosub Lps331set 'LPS331APの初期設定と移動平均バッファーの初期化 ' Gosub Sw1on1 'LCDに単位を表示する。 Gosub Sampmdisp '圧力のサンプリング・モードを表示する。 Gosub Barodisp '気圧値の移動平均データをLCDに表示する。 ' Swoffchf = 1 'スイッチが離されるのを待つ。 Atpowcun = 0 '自動電源OFFカウンターをクリアする。 End If End If End If Return ' ' ******************** ' * スイッチ入力処理 * ' ******************** ' Swcheck: If Swoffchf <> 0 Then Goto Swoffchk 'If スイッチが押されたままか? Then If Sw_1 = 0 Then Goto Sw1on 'If [SW1]が押されたか? Then If Sw_2 = 0 Then Goto Sw2on 'If [SW2]が押されたか? Then Return ' ' * [SW1]が押された場合 * ' Sw1on: Waitms 30 'チャタリング除去の待ち時間。 If Sw_2 = 0 Then Goto Sw12on 'If [SW1]と[SW2]が同時に押されたか? Then Toggle Dispmode.0 '表示モードを変更する。 If Dispmode = 0 Then '表示モードが[0]か? Then If Atptime = 0 Then Goto Sw1on2 '自動電源OFFが無効か? Then End If Swoffchf = 1 'スイッチが離されるのを待つ。 ' Sw1on1: Locate 1 , 8 '[hP]単位を表示する。 Lcd Chr(1) ' Locate 2 , 2 '2行の表示エリアをクリアする。 Lcd Spc(6); ' If Dispmode = 0 Then 'If 温度表示モードか? Then Lcd Chr(2) '[℃]単位を表示する。 Gosub Tempdisp '温度値をLCDに表示する。 Else '高低差表示の場合。 Lcd "m" '[m]単位を表示する。 Gosub Altdisp '高低差値をLCDに表示する。 End If Atpowcun = 0 '自動電源OFFカウンターをクリアする。 Return ' ' Sw1on2: '自動電源OFFが無効の場合。([SW1]で電源OFFする) Bitwait Sw_1 , Set 'スイッチ[1]が離されるまで待つ。 Waitms 30 'チャタリング除去の待ち時間。 Goto Atpower1 '電源OFFへ。 ' ' * [SW2]が押された場合 * ' Sw2on: Waitms 30 'チャタリング除去の待ち時間。 Swoffchf = 1 'スイッチが離されるのを待つ。 Lpushcun = 0 'スイッチ長押しカンターを初期化する。 T500msf = 0 '500mS経過フラグをクリアする。 Sampchf = 1 '気圧のサンプリング・モード変更フラグ。 Atpowcun = 0 '自動電源OFFカウンターをクリアする。 Return ' ' * スイッチが離されるのを待つ * ' Swoffchk: Temp1 = Sw_1 Or Sw_2 If Temp1 = 0 Then Goto Sw12on 'If [SW1]と[SW2]が同時に押されたか? Then ' Temp1 = Sw_1 And Sw_2 If Temp1 <> 0 Then 'If [SW1]と[SW2]が離されたか? Then Waitms 30 'チャタリング除去の待ち時間。 Swoffchf = 0 Lpushcun = 0 'スイッチ長押しカンターを初期化する。 ' If Sampchf <> 0 Then '気圧のサンプリング・モードを変更か? Then Sampchf = 0 Toggle Sampmode.0 '圧力のサンプリング・モードを変更する。 Gosub Sampmdisp '圧力のサンプリング・モードを表示する。 End If Else 'スイッチ長押しの検出。 If T500msf <> 0 Then 'If 500mS経過したか? Then T500msf = 0 If Sw_1 <> 0 Then 'If [SW1]が押されていないか? Then If Sw_2 = 0 Then 'If [SW2]が押されているか? Then If Dispmode <> 0 Then 'If 高低差表示モードか? Then Select Case Lpushcun Case 0 : Lpushcun = Lpushcun + 1 'スイッチ長押しカンターを更新する。 Case Is < 7 : '3秒経過していない場合。 Lpushcun = Lpushcun + 1 'スイッチ長押しカンターを更新する。 Locate 2 , Lpushcun 'LCDに[*]マークを表示する。 Lcd "*" Sampchf = 0 '気圧のサンプリング時間変更フラグをリセットする。 Case 7 : '3秒押し続けた場合。 Locate 2 , 2 Lcd "Res0.0" Barobase = Baropress '高低差計算用の基準気圧値を現在の気圧値にリセットする。 Lpushcun = 100 End Select End If End If End If End If End If Atpowcun = 0 '自動電源OFFカウンターをクリアする。 Return ' ' * [SW1]と[SW2]が同時に押された場合 * ' Sw12on: #if Setmode = 1 'If 設定モードを組み込むか? Then Cls Lcd "Contrast" Locate 2 , 1 Lcd "Set" ' Waitms 30 'チャタリングの待ち時間。 Do 'スイッチ[1,2]が離されるまで待つ。 Temp1 = Sw_1 And Sw_2 Loop Until Temp1 = 1 'If スイッチ[1,2]が離されたか? Then Waitms 30 'チャタリングの待ち時間。 Lcdcmd &B0000_1111 'LCDのカーソルをオン・点滅にする。 ' ' * コントラストの設定 * ' Temp1 = Eepcontrast Setmode11: Locate 2 , 7 Lcd Temp1 Locate 2 , 6 Setmode12: Debounce Sw_1 , 0 , Setmode14 'If スイッチ[1]が押されたか? Then Debounce Sw_2 , 0 , Setmode13 'If スイッチ[2]が押されたか? Then Goto Setmode12 ' Setmode13: Temp1 = Temp1 + 1 If Temp1 > 50 Then 'If 上限値か? Then Temp1 = 30 End If _temp1 = Temp1 'LCDのコントラスト値。(0〜63) !CALL _LCD_CONTRAST 'コントラスト設定ルーチン。 Goto Setmode11 ' Setmode14: Eepcontrast = Temp1 ' ' * 自動電源オフ時間の設定 * ' Cls Lcd "AutPower" Locate 2 , 1 Lcd "OFF min" Waitms 30 'チャタリングの待ち時間。 Bitwait Sw_1 , Set 'スイッチ[1]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 ' Temp1 = Eepatptime Setmode21: Locate 2 , 5 Lcd Temp1 Locate 2 , 4 Setmode22: Debounce Sw_1 , 0 , Setmode24 'If スイッチ[1]が押されたか? Then Debounce Sw_2 , 0 , Setmode23 'If スイッチ[2]が押されたか? Then Goto Setmode22 ' Setmode23: Temp1 = Temp1 + 1 If Temp1 > 4 Then 'If 上限値か? Then Temp1 = 0 End If Goto Setmode21 ' Setmode24: Eepatptime = Temp1 Atptime = Temp1 * 60 ' ' * 気圧差から高低差を計算する係数の設定 (1hPa = 8〜12m) * ' Cls Lcd "DiffElev" Locate 2 , 1 Lcd "1" ; Chr(1) ; " = m" Waitms 30 'チャタリングの待ち時間。 Bitwait Sw_1 , Set 'スイッチ[1]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 ' Temp1 = Eepaltcoeff Setmode31: Locate 2 , 6 Tempstr = Str(temp1) Lcd Format(tempstr , " 0") Locate 2 , 5 Setmode32: Debounce Sw_1 , 0 , Setmode34 'If スイッチ[1]が押されたか? Then Debounce Sw_2 , 0 , Setmode33 'If スイッチ[2]が押されたか? Then Goto Setmode32 ' Setmode33: Temp1 = Temp1 + 1 If Temp1 > 12 Then 'If 上限値か? Then Temp1 = 8 End If Goto Setmode31 ' Setmode34: Eepaltcoeff = Temp1 Altcoeff = Temp1 ' Lcdcmd &B0000_1100 'LCDのカーソルをオフ・点滅なしにする。 Cls Gosub Sw1on1 'LCDに単位を表示する。 Gosub Sampmdisp '圧力のサンプリング・モードを表示する。 Gosub Barodisp '気圧値の移動平均データをLCDに表示する。 Waitms 30 'チャタリングの待ち時間。 Bitwait Sw_1 , Set 'スイッチ[1]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 #endif Swoffchf = 1 'スイッチが離されるのを待つ。 Atpowcun = 0 '自動電源OFFカウンターをクリアする。 Sampchf = 0 '気圧のサンプリング時間変更フラグをリセットする。 Return ' ' ***************************************** ' * LCDを初期化してカスタム文字を書き込む * ' ***************************************** ' Lcdiniset: Initlcd 'LCDを初期化する。 ' Deflcdchar 1 , &H10 , &H18 , &H14 , &H14 , &H02 , &H05 , &H06 , &H04 'カスタム文字[hp]をLCDへ書き込む。 Deflcdchar 2 , &H08 , &H14 , &H08 , &H06 , &H09 , &H08 , &H09 , &H06 'カスタム文字[℃]をLCDへ書き込む。 Return ' ' ************************************************** ' * LPS331APの初期設定と移動平均バッファーの初期化 * ' ************************************************** ' Lps331set: Rxbuff(1) = &H0F 'LPS331APの存在を確認する。 Gosub Lps331rd 'LPS331APのレジスターから1バイトを読み出す。 If Rxbuff(1) <> &HBB Then 'If デバイスの識別コードが読み出せないか? Then Locate 1 , 1 'LPS331APのエラー表示。 Lcd "LPS331AP" Locate 2 , 1 Lcd "NotFound" Stop End If ' Rxbuff(1) = &H20 'LPS331APをパワーダウンにする。(CTRL_REG1のPD) Rxbuff(2) = &H00 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 2 'パワーダウンの起動待ち時間。 ' Rxbuff(1) = &H10 'LPS331APの分解能を設定する。(RES_CONF) Rxbuff(2) = &H7A Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 ' Rxbuff(1) = &H30 'LPS331APのアナログ・フロント・エンド回路をONにする。(AMP_CTRL) Rxbuff(2) = &H01 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 ' Rxbuff(1) = &H20 'LPS331APを起動する。ブロック・データ更新を有効にする。(CTRL_REG1のPDとBDU) Rxbuff(2) = &H84 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 2 'パワーダウンからの起動待ち時間。 ' Gosub Ptrdconv '圧力と温度レジスターを空読みする。 ' ' * 移動平均バッファーの初期化 * ' Rxbuff(1) = &H21 'LPS331APをワンショット・モードで変換開始する。(CTRL_REG2のONE_SHOT) Rxbuff(2) = &H01 Gosub Lps331wr 'LPS331APのレジスターに1バイトを書き込む。 ' Do '変換の終了を待つ。 Waitms 10 '読み出しの待ち時間。 Rxbuff(1) = &H27 'ステータ・スレジスターを読み込む。 Gosub Lps331rd 'LPS331APのレジスターから1バイトを読み出す。 Rxbuff(1) = Rxbuff(1) And &B0000_0011 Loop Until Rxbuff(1) = &B0000_0011 'If 圧力と温度の変換が終了したか? Then ' Gosub Ptrdconv 'LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する。 Baropress = Templ1 '平均気圧値の初期値。 ' For Avgpoi = 1 To 32 '移動平均バッファーを初期値で埋める。 Average(avgpoi) = Templ1 Next Avgpoi Avgsum = Templ1 '32個の平均合計を作る。 Shift Avgsum , Left , 5 Avgsum2 = Templ1 '8個の平均合計を作る。 Shift Avgsum2 , Left , 3 Avgpoi = 8 '移動平均のポインターを初期化する。 Avgpoi2 = 1 '移動平均のポインター(高速用)を初期化する。 Return ' ' **************************************** ' * 圧力のサンプリング・モードを表示する * ' **************************************** ' Sampmdisp: Locate 2 , 1 If Sampmode = 0 Then 'If サンプリング・モードが[通常]か? Then Lcd " " Else Lcd "h" End If Return ' ' ************************* ' * 気圧値をLCDに表示する * ' ************************* ' Barodisp: Locate 1 , 1 Tempstr = Str(baropress) Lcd Format(tempstr , " 0.00") Return ' ' ************************* ' * 温度値をLCDに表示する * ' ************************* ' Tempdisp: Locate 2 , 2 Tempstr2 = Str(temperature) '文字列に変換する。 Tempstr = Format(tempstr2 , " 0.0") '小数点表記に変換する。 If Temperature < 0 Then 'If マイナスの温度か? Then Tempstr2 = Mid(tempstr , 2 , 5) Lcd Tempstr2 Else 'プラスの場合。 Lcd Tempstr End If Return ' ' *************************** ' * 高低差値をLCDに表示する * ' *************************** ' Altdisp: If Lpushcun = 0 Then 'If スイッチの長押し検出をしていないか? Then Templ1 = Barobase - Baropress '気圧の基準点との差を計算する。 Templ1 = Templ1 * Altcoeff '気圧差から高低差を計算する係数。(1hPa = 8〜12m) Templ1 = Templ1 / 10 '単位を[m]に合わせる。 ' Locate 2 , 2 Tempstr2 = Str(templ1) '文字列に変換する。 Tempstr = Format(tempstr2 , " 0.0") '小数点表記に変換する。 Select Case Templ1 Case Is < -9999 : '-1000m 以下の場合。 Tempstr2 = Left(tempstr , 5) Lcd Tempstr2 ; " " Case Is < 0 : '-0.1〜-999.9 の場合。 Tempstr2 = Mid(tempstr , 2 , 6) Lcd Tempstr2 Case Else : 'プラスの場合。 Lcd Tempstr End Select End If Return ' ' ********************************************************************** ' * LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する * (Templ1 = 気圧値×100) ' ********************************************************************** (Temperature = 温度値×10) ' Ptrdconv: Rxbuff(1) = &HA8 '[PRESS_OUT_XL,PRESS_OUT_L,PRESS_OUT_H]を読み出す。 I2creceive Lps331ap_adr , Rxbuff(1) , 1 , 3 'I2Cバスで、1バイトのコマンドを送信し、3バイトのデータを受信する。 Templ1 = Rxbuff(3) '3バイトをロング変数に変換する。 Shift Templ1 , Left , 16 Tempw1 = Makeint(rxbuff(1) , Rxbuff(2)) Templ1 = Templ1 Or Tempw1 Templ1 = Templ1 * 100 '小数点以下2桁を桁上げする。(小数点演算を使わないため) Templ1 = Templ1 / 4096 ' Rxbuff(1) = &HAB '[TEMP_OUT_L,TEMP_OUT_H]を読み出す。 I2creceive Lps331ap_adr , Rxbuff(1) , 1 , 2 'I2Cバスで、1バイトのコマンドを送信し、2バイトのデータを受信する。 Temperature = Makeint(rxbuff(1) , Rxbuff(2)) Temperature = Temperature / 48 Temperature = Temperature + 425 Return ' ' ******************************************* ' * LPS331APのレジスターに1バイトを書き込む * (Rxbuff(1) = 書き込むレジスターのアドレス) ' ******************************************* (Rxbuff(2) = 書き込むバイト・データ) ' Lps331wr: I2csend Lps331ap_adr , Rxbuff(1) , 2 'I2Cバスで、1バイトのコマンドを送信する。 Return ' ' ********************************************* ' * LPS331APのレジスターから1バイトを読み出す * (Rxbuff(1) = 読み出すレジスターのアドレス) ' ********************************************* ' Lps331rd: I2creceive Lps331ap_adr , Rxbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 Return ' ' ************************************ ' * スイッチ入力割り込み処理ルーチン * ' ************************************ ' Intsw1: Return '何も処理しない。 ' ' End