'$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' *********************************************** ' * * ' * BME280 温度・湿度・気圧センサー * ' * 天気予報 + 熱中症モニター プログラム * ' * * ' * AVR ATtiny85-20PU / LCD AQM1602Y-RN-GBW * ' * Copyright O-Family 2017. 8. 6 * ' *********************************************** ' ' Ver 0.01 [試用版] 初回公開バージョン。 2017. 8.25 ' ' Const Prgver = " 0.01" 'プログラム・バージョン。 ' ' $regfile = "ATtiny85.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 40 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * 動作設定値の初期値 * ' Const Setcontrast = 43 'LCDのコントラスト値。(0〜63) Const Bme280_adr = &HEC 'BME280のI2Cアドレス。 ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.1 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.1 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinb.2 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portb.2 'スイッチ[2]の接続ポート(プルアップ用)。 Sp_out Alias Portb.0 'スピーカーの接続ポート。 ' ' * 変数の宣言 * ' Dim Buzzerf As Byte 'ブザーのON/OFFフラグ。(0:OFF , 1:ON) Dim Baropress As Word '気圧値。 Dim Wbgt As Byte 'WBGT値。 Dim Wbgtlevel As Byte 'WBGT警報レベル。 Dim Wbgttempal As Byte 'WBGT警報レベルの保管用。 Dim Wbgttempt As Byte 'WBGT温度値の保管用。 Dim Time8sec As Byte '8.192秒経過フラグ。 Dim Time1hour As Word '1時間カウントタイマー。(8.192秒でカウントアップ) Dim Time10min As Byte '10分カウントタイマー。(8.192秒でカウントアップ) ' Dim T As Integer , H As Integer , P As Dword '温度値,湿度値,気圧値の変数。 Dim Tb As Byte , Hb As Byte '温度値,湿度値の整数部のバイト値。 Dim I2cbuff(30) 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 Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 Dim Tempstr2 As String * 20 '汎用テンポラリ変数 String型 No.2 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eepcontrast As Eram Byte 'EEPROM LCDのコントラスト値。(0〜63) ' ' * ハードウェアの初期設定 * ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップする。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 Config Aci = Off 'アナログ比較器の電源を切る。 Waitms 500 'AVR起動の安定待ち時間。 ' ' * I2Cの初期設定 * ' Config Scl = Portb.4 'I2CバスのSCLラインを接続するポートピンを設定する。 Config Sda = Portb.3 'I2CバスのSDAラインを接続するポートピンを設定する。 I2cinit 'I2Cバスを初期化する。 ' ' * LCDの初期設定 * ' Const Vmode = 3 '[AQM1602Y]の電源電圧。(3.5V以下 = 3 , 3.5V以上 = 5) Config Lcd = 16x2 , Chipset = St7032 'LCD表示を16文字2行に設定。 $lib "Lcd_AQMxx02.LBX" 'I2C LCD用のライブラリを組み込む。 Initlcd 'LCDを初期化する。 Deflcdchar 0 , &H08 , &H14 , &H08 , &H06 , &H09 , &H08 , &H09 , &H06 'カスタム文字[℃]をLCDへ書き込む。 Deflcdchar 1 , &H10 , &H18 , &H14 , &H14 , &H02 , &H05 , &H06 , &H04 'カスタム文字[hp]をLCDへ書き込む。 Deflcdchar 2 , &H01 , &H03 , &H0F , &H0F , &H0F , &H03 , &H01 , &H00 'カスタム文字[スピーカー]をLCDへ書き込む。 Cursor Off 'LCDのカーソルをオフにする。 Cls 'LCD表示をすべて消去。 ' ' * EEPROMのデータを確認する * ' If Eepcontrast > 63 Then 'If EEPROMが初期値か? Then Eepcontrast = Setcontrast 'EEPROM LCDのコントラスト値。(0〜63) End If _temp1 = Eepcontrast 'LCDのコントラスト値。(0〜63) !CALL _LCD_CONTRAST 'コントラスト設定ルーチン。 ' ' * スイッチ割り込みの設定 * ' Pcmsk = &B0000_0110 'スイッチのピン変化割り込みを許可する。 On Pcint0 Swint Nosave 'スイッチのピン変化割り込みルーチンを設定する。 Enable Pcint0 'ピン変化割り込みを許可する。 ' ' * ウォッチドッグ・タイマーの設定 * ' Config Watchdog = 8192 'ウォッチドッグ・タイマーを8.192秒に設定する。 Set Wdtcr.wdie 'ウォッチドッグ・タイマーを割り込み発生に設定する。 On Wdt Wdtint Nosave 'ウォッチドッグ・タイマーの割り込みルーチンを設定する。 ' ' * BME280の接続を確認する * ' I2cbuff(1) = &HD0 '[ID]レジスター。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し1バイトのデータを受信する。 If I2cbuff(1) <> &H60 Then 'If BME280のチップ識別番号が返ってこないか? Then Locate 1 , 1 Lcd "# BME280" Locate 2 , 1 Lcd " Not found!" Stop End If ' ' * プログラム・バージョンの表示 * ' If Sw_1 = 0 Then 'If スイッチ1が押されているか? Then Locate 1 , 1 'プログラム・バージョンを表示。 Lcd "BME280heatstroke" Locate 2 , 1 Lcd " monitor V." ; Prgver Gosub Swoffcheck 'スイッチが離されるまで待つ。 Cls End If ' ' * 起動の初期設定 * ' Buzzerf = 1 'ブザーのON/OFFフラグ。(0:OFF , 1:ON) Gosub Buz4000 '4,000Hzの音を50mS鳴らす。 Gosub Bme280init 'BME280の初期設定。 Waitms 500 '初回の計測の待ち時間。 Gosub Bme280read 'BME280から測定データを読み出して補償を行う。 Gosub Lcddisp '測定データをLCDへ表示する。 Gosub Wbgtcal '熱中症モニターのWBGT値と警報レベルを計算する。 Gosub Wbgtdisp 'WBGT 熱中症モニターの警報をLCDへ表示する。 ' Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Power Powerdown 'AVRをパワーダウン・モードに移行させる。(スイッチとウォッチドックで起動) ' Gosub Swcheck 'スイッチ入力処理。 ' Gosub Bme280read 'BME280から測定データを読み出して補償を行う。 Gosub Bme280start 'BME280を強制モードで測定開始する。 Gosub Wbgtcal '熱中症モニターのWBGT値と警報レベルを計算する。 ' If Time8sec <> 0 Then 'If 8.192秒経過したか? Then Time8sec = 0 Time10min = Time10min + 1 '10分カウントタイマーを加算する。(8.192秒でカウントアップ) End If ' Gosub Lcddisp '測定データをLCDへ表示する。 Gosub Wbgtdisp '熱中症モニターの警報レベルをLCDに表示し、警報を鳴らす。 ' Goto Main '============================================================================== ' ' *************************************** ' * 4,000Hzの音を50mS鳴らすサブルーチン * ' *************************************** ' Buz4000: Sound Sp_out , 200 , 21 '4,000Hzの音を50mS鳴らす。 Return ' ' ***************************************** ' * 測定データをLCDへ表示するサブルーチン * ' ***************************************** ' Lcddisp: Cursor Off Noblink 'LCDのカーソルをオフ・点滅なしにする。 ' P = P / 10 '気圧値の小数点以下を1桁にする。 Baropress = P 'ワード値に代入する。 ' Locate 1 , 8 Tempstr = Str(baropress) '気圧値の表示。 Lcd Format(tempstr , " 0.0") ; Chr(1) ' T = T / 10 '温度値の小数点以下を1桁にする。 Tempi1 = T / 10 '温度値の小数点以下を無しにする。 Tb = Tempi1 If Tempi1 < 0 Then 'If 温度値がマイナスか? Then Tb = 0 End If Tempstr = Str(t) '温度値を表示する。 Locate 1 , 1 If T < 0 Then 'If マイナスの値か? Then Lcd Format(tempstr , " 0.0") Else 'プラス値の場合。 Lcd Format(tempstr , " 0.0") End If Locate 1 , 6 Lcd Chr(0) '温度の単位[℃] ' H = H / 10 '湿度値の小数点以下を1桁にする。 Tempi1 = H / 10 '湿度値の小数点以下を無しにする。 Hb = Tempi1 Tempstr = Str(h) '湿度値を表示する。 Locate 2 , 1 Lcd Format(tempstr , " 0.0") ; "%" 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 ' ' ********************************************************************* ' * 熱中症モニターの警報レベルをLCDに表示し、警報を鳴らすサブルーチン * ' ********************************************************************* ' Wbgtdisp: Locate 2 , 16 '警報マークの表示。 Select Case Buzzerf Case 1 : Lcd Chr(2) 'スピーカー マークを表示する。 Case Else : Lcd " " '警報ブザーOFF。 End Select ' Locate 2 , 8 '熱中症モニターを表示する。 Lcd Wbgtlevel '警報レベルの数値を表示する。 Select Case Wbgtlevel '警報レベルの文字列を表示する。 Case 5 : '警報レベル[5]。 Lcd "-*キケン* " Locate 2 , 8 Cursor On Blink 'LCDのカーソルをオン・点滅にする。 ' Case 4 : '警報レベル[4]。 Lcd "ゲンケイカイ" Locate 2 , 8 Cursor On Blink 'LCDのカーソルをオン・点滅にする。 ' Case 3 : '警報レベル[3]。 Lcd "-ケイカイ " ' Case 2 : '警報レベル[2]。 Lcd "-チュウイ " ' Case 1 : '警報レベル[1]。 Lcd "ホホアンゼン" ' Case Else : '警報レベル[0]。 Lcd "-------" End Select ' ' * WBGT 熱中症モニターの警報音処理 * ' If Wbgtlevel > Wbgttempal Then 'If 警報のレベルが上がったか? Then Gosub Alarmbuzzer '警報ブザーを警報回数分鳴らす。 Time10min = 0 '10分カウントタイマー。(8.192秒でカウントアップ) Wbgttempal = Wbgtlevel '警報レベルを保管する。 Wbgttempt = Wbgt - 1 'WBGT値-1を保管する。(警報レベルの境界でブザーを連続させないため) ' Else '警報レベルの変化が無い、または下がった場合。 If Wbgt < Wbgttempt Then 'If 警報ブザー発音後にWBGT値が2℃以上下がったか? Then Wbgttempal = Wbgtlevel '警報レベルの保管を更新する。 End If ' If Wbgtlevel >= 5 Then 'If 警報レベルが5か? Then If Time10min > 73 Then 'If 10分経過したか? Then Gosub Alarmbuzzer '警報ブザーを警報回数分鳴らす。 Time10min = 0 '10分カウントタイマー。(8.192秒でカウントアップ) End If End If End If Return ' ' * 警報ブザーを警報回数分鳴らすサブルーチン * ' Alarmbuzzer: If Buzzerf <> 0 Then 'If 警報ブザーがONになっているか? Then For Temp1 = 1 To Wbgtlevel '警報レベルの回数分ブザーを鳴らす。 Gosub Buz4000 '4,000Hzの音を50mS鳴らす。 Waitms 200 Next Temp1 End If Return '------------------------------------------------------------------------------ ' ' ******************** ' * スイッチ入力処理 * ' ******************** ' Swcheck: If Sw_1 = 0 Then Goto Sw1on 'If [SW1]が押されたか? Then If Sw_2 = 0 Then Goto Sw2on 'If [SW2]が押されたか? Then Return ' ' * [SW1]が押された場合 * ' Sw1on: Gosub Buz4000 '4,000Hzの音を50mS鳴らす。 If Sw_2 = 0 Then Goto Sw12on 'If [SW1]と[SW2]が同時に押されたか? Then ' Sw1on1: Gosub Swoffcheck 'スイッチが離されるまで待つ。 Return ' ' * [SW2]が押された場合 * ' Sw2on: Gosub Buz4000 '4,000Hzの音を50mS鳴らす。 If Sw_1 = 0 Then Goto Sw12on 'If [SW1]と[SW2]が同時に押されたか? Then ' Buzzerf = Buzzerf + 1 'ブザーのモードを変更する。 If Buzzerf > 1 Then 'If 上限か? Then Buzzerf = 0 End If ' Time10min = 0 '10分カウントタイマーを初期化する。 Goto Sw1on1 ' ' * [SW1]と[SW2]が同時に押された場合 (コントラストの設定) * ' Sw12on: Cls Lcd "Contrast Set" Gosub Swoffcheck 'スイッチが離されるまで待つ。 Cursor On Blink 'LCDのカーソルをオン・点滅にする。 ' Temp1 = Eepcontrast Setmode11: Locate 1 , 15 'コントラストの設定値を表示する。 Lcd Temp1 Locate 1 , 14 'カーソルを数値の左に移動する。 Setmode12: Debounce Sw_1 , 0 , Setmode14 'If スイッチ[1]が押されたか? Then Debounce Sw_2 , 0 , Setmode13 'If スイッチ[2]が押されたか? Then Goto Setmode12 ' Setmode13: 'スイッチ[2]が押された場合。 Temp1 = Temp1 + 1 If Temp1 > 60 Then 'If 上限値か? Then Temp1 = 30 End If _temp1 = Temp1 'LCDのコントラスト値。(0〜63) !CALL _LCD_CONTRAST 'コントラスト設定ルーチン。 Goto Setmode11 ' Setmode14: 'スイッチ[1]が押された場合。 Eepcontrast = Temp1 Gosub Buz4000 '4,000Hzの音を50mS鳴らす。 Gosub Swoffcheck 'スイッチが離されるまで待つ。 Cursor Off Noblink 'LCDのカーソルをオフ・点滅なしにする。 Cls 'LCD表示をすべて消去。 Return ' ' * スイッチが離されるまで待つ * ' Swoffcheck: Waitms 30 'チャタリングの待ち時間。 Bitwait Sw_1 , Set '[SW1]が離されるまで待つ。 Bitwait Sw_2 , Set '[SW2]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 Return '============================================================================== ' ' ************************************ ' * スイッチ入力割り込み処理ルーチン * ' ************************************ ' Swint: Return '何も処理しない。 ' ' ************************************************ ' * ウォッチドッグ・タイマー割り込み処理ルーチン * ' ************************************************ ' $asm Wdtint: PUSH R24 LDI R24,$FF STS {time8sec},R24 '8秒経過フラグを立てる。 POP R24 RETI $end Asm '################################################################################################## ' **************************************************** ' * 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) = &B0000_0001 '湿度のオーバー・サンプリング = ×1 I2cbuff(3) = &HF4 : I2cbuff(4) = &B0010_0101 '温度のオーバー・サンプリング = ×1 , 圧力のオーバー・サンプリング = ×1 , 強制モード I2cbuff(5) = &HF5 : I2cbuff(6) = &B0000_0000 '通常モードの休止期間 = 0.5s , IIRフィルター = OFF 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を強制モードで測定開始する * ' ************************************ ' Bme280start: I2cbuff(1) = &HF4 : I2cbuff(2) = &B0010_0101 '温度のオーバー・サンプリング = ×1 , 圧力のオーバー・サンプリング = ×1 , 強制モード I2csend Bme280_adr , I2cbuff(1) , 2 'I2Cバスで、2バイトのコマンドを送信する。 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 ' ' End ' ' * 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 ℃