BMP180 leer datos y configurar
Datos técnicos
El sensor BMP180 es un sensor digital con comunicación I2C que mide la tempera, presión atmosférica y la altura. Utiliza una alimentación de 3.3V.- Temperatura: Tiene una precisión de ±0.5ºC y mide con un decimal. El rango de lectura es entre los 0 y 65ºC
- Presión: Tiene una precisión de ±0.12hPa y mide con dos decimales. El rango de lectura es entre los 300 y 1100hPa
- Ruta I2C: Este modelo solo tiene una ruta (0x77) por lo que no se pueden conectar varios del mismo tipo de una forma tradicional.
Cableado
El sensor a utilizar es el BMP180 tiene 4 pines y se conectan de la siguiente forma.
- Pin VIN: se conecta a un pin 3.3V de la Raspberry Pi.
- pin GND: se conecta a cualquier pin GND de la Raspberry Pi.
- Pin SCL: se conecta al pin SCL (GPIO 8) de la Raspberry Pi.
- Pin SDA: se conecta al pin SDA (GPIO 9) de la Raspberry Pi.
Quedando de el cableado de la siguiente forma:

Si prefieres verlo en su esquema te la dejo justo aquí.
Si estás siguiendo la guía completa podrás observar que se conecta igual que el sensor sht31. Todos los sensores I2C se conectan por SDA y SCL para hacer las trasmisiones de datos además de usar los dos pines de corriente y tierra.
Funcionamiento
Es necesario importar las librerías logging
y Adafruit_BMP
para la lectura y aviso de errores en este sensor.
El funcionamiento es el similar que el sensor sht31. Se llama al constructor de clase (BMP180). Este leerá los datos del sensor y guardará los datos de temperatura, presión y altura en la clase para devolverlos a la clase principal cuando este se los pida.
El sensor hace una lectura única. Esto quiere decir que solo se recogen valores cuando se llama al constructor y por lo tanto solo se lee el valor cuando el programa va a enviar los datos al servidor en vez de hacer una lectura continua y hacer una media.
Devolverá los tres parámetros sin decimales y en formato String para poder trabajar mejor con ellos posteriormente. En el caso de error de lectura tanto temperatura como humedad devolverán como valor -100.
Código
Test
Aquí dejo el script necesario para validar que se el sensor BMP180 funciona correctamente.
import Adafruit_BMP.BMP085 as BMP085
# Creamos el objeto BMP
sensor = BMP085.BMP085()
# Temperatura
print('Temp = {0:0.2f} *C'.format(sensor.read_temperature()))
# Presión
print('Pressure = {0:0.2f} Pa'.format(sensor.read_pressure()))
# Altitud
print('Altitude = {0:0.2f} m'.format(sensor.read_altitude()))
# Presión a nivel del mar
print('Sealevel Pressure = {0:0.2f} Pa'.format(sensor.read_sealevel_pressure()))
Clase
Ahora lo que se va a ahacer es automatizar el proceso de lectura de datos. A la hora de hacerlo vamos a tener varias cosas en cuenta:
- Se creará una clase para que sea más fácil trabar con el sensor.
- Se leereán los datos cada vez que se cree un objeto de esta clase.
- Se pasarán los datos al programa principal mediante metodos GET.
- Se hará captura de excepciones para no bloquear el programa en el caso de que el sensos dejede funcionar.
Teniendo todo lo anterior en cuenta esta parte del programa nos queda de la siguiente forma:
import Adafruit_BMP.BMP085 as BMP085 # Importamos la libreria BMP
import logging
class Bmp180: # Creamos una clase específica para el sensor
'''Lee todos los datos del sensor Bmp180'''
def __init__(self):
try:
sensor = BMP085.BMP085() # Creamos el constructor que lee los datos
# Se le suma 8 a la presión porque tras meses de pruebas se observa que
# el sensor venia mal calibrado.
self.atm = (sensor.read_pressure() / 100) + 8
self.temperatura = sensor.read_temperature()
self.altura = sensor.read_altitude()
# Recoge el error de lectura del canal SDA
except OSError:
logging.error('El sensor BMP180 ha dejado de funcionar.')
self.atm = -100
self.temperatura = -100
self.altura = -100
def get_presion(self):
'''Devuelve la presión en hPa sin decimales en String. Es necesario crear
un constructor Bmp180() para actualizar los datos'''
return str(round(self.atm))
def get_temperatura(self):
'''Devuelve la temperatura en ºC sin decimales en String. Es necesario crear
un constructor Bmp180() para actualizar los datos'''
return str(round(self.temperatura))
def get_altura(self):
'''Devuelve la altura en metros sin decimales en String. Es necesario
crear un constructor Bmp180() para actualizar los datos. La altura recibida
es muy inexacta.'''
return str(round(self.altura))