曾經實做過Arduino讀取 BMP180的溫度、大氣壓力及海拔高度: Arduino筆記(70):溫度氣壓傳感器模組 BMP180 (GY68) 。本篇先從實做樹莓派讀取感測器的值,顯示在終端視窗上。下一篇會實做將讀到值要送到 Line Notify中,直接從 Line 中看到相關的感測值。
BMP180 是Bosch Sensortec 新推出的數字氣壓傳感器,性能非常高,可用於智能手機,平板電腦和運動設備等高級移動設備。像大多數壓力傳感器一樣,BMP180可以測量絕對壓力,這是設備看到的實際環境壓力,隨海拔高度和天氣而變化。[材料]
- Raspberry Pi x 1
- BMP180 (GY68) x 1
- 連接線 x 4條
[接線圖]
Raspberry Pi 與BMP180接腳的對應關係:
Pi 接腳 | BMP180 |
---|---|
Pin 1(+3.3V) | VCC |
Pin 6(GND) | GND |
Pin 3 SDA GPIO2 | SDA |
Pin 5 SCL GPIO3 | SCL |
[程式]
# !/usr/bin/python # coding:utf-8 import smbus import time from ctypes import c_short DEVICE = 0x77 # 預設 I2C 位址 #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def convertToString(data): # Simple function to convert binary data into a string return str((data[1] + (256 * data[0])) / 1.2) def getShort(data, index): # return two bytes from data as a signed 16-bit value return c_short((data[index] << 8) + data[index + 1]).value def getUshort(data, index): # return two bytes from data as an unsigned 16-bit value return (data[index] << 8) + data[index + 1] def readBmp180Id(addr=DEVICE): # Register Address REG_ID = 0xD0 (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) return (chip_id, chip_version) def readBmp180(addr=DEVICE): # Register Addresses REG_CALIB = 0xAA REG_MEAS = 0xF4 REG_MSB = 0xF6 REG_LSB = 0xF7 # Control Register Address CRV_TEMP = 0x2E CRV_PRES = 0x34 # Oversample setting OVERSAMPLE = 3 # 0 - 3 # Read calibration data # Read calibration data from EEPROM cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) # Convert byte data to word values AC1 = getShort(cal, 0) AC2 = getShort(cal, 2) AC3 = getShort(cal, 4) AC4 = getUshort(cal, 6) AC5 = getUshort(cal, 8) AC6 = getUshort(cal, 10) B1 = getShort(cal, 12) B2 = getShort(cal, 14) MB = getShort(cal, 16) MC = getShort(cal, 18) MD = getShort(cal, 20) # 讀取溫度 bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) time.sleep(0.005) (msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) UT = (msb << 8) + lsb # 讀取壓力 bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) time.sleep(0.04) (msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) # Refine temperature X1 = ((UT - AC6) * AC5) >> 15 X2 = (MC << 11) / (X1 + MD) B5 = X1 + X2 temperature = (B5 + 8) >> 4 # Refine pressure B6 = B5 - 4000 B62 = B6 * B6 >> 12 X1 = (B2 * B62) >> 11 X2 = AC2 * B6 >> 11 X3 = X1 + X2 B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 X1 = AC3 * B6 >> 13 X2 = (B1 * B62) >> 16 X3 = ((X1 + X2) + 2) >> 2 B4 = (AC4 * (X3 + 32768)) >> 15 B7 = (UP - B3) * (50000 >> OVERSAMPLE) P = (B7 * 2) / B4 X1 = (P >> 8) * (P >> 8) X1 = (X1 * 3038) >> 16 X2 = (-7357 * P) >> 16 pressure = P + ((X1 + X2 + 3791) >> 4) # 計算高度 altitude = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0/5.255))) return (temperature/10.0,pressure/ 100.0,round(altitude,2)) def main(): (chip_id, chip_version) = readBmp180Id() print "Chip ID :", chip_id print "Version :", chip_version,"\n" # 連續偵測 5次 for i in range(0,5): (temperature,pressure,altitude)=readBmp180() print "溫度 :", temperature, "C" print "壓力 :", pressure, "mbar" print "高度 :", altitude, "m\n" time.sleep(2) if __name__=="__main__": main() time.sleep(2)
[執行結果]
[參考資料]
- Home Temperature Monitoring Using Raspberry Pi and Thingspeak
- BMP180 Digital Pressure Sensor with Raspberry Pi
張貼留言