BMP180 I2C 기압 센서 – 라즈베리 파이 연동 가이드
소개
보쉬(Bosch) BMP180은 I2C로 통신하는 고정밀 디지털 기압 센서입니다. 이 가이드에서는 라즈베리 파이에 연결하고 I2C 버스를 활성화하며, 즉시 실행 가능한 파이썬 스크립트로 온도와 기압을 읽는 방법을 배웁니다.
모듈 개요
모듈은 5핀 헤더가 있는 15×13mm의 컴팩트한 PCB입니다. 대부분의 모듈이 동일한 핀 순서를 따르지만, 연결 전 보드의 라벨을 다시 확인하세요.
핀아웃 및 배선
아래와 같이 모듈을 파이의 GPIO 헤더(P1)에 연결합니다. 브레드보드 설정용 간단한 다이어그램도 포함되어 있습니다.
| 모듈 PCB |
설명 |
GPIO 헤더 핀 |
| VCC | 3.3V | P1-01 |
| GND | 접지 | P1-06 |
| SCL | I2C 클럭 | P1-05 |
| SDA | I2C 데이터 | P1-03 |
장치에 전원을 공급한 상태에서 i2cdetect -y 1을 실행하면 주소 0x77이 표시되어야 합니다.
I2C 버스 활성화
파이에서 I2C를 활성화합니다(기본적으로 비활성화됨):
sudo raspi-config
Interface Options → I2C → Yes를 선택한 후 재부팅합니다.
파이썬 예제
다음 스크립트는 BMP180에서 온도(°C)와 기압(mbar)을 읽는 방법을 보여줍니다. 센서에 저장된 보정 데이터를 활용해 정확한 결과를 제공합니다.
#!/usr/bin/python
import smbus
import time
from ctypes import c_short
DEVICE = 0x77 # 기본 I2C 주소
bus = smbus.SMBus(1) # 파이 2 이상은 버스 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("Version :", chip_version)
temperature, pressure = readBmp180()
print("Temperature :", temperature, "C")
print("Pressure :", pressure, "mbar")
if __name__ == "__main__":
main()
다운로드 및 실행
스크립트를 파이에 직접 저장합니다:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bmp180.py
실행 권한 부여 후 실행:
chmod +x bmp180.py
./bmp180.py
추가 자료