import time
from machine import Pin, I2C
# BMP180 constants
BMP180_ADDR = 0x77 # Default I2C address for BMP180 sensor
CONTROL_REG = 0xF4
RESULT_REG = 0xF6
# BMP180 Commands
TEMPERATURE_CMD = 0x2E
PRESSURE_CMD = 0x34
class BMP180:
def __init__(self, i2c):
self.i2c = i2c
self.addr = BMP180_ADDR
# Read calibration data from the sensor
self.ac1 = self._read_signed_int16(0xAA)
self.ac2 = self._read_signed_int16(0xAC)
self.ac3 = self._read_signed_int16(0xAE)
self.ac4 = self._read_unsigned_int16(0xB0)
self.ac5 = self._read_unsigned_int16(0xB2)
self.ac6 = self._read_unsigned_int16(0xB4)
self.b1 = self._read_signed_int16(0xB6)
self.b2 = self._read_signed_int16(0xB8)
self.mb = self._read_signed_int16(0xBA)
self.mc = self._read_signed_int16(0xBC)
self.md = self._read_signed_int16(0xBE)
def _read_signed_int16(self, reg):
data = self.i2c.readfrom_mem(self.addr, reg, 2)
return (data[0] << 8) + data[1] if data[0] >= 0x80 else (data[0] << 8) + data[1]
def _read_unsigned_int16(self, reg):
data = self.i2c.readfrom_mem(self.addr, reg, 2)
return (data[0] << 8) + data[1]
def _write(self, reg, value):
self.i2c.writeto_mem(self.addr, reg, bytearray([value]))
def _read_temperature(self):
self._write(CONTROL_REG, TEMPERATURE_CMD)
time.sleep(0.005) # Wait for conversion
msb, lsb = self.i2c.readfrom_mem(self.addr, RESULT_REG, 2)
ut = (msb << 8) + lsb
x1 = ((ut - self.ac6) * self.ac5) >> 15
x2 = (self.mc << 11) // (x1 + self.md)
b5 = x1 + x2
temperature = (b5 + 8) >> 4
return temperature
def _read_pressure(self):
self._write(CONTROL_REG, PRESSURE_CMD)
time.sleep(0.026) # Wait for conversion
msb, lsb, xlsb = self.i2c.readfrom_mem(self.addr, RESULT_REG, 3)
up = (msb << 16) + (lsb << 8) + xlsb
up >>= 8 # Adjust for MSB
return up
def get_temperature(self):
temperature = self._read_temperature()
return temperature / 10.0 # Convert to Celsius
def get_pressure(self):
pressure = self._read_pressure()
return pressure # Return pressure in Pa
def get_altitude(self, pressure):
# Assume sea-level pressure of 1013.25 hPa
return 44330 * (1 - (pressure / 101325) ** 0.1903)
# Set up I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # Adjust the pins for your ESP32 setup
# Initialize BMP180 sensor
bmp = BMP180(i2c)
# Main loop
while True:
# Read temperature and pressure
temp = bmp.get_temperature()
pressure = bmp.get_pressure()
altitude = bmp.get_altitude(pressure)
# Print results
print("Temperature: {:.2f} C".format(temp))
print("Pressure: {:.2f} Pa".format(pressure))
print("Altitude: {:.2f} meters".format(altitude))
time.sleep(2) # Wait 2 seconds before the next reading