Raspberry Pi BMP085: Leituras Precisas de Temperatura e Pressão via I2C
O Bosch BMP085 é um sensor I2C compacto e de baixo custo que entrega medições precisas de pressão barométrica e temperatura. Adquirido no eBay por alguns dólares, é componente ideal para estações meteorológicas, loggers de altitude ou qualquer projeto que precise de dados ambientais confiáveis.
Embora o guia BMP085 da Adafruit e biblioteca forneçam solução turnkey, mergulhar no código dá insight mais profundo nas fórmulas de compensação que transformam dados brutos do sensor em valores legíveis. Abaixo, combino referência Adafruit com minha própria implementação Python para demonstrar exatamente como o sensor funciona.
- Tutorial Bus Pirate do Maarten Damen (arquivado) – excelente diagnóstico I2C.
- Port Python do código C do John Burn – repositório GitHub.
Fiação do BMP085 ao Raspberry Pi é direta: conecte VCC a 3.3 V, GND a ground, SDA ao GPIO2 e SCL ao GPIO3. O endereço I2C é 0x77 por padrão.
# Endereço I2C BMP085 BMP085_ADDR = 0x77 Implementação Python
import smbus import time class BMP085: # Configuração oversampling (0–3). 3 dá melhor precisão. OSS = 3 def __init__(self, i2c, address=BMP085_ADDR): self.i2c = i2c self.address = address # Coeficientes de calibração – lidos do EEPROM uma vez. self.ac1 = self._read_signed(0xAA) self.ac2 = self._read_signed(0xAC) self.ac3 = self._read_signed(0xAE) self.ac4 = self._read_unsigned(0xB0) self.ac5 = self._read_unsigned(0xB2) self.ac6 = self._read_unsigned(0xB4) self.b1 = self._read_signed(0xB6) self.b2 = self._read_signed(0xB8) self.mb = self._read_signed(0xBA) self.mc = self._read_signed(0xBC) self.md = self._read_signed(0xBE) def _read_unsigned(self, reg): msb = self.i2c.read_byte_data(self.address, reg) lsb = self.i2c.read_byte_data(self.address, reg + 1) return (msb << 8) + lsb def _read_signed(self, reg): val = self._read_unsigned(reg) return val - 65536 if val > 32767 else val def _read_ut(self): # Trigger medição temperatura self.i2c.write_byte_data(self.address, 0xF4, 0x2E) time.sleep(0.0045) return self._read_unsigned(0xF6) def read_temperature(self): ut = self._read_ut() x1 = ((ut - self.ac6) * self.ac5) >> 15 x2 = (self.mc << 11) // (x1 + self.md) self.b5 = x1 + x2 temp = (self.b5 + 8) >> 4 # em 0.1°C return temp / 10.0 def _read_up(self): # Trigger medição pressão com OSS selecionado cmd = 0x34 + (self.OSS << 6) self.i2c.write_byte_data(self.address, 0xF4, cmd) delay = (2 + (3 << self.OSS)) / 1000.0 time.sleep(delay) msb = self.i2c.read_byte_data(self.address, 0xF6) lsb = self.i2c.read_byte_data(self.address, 0xF7) xlsb = self.i2c.read_byte_data(self.address, 0xF8) up = ((msb << 16) + (lsb << 8) + xlsb) >> (8 - self.OSS) return up def read_pressure(self): up = self._read_up() b6 = self.b5 - 4000 x1 = (self.b2 * (b6 * b6) >> 12) >> 11 x2 = (self.ac2 * b6) >> 11 x3 = x1 + x2 b3 = (((self.ac1 * 4 + x3) << self.OSS) + 2) >> 2 x1 = (self.ac3 * b6) >> 13 x2 = (self.b1 * (b6 * b6) >> 12) >> 16 x3 = ((x1 + x2) + 2) >> 2 b4 = (self.ac4 * (x3 + 32768)) >> 15 b7 = (up - b3) * (50000 >> self.OSS) if b7 < 0x80000000: p = (b7 * 2) // b4 else: p = (b7 // b4) << 1 p = ((p + 1) * 1) >> 1 x1 = (p >> 8) * (p >> 8) x1 = (x1 * 3038) >> 16 x2 = (-7357 * p) >> 16 p = p + ((x1 + x2 + 3791) >> 4) return p # em Pa # Exemplo de uso bus = smbus.SMBus(1) # Barramento I2C Raspberry Pi bmp = BMP085(bus) print(f"Temperature: {bmp.read_temperature():.2f} °C") print(f"Pressure: {bmp.read_pressure() / 100:.2f} hPa") O script executa a rotina completa de calibração conforme descrito no datasheet BMP085 da Bosch. Rodar o programa imprime temperatura em Celsius e pressão em hectopascals, pronto para uso em qualquer aplicação Python.
Por Que Construir o Seu Próprio?
Usar a biblioteca Adafruit economiza tempo, mas entender a matemática por trás do sensor capacita você a ajustar taxas de amostragem, lidar com streams de dados brutos ou portar código para outros microcontroladores. Seja você hobbyist ou engenheiro experiente, dominar os internos do BMP005 adiciona habilidade valiosa ao seu toolkit.
Processo de manufatura
- Construa um Registrador de Temperatura com Raspberry Pi e Sensor I2C de $5
- Perfilamento de Temperatura Preciso no Raspberry Pi com Python, SQLite e LabVIEW
- Conecte Múltiplos Sensores DS18B20 1-Wire ao Raspberry Pi para Monitoramento Preciso de Temperatura
- Monitor de Temperatura e Umidade em Rede com Raspberry Pi – Guia DIY de Configuração
- Como Ler Temperatura com DS18B20 no Raspberry Pi 2
- Monitoramento Profissional de Temperatura com Raspberry Pi e DS18B20
- Medição de Temperatura no Raspberry Pi com Sensores Maxim 1‑Wire e Bridge I2C DS2482
- Sensor de Temperatura Infravermelho TMP006 com Raspberry Pi: Biblioteca Python e Guia de Configuração
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
- Monitoramento Contínuo de Temperatura e Umidade no Raspberry Pi com EzTemp