Sensor Barométrico BMP180 I2C – Guía de Integración con Raspberry Pi
Introducción
El BMP180 de Bosch es un sensor digital de presión barométrica de alta precisión que se comunica vía I2C. En esta guía aprenderá a conectarlo a una Raspberry Pi, habilitar el bus I2C y leer temperatura y presión con un script Python listo para usar.
Descripción del Módulo
El módulo es un PCB compacto de 15 × 13 mm con un header de 5 pines. Aunque la mayoría de módulos siguen el mismo orden de pines, verifique las etiquetas de su placa antes de conectar.
Pinout y Cableado
Conecte el módulo al header GPIO de la Pi (P1) como se muestra a continuación. También se incluye un diagrama sencillo para configuración en protoboard.
| PCB Módulo | Descripción | Pin Header GPIO |
|---|---|---|
| VCC | 3.3 V | P1‑01 |
| GND | Tierra | P1‑06 |
| SCL | Reloj I2C | P1‑05 |
| SDA | Datos I2C | P1‑03 |
Con el dispositivo alimentado, ejecutar i2cdetect -y 1 debería revelar la dirección 0x77.
Habilitando el Bus I2C
Habilite I2C en su Pi (está deshabilitado por defecto) ejecutando sudo raspi-config y seleccionando Interface Options → I2C → Yes, luego reinicie.
Ejemplo en Python
El siguiente script demuestra cómo leer temperatura (°C) y presión (mbar) del BMP180. Incorpora los datos de calibración almacenados en el sensor para ofrecer resultados precisos.
#!/usr/bin/python
import smbus
import time
from ctypes import c_short
DEVICE = 0x77 # Dirección I2C por defecto
bus = smbus.SMBus(1) # Pi 2 y posteriores usan 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("Version :", chip_version)
temperature, pressure = readBmp180()
print("Temperatura :", temperature, "°C")
print("Presión :", pressure, "mbar")
if __name__ == "__main__":
main()
Descarga y Ejecución
Guarde el script directamente en su Pi:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bmp180.py
Hágalo ejecutable y ejecútelo:
chmod +x bmp180.py ./bmp180.py
Recursos Adicionales
Proceso de manufactura
- Construya un registrador de temperatura con Raspberry Pi y sensor I2C de 5 $
- Cómo Conectar un Termómetro Digital DS18B20 One‑Wire a Raspberry Pi – Guía Paso a Paso
- Lectura de Sensor Hall Lineal con Raspberry Pi: Guía Java y Análisis del ADC0832
- Sensor de Luz Digital – Enciende un LED con Luz Ambiental usando Windows 10 IoT Core
- Entendiendo los Sensores Piezorresistivos: Conversión de Presión en Lecturas Electrónicas Precisas
- Infineon presenta XENSIV DPS368: Sensor barométrico ultracompacto de alta precisión
- Infineon presenta KP276: Sensor MAP digital turbo líder para eficiencia motor superior
- Sensores magnéticos Hall digitales: Fundamentos, diseño y aplicaciones automotrices
- MAXREFDES220# – Monitor de presión arterial sin manguito con sensores ópticos
- Bosch BMP390: Sensor de altitud 50% más preciso para smartphones, wearables y navegación interior
- Sensor de Presión Portátil de Metal Líquido Avanzado para Monitoreo de Salud Preciso