medir-temperatura-y-presion-barometrica-con-arduino-y-bmp280

Medir temperatura y presión barométrica con Arduino y BMP280

¿Qué es un BME280?

El BMP280 es un termómetro y barómetro digital del fabricante Bosch Sensortech, que permite realizar lecturas de temperatura, presión atmosférica, y estimación de altitud sobre el nivel del mar.

El BMP280 es un reemplazo de mayor precisión a los anteriores BMP180 y BMP085, menor consumo y menor tamaño, a la vez que mantiene su bajo coste, incluso inferior a los modelos anteriores.

Los rangos de medición se mantienen respecto al BMP180 y precisiones se mantienen respecto al BMP180. Para temperatura el rango es de es de -40º a 85ºC, con una precisión de ±1.0C.

Para presión atmosférica / altímetro es de 300hPa a 1110 hPa, equivalente a una altitud de -500m a 9000m sobre el nivel del mar. Con una precisión absoluta de ±1.0C y de 1.0 hPa, y la relativa de 0.12 hPa, equivalente a una precisión en altitud de aproximadamente ±1m.

Por su parte, la resolución de la medición mejora sustancialmente, pasando a 0.01ºC (desde 0.1ºC en el BMP180) en mediciones de temperatura, y 0.16 Pa (desde 1 Pa en el BMP180).

Por otro lado, el tamaño del BMP280 es un 63% más pequeño que el BMP180. El consumo también mejora, pasando de 12 µA a 2.7 µA para mediciones a 1Hz.

El BMP280 incorpora comunicación I2C y SPI, por lo que es muy sencillo conectarlo a un procesador como Arduino. En comparación, el modelo anterior sólo disponía de I2C.

La tensión de alimentación es 1.8 a 3.6V, y es posible encontrarlo tanto en módulos de 3V3 como en módulos de 5V, que incorporan la adaptación de nivel necesaria.

Precio

El BMP280 es un sensor bastante barato, si consideramos que dispone de medición de temperatura, humedad y presión en el mismo dispositivo. El precio suele ser menor en los módulos de 3V3, respecto a los que permiten tanto 3V3/5V.

arduino-bmp280-bme280-componente

Podemos encontrar un BMP280 compatible 3V3/5V por unos 1.20€, en vendedores internacionales en eBay o AliExpress.

Esquema de montaje

La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del BMP280.

arduino-bmp280-bme280-esquema

Mientras que la conexión vista desde el lado de Arduino quedaría así.

arduino-bmp280-bme280-conexion

La dirección del bus cambia según el estado lógico del pin SDO, y si se deja desconectado la dirección queda indeterminada, por lo que puede parecer que no funciona correctamente.

SDOI2C Address
GND0x76
3V30x77

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.

Verificar que vuestra placa es compatible con 5V antes de conectarla a Arduino. Si no, tendréis que usar un adaptador de nivel lógico.

Ejemplos de código

Para realizar la lectura del BMP280 usaremos la librería desarrollada por Adafruit, disponible en https://github.com/adafruit/Adafruit_BMP280_Library.

En la librería desarrollada por Adafruit, el bus I2C utiliza por defecto la dirección (0x77), para modificarlo hay que editar el fichero “Adafruit_BMP280.h” y en la linea 37 #define BMP280_ADDRESS (0x77) cambiamos la dirección (0x76).

La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos, por ejemplo, son modificaciones están basados a partir de los disponibles en la librería.

Obtener los valores de temperatura, humedad y presión

El este ejemplo se obtiene la medición de los valores en bruto (RAW) de temperatura, humedad y presión, y los muestra en la pantalla. Estos valores son de utilidad, por ejemplo, para hacer una estación meteorológica.

Adafruit_BMP280 bmp;

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Modo de operación */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Presion oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtrado. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Tiempo Standby. */
}

void loop() 
{
    Serial.print(F("Temperatura = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");

    Serial.print(F("Presión = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Altitud = "));
    Serial.print(bmp.readAltitude(1013.25));
    Serial.println(" m");

    Serial.println();
    delay(2000);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full