Panduan Integrasi Sensor Tekanan Barometrik BMP180 I2C dengan Raspberry Pi
Pendahuluan
BMP180 Bosch adalah sensor tekanan barometrik digital yang akurat tinggi yang berkomunikasi melalui I2C. Dalam panduan ini Anda akan mempelajari cara memasangnya ke Raspberry Pi, mengaktifkan bus I2C, dan membaca suhu dan tekanan dengan skrip Python siap pakai.
Ringkasan Modul
Modul ini adalah PCB kompak berukuran 15 × 13 mm dengan header 5 pin. Meskipun sebagian besar modul mengikuti urutan pin yang sama, periksa ulang label pada papan Anda sebelum menghubungkan.
Pinout & Kabel
Hubungkan modul ke header GPIO Pi (P1) seperti yang ditunjukkan di bawah ini. Diagram sederhana untuk pengaturan breadboard juga disertakan.
| PCB Modul |
Deskripsi |
Pin Header GPIO |
| VCC |
3.3 V |
P1-01 |
| GND |
Ground |
P1-06 |
| SCL |
Clock I2C |
P1-05 |
| SDA |
Data I2C |
P1-03 |
Dengan perangkat dinyalakan, menjalankan i2cdetect -y 1 seharusnya mengungkapkan alamat 0x77.
Mengaktifkan Bus I2C
Aktifkan I2C di Pi Anda (dinonaktifkan secara default) dengan menjalankan sudo raspi-config dan memilih Interface Options → I2C → Yes, lalu reboot.
Contoh Python
Skrip berikut menunjukkan cara membaca suhu (°C) dan tekanan (mbar) dari BMP180. Ini menggunakan data kalibrasi yang tersimpan pada sensor untuk menghasilkan hasil yang akurat.
#!/usr/bin/python
import smbus
import time
from ctypes import c_short
DEVICE = 0x77 # Alamat I2C default
bus = smbus.SMBus(1) # Pi 2 dan yang lebih baru menggunakan bus 1
def convertToString(data):
return str((data[1] + (256 * data[0])) / 1.2)
def getShort(data, index):
return c_short((data[index] << 8) + data[index + 1]).value
def getUshort(data, index):
return (data[index] << 8) + data[index + 1]
def readBmp180Id(addr=DEVICE):
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):
REG_CALIB = 0xAA
REG_MEAS = 0xF4
REG_MSB = 0xF6
REG_LSB = 0xF7
CRV_TEMP = 0x2E
CRV_PRES = 0x34
OVERSAMPLE = 3
cal = bus.read_i2c_block_data(addr, REG_CALIB, 22)
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)
X1 = ((UT - AC6) * AC5) >> 15
X2 = (MC << 11) / (X1 + MD)
B5 = X1 + X2
temperature = (B5 + 8) >> 4
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
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)
return temperature / 10.0, pressure / 100.0
def main():
chip_id, chip_version = readBmp180Id()
print("Chip ID :", chip_id)
print("Versi :", chip_version)
temperature, pressure = readBmp180()
print("Suhu :", temperature, "C")
print("Tekanan :", pressure, "mbar")
if __name__ == "__main__":
main()
Unduh & Jalankan
Simpan skrip langsung ke Pi Anda:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bmp180.py
Buat dapat dieksekusi dan jalankan:
chmod +x bmp180.py ./bmp180.py
Sumber Daya Lebih Lanjut
• Datasheet Resmi BMP180
• Panduan Referensi GPIO