ラズベリーパイの読み取り値BMP085温度と圧力
eBay経由で安価に購入したもう1つの楽しい小さなi2cデバイス。気圧と温度を読み取ります。出力を読み取り可能なものに変換するための比較的簡単な計算がいくつかあります。
繰り返しになりますが、ADAFruitは、RaspberryPiでのBMP085の使用でデバイスを使用するための素晴らしいガイドとライブラリを提供します。以前の投稿と同様に、ADAFruitライブラリをそのまま使用できたはずです。車輪の再発明とゼロからの再コーディングの必要性は感じませんが、それがどのように機能するかを理解したいと思います。
他のいくつかの情報源から情報を引き出しました:
- BMP085温度を読み取るMaartenDamenのバス海賊(これを書いている時点ではサイトがダウンしています)
- RaspberryPiを使用してBoschBMP085からデータを読み取る際のJohnBurnのCコードのPythonポート。
以下は、デバイスをPiに接続するための非常に簡単な回路図です。
smbus BMP085(): OSS = 3 def __ init __( 、i2c、アドレス): .i2c = i2c .address = .ac1 = .readSignedWord( 0xaa ) .ac2 = .readSignedWord( 0xac ) .ac3 = .readSignedWord( 0xae ) .ac4 = .readWord( 0xb0 ) .ac5 = .readWord( 0xb2 ) .ac6 = .readWord( 0xb4 ) .b1 = .readSignedWord( 0xb6 ) .b2 = .readSignedWord( 0xb8 ) .mb = .readSignedWord( 0xba ) .mc = .readSignedWord( 0xbc ) .md = .readSignedWord( 0xbe ) def readWord( 、reg): msb = .i2c.read_byte_data( .address、reg) lsb = .i2c.read_byte_data( .address、reg + 1 ) = (msb << 8 ) + lsb value def readSignedWord( 、reg):msb = .i2c.read_byte_data( .address、reg)lsb = .i2c.read_byte_data( .address、reg + 1 ) 場合 (msb> 127 ): msb = msb - 256 = (msb << 8 ) + lsb value def readUT( ): .i2c.write_byte_data( .address、 0xf4 、 0x2e )time.sleep( 0.0045 )ut = .readWord( 0xf6 ) ut def readTemperature( ):ut = .readUT()x1 = ((ut - .ac6) * .ac5)>> 15 x2 = ( .mc << 11 ) / (x1 + .md) .b5 = x1 + x2 (( .b5 + 8 )>> 4 ) / 10.0 def readUP( ): .i2c.write_byte_data( .address、 0xf4 、 0x34 + ( .OSS << 6 )) = ( 2 + ( 3 << .OSS)) / 1000.0 time.sleep(delay) msb = .i2c.read_byte_data( .address、 0xf6 ) lsb = .i2c.read_byte_data( .address、 0xf7 ) xlsb = .i2c.read_byte_data( .address、 0xf8 ) アップ = (msb << 16 ) + (lsb << 8 ) + xlsbアップ = up>
>( 8 - .OSS) up def readPressure( ): アップ = .readUP() b6 = .b5 - 4000 x1 = ( .b2 * (b6 * b6)>> 12 )>> 11 x2 = ( .ac2 * b6)>> 11 x3 = x1 + x2 b3 = ((( .ac1 * 4 + x3)<> 2 x1 = ( .ac3 * b6)>> 13 x2 = ( .b1 * ((b6 * b6)>> 12 ))>> 16 x3 = ((x1 + x2) + 2 )>> 2 b4 = ( .ac4 * (x3 + 32768 ))>> 15 b7 = (up - b3) * ( 50000 >> .OSS) 場合 (b7 < 0x80000000 ): p = (b7 << 1 ) / b4 : p = (b7 / b4)<> 8 ) * (p>
> 8 ) x1 = (x1 * 3038 )>> 16 x2 = ( - 7357 * p)>> 16 p + = (x1 + x2 + 3791 )>> 4 p i2c = smbus.SMBus( 0 ) bmp085 = BMP085(i2c、 0x77 ) t = bmp085.readTemperature() p = bmp085.readPressure() "温度:%。2f C" % t "圧力:%。2f hPa" % (p / 100 ) 詳細:ラズベリーパイの読み取り値BMP085温度と圧力 製造プロセス