$programmer = 22 'ARDUINO (using stk500v1 protocol) ' ' *************************************** ' * MAX30205 人体温度センサー テスト * ' * Arduino LCD Keypad Shield 版 * ' * 2021. 6.22 * ' *************************************** ' ' Ver A0.01 初回公開バージョン。 2021. 6.22 ' $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * 変数の宣言 * ' Dim Temperature As Long 'MAX30205センサーの温度値。 Dim I2cbuff(5) As Byte 'I2Cの送受信データ・バッファー。 ' Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 ' ' * ポートの初期設定 * ' Config Portb.2 = Output 'LCDのバックライト制御の接続ポートを出力に設定する。 Set Portb.2 'LCDのバックライトを点灯する。 ' ' * LCDの初期設定 * ' Config Lcdmode = Port 'LCDを4ビットのポートモードに設定。 Config Lcdbus = 4 'LCDデータバスを4bitに設定。 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 'LCDのポート割り当て。 Config Lcdpin = Pin , Db6 = Portd.6 , Db7 = Portd.7 Config Lcdpin = Pin , E = Portb.1 , Rs = Portb.0 Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 Cls 'LCD表示をすべて消去。 ' Deflcdchar 0 , &H08 , &H14 , &H08 , &H06 , &H09 , &H08 , &H09 , &H06 'カスタム文字[℃]をLCDへ書き込む。 Cursor Off 'LCDのカーソルをオフにする。 ' ' * シリアルポートの設定 * ' Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8 'ハードウェアUARTの設定。 ' ' * I2Cの初期設定 * ' Const I2c_select = 1 '0:ソフトウェアI2C , 1:TWI #if I2c_select = 0 '------[ソフトウェアI2C用]------ Config Scl = Portc.5 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portc.4 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2CバスのSCL,SDAラインを初期化する。 '------------------------------- #else '------[TWI用]------------------ $lib "i2c_twi.lib" 'ハードウェア I2C/TWI ライブラリを組み込む。 Config Twi = 400000 'I2Cバスのクロック = 400KHz Config Scl = Portc.5 'SCLのピン名を指定する必要があります。 Config Sda = Portc.4 'SDAのピン名を指定する必要があります。 I2cinit 'I2CバスのSCL,SDAラインを初期化する。 '------------------------------- #endif ' Const Max30205_address = &H90 'MAX30205のスレーブ・アドレス。 '-------------------------------------------------------------------------------------------------- ' ' * MAX30205のレジスターの初期値を表示する * ' Print : Print "* MAX30205 *" 'タイトルの出力。 ' I2cbuff(1) = &H01 'レジスター・アドレス = [構成レジスター] I2creceive Max30205_address , I2cbuff(1) , 1 , 1 'MAX30205へ1バイトを送信し、1バイトを受信する。 Locate 1 , 1 Lcd "Config: " Locate 2 , 1 Lcd Bin(i2cbuff(1)) 'LCDに[構成レジスター]の内容をバイナリー表示する。 ' Print "-Configuration : " ; Bin(i2cbuff(1)) '[構成レジスター]の内容をターミナルへ出力する。 ' I2cbuff(1) = &H02 'レジスター・アドレス = [THYSTレジスター] I2creceive Max30205_address , I2cbuff(1) , 1 , 2 'MAX30205へ1バイトを送信し、2バイトを受信する。 Tempi1 = Makeint(i2cbuff(2) , I2cbuff(1)) '[THYSTレジスター]の2バイトをインテジャー型に変換する。 Locate 1 , 9 Lcd "THY:" ; Hex(tempi1) 'LCDに[THYSTレジスター]の内容をHEX表示する。 ' Print "-THYST : " ; Hex(tempi1) '[THYSTレジスター]の内容をターミナルへ出力する。 ' I2cbuff(1) = &H03 'レジスター・アドレス = [TOSレジスター] I2creceive Max30205_address , I2cbuff(1) , 1 , 2 'MAX30205へ1バイトを送信し、2バイトを受信する。 Tempi1 = Makeint(i2cbuff(2) , I2cbuff(1)) '[TOSレジスター]の2バイトをインテジャー型に変換する。 Locate 2 , 9 Lcd "TOS:" ; Hex(tempi1) 'LCDに[TOSレジスター]の内容をHEX表示する。 ' Print "-TOS : " ; Hex(tempi1) '[TOSレジスター]の内容をターミナルへ出力する。 Print ' Wait 3 ' ' * LCD画面の初期表示 * ' Cls 'LCD表示をすべて消去。 Locate 1 , 1 Lcd "MAX30205" 'タイトルの表示。 Locate 2 , 3 Lcd "temp:" Main: ' ' * センサーの温度値を取得する * ' Do I2cbuff(1) = &H00 'レジスター・アドレス = [温度レジスター] I2creceive Max30205_address , I2cbuff(1) , 1 , 2 'MAX30205へ1バイトを送信し、2バイトを受信する。 ' Tempi1 = Makeint(i2cbuff(2) , I2cbuff(1)) 'ADC値の2バイトをインテジャー型に変換する。 Shift Tempi1 , Right , 1 , Signed '温度計算の桁数用に最下位ビットを落とす。(15ビットにする) Temperature = Tempi1 * 78125 'ADC値 * 0.0078125℃(15ビットの分解能) Temperature = Temperature / 1000000 '小数点を含む3桁の整数にする。 ' Tempstr = Str(temperature) '数値変数を文字変数に変換する。 Locate 2 , 9 Lcd Format(tempstr , " 0.0") ; " " ; Chr(0) ; " " '温度値をLCDに表示する。 ' Print " " ; Format(tempstr , " 0.0") ; " c" '温度値をターミナルへ出力する。 ' Waitms 500 '表示間隔の待ち時間。 Loop End