' ' ****************************** ' * Gamebuino 初期設定 * ' * * ' * Ver. 0.01 2017. 3.23 * ' ****************************** ' ' Ver. 0.01 新規作成バージョン。 2017. 3.23 ' ' $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 128 'ハードウェア・スタックの容量を設定。 $swstack = 128 'ソフトウェア・スタックの容量を設定。 $framesize = 128 'フレーム領域の容量を設定。 Const Sdcard_use = 0 'SD-Cardの使用状況。(0:使用しない , 1:使用する) ' ' * ポート名の定義 * ' Btn_u Alias Pinb.1 'ボタン[Up]の接続ポート。 Btn_d Alias Pind.6 'ボタン[Down]の接続ポート。 Btn_l Alias Pinb.0 'ボタン[Left]の接続ポート。 Btn_r Alias Pind.7 'ボタン[Right]の接続ポート。 Btn_a Alias Pind.4 'ボタン[A]の接続ポート。 Btn_b Alias Pind.2 'ボタン[B]の接続ポート。 Btn_c Alias Pinc.3 'ボタン[C]の接続ポート。 ' Backlight Alias Portd.5 'G-LCDのバックライトの接続ポート。 Sp_out Alias Portd.3 'スピーカーの接続ポート。 ' ' * ポートの初期設定 * ' Set Portb.1 'ボタン[Up]の接続ポートをプルアップする。 Set Portd.6 'ボタン[Down]の接続ポートをプルアップする。 Set Portb.0 'ボタン[Left]の接続ポートをプルアップする。 Set Portd.7 'ボタン[Right]の接続ポートをプルアップする。 Set Portd.4 'ボタン[A]の接続ポートをプルアップする。 Set Portd.2 'ボタン[B]の接続ポートをプルアップする。 Set Portc.3 'ボタン[C]の接続ポートをプルアップする。 ' Config Backlight = Output 'G-LCDのバックライトの接続ポートを出力に設定する。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 ' Set Portb.2 'SDカードの[/CS]接続ポートを[H]に設定する。 Config Portb.2 = Output 'SDカードの[/CS]接続ポートを出力に設定する。 Set Portc.1 'G-LCDの[/CE]接続ポートを[H]に設定する。 Config Portc.1 = Output 'G-LCDの[/CE]接続ポートを出力に設定する。 Set Portb.5 'G-LCDの[CLK]接続ポートを[H]に設定する。 Config Portb.5 = Output 'G-LCDの[CLK]接続ポートを出力に設定する。 ' ' * AVR-DOSの初期設定 * ' #if Sdcard_use = 0 Config Spi = Hard , Master = Yes , Interrupt = Off , Data Order = Msb , Phase = 1 , Polarity = High , Clockrate = 4 , Noss = 1 Spiinit 'SPIピンを初期化する。 #else $include "Config_MMCSD_HC_Gamebuino.bas" 'SD/MMCカードのピン設定プログラムを組み込む。 $include "CONFIG_AVR-DOS_Mega328P.bas" 'AVR-DOSの設定プログラムを組み込む。 Temp1 = Initfilesystem(1) 'ファイル・システムを初期化する。 #endif ' ' * G-LCDの初期設定 * ' $lib "glcd-Gamebuino.LBX" Config Graphlcd = 128x64sed , Rst = Portc.0 , Cs1 = Portc.1 , A0 = Portc.2 , Si = Portb.3 , Sclk = Portb.5 Cls 'G-LCDの全画面を消去する。 ' ' * I2Cの初期設定 * ' $lib "i2c_twi.lbx" 'TWI用ライブラリを組み込む。 Config Scl = Portc.5 'SCLラインを接続する、ポートピンを設定。 Config Sda = Portc.4 'SDAラインを接続する、ポートピンを設定。 Config Twi = 400000 'SCLクロック速度を設定。 I2cinit 'SCL・SDAラインを初期化。 ' ' * A/Dコンバータの初期設定 * ' Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' * シリアル通信の初期設定 * ' Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8 'ハードウェアUARTの設定。 Config Serialin = Buffered , Size = 80 'シリアルデータ受信を、バッファを使用した割り込み処理にする。 Enable Interrupts 'すべての割り込みを許可。 '-------------------------------------------------------------------------------------------------- ' ' ************************************************************ ' * BME280 温度・湿度・気圧センサー Gamebuino 接続プログラム * ' ************************************************************ ' ' Ver. 1.01 新規作成バージョン。 2017. 3.23 ' Const Bme280_adr = &HEC 'BME280のI2Cアドレス。 ' Dim T As Integer , H As Integer , P As Dword '温度値,湿度値,気圧値の変数。 Dim I2cbuff(30) As Byte 'I2C送受信バッファー。 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 ' ' * Timerの設定 * ' Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer1の設定。16,000,000Hz / 1024 = 15,625Hz Compare1a = 15625 - 1 '15,625Hz / 1Hz(1秒) = 15625カウント ' ' * タイトルの表示 * ' Setfont Gamebuino_font6x8 Print : Print "*** BME280 Temperature, Humidity, Pressure Sensor ***" 'シリアル・ターミナルへオープニング・メッセージを出力する。 Sound Sp_out , 50 , 1333 '1000Hzの音を50mS鳴らす。 Set Backlight 'G-LCDのバックライトを点灯する。 ' ' * BME280の接続を確認する * ' I2cbuff(1) = &HD0 '[ID]レジスター。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し1バイトのデータを受信する。 If I2cbuff(1) <> &H60 Then 'If BME280のチップ識別番号が返ってこないか? Then Lcdat 2 , 7 , "# BME280" Lcdat 4 , 13 , "Not found!" , 1 Print " # BME280 Not found!" Sound Sp_out , 100 , 6666 '200Hzの音を500mS鳴らす。 Stop End If Gosub Bme280init 'BME280の初期設定。 ' ' * LCD画面の初期設定 * ' Setfont Font10x16num Lcdat 1 , 1 , " " , 3 : Lcdat 1 , 73 , Chr(&H3f) , 3 Lcdat 3 , 1 , " " , 3 : Lcdat 3 , 73 , "%" , 3 Setfont Gamebuino_font6x8 Lcdat 5 , 73 , "h" : Lcdat 6 , 73 , "Pa" ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tifr1.ocf1a = 1 Then 'If 1秒経過したか? Then Set Tifr1.ocf1a 'Timer1の比較A一致フラグをリセット。 ' Gosub Bme280read 'BME280から測定データを読み出して補償を行う。 ' Setfont Font10x16num Tempstr = Str(t) '温度値を表示する。 If T < 0 Then 'If マイナスの値か? Then Lcdat 1 , 11 , Format(tempstr , " 0.00") , 3 Else 'プラス値の場合。 Lcdat 1 , 11 , Format(tempstr , " 0.00") , 3 End If Print " Temperature : " ; Format(tempstr , " 0.00") ; " C " ; ' Tempstr = Str(h) '湿度値を表示する。 Lcdat 3 , 11 , Format(tempstr , " 0.00") , 3 Print "Humidity : " ; Format(tempstr , " 0.00") ; " % " ; ' Tempstr = Str(p) '気圧値を表示する。 Lcdat 5 , 1 , Format(tempstr , " 0.00") Print "Pressure : " ; Format(tempstr , " 0.00") ; " hPa" End If ' Debounce Btn_c , 0 , Btncon 'ボタン[C]の検出。 Goto Main ' ' * ボタン[C]が押された場合 * ' Btncon: Toggle Backlight 'G-LCDのバックライトの点灯をON/OFFする。 Goto Main '################################################################################################## ' **************************************************** ' * 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 End ' ' * フォント データ * ' $include "Gamebuino_font6x8.font" $include "Font10x16num.font"