sensor-ambiental-arduino-bme280

Sensor ambiental con Arduino y BME280

¿Qué es un BME280?

El sensor BME280 es un sensor ambiental del fabricante Bosch Sensortech que combina termómetro, barómetro e higrómetro en un único dispositivo que podemos emplear junto a un procesador como Arduino.

El BME280 está basado en el sensor BMP280, que como vimos en esta entrada es un termómetro y barómetro, pero añade las funciones de medición de humedad.

Las características en cuanto a medición de temperatura y presión atmosférica se mantienen respecto al BMP280, que recordemos es un rango de temperatura de -40 a + 85 °C con una precisión de ±1 °C y resolución 0,01 °C, y para presión 300-1100 hPa, precisión de ±1 Pa, y resolución de 0,18 Pa.

Respecto a su comportamiento como higrómetro, el BME280 tiene un rango de medición de humedad relativa de 0 a 100%, con una precisión de ±3% Pa y una resolución de 0.008%.

La comunicación con el módulo puede realizarse a través de I2C (hasta 3,4 MHz) o SPI (hasta 10 MHz), por lo que es muy sencillo conectarlo a un procesador como Arduino.

El BME280 tiene una tensión de funcionamiento de 3V3, aunque algunos módulos disponen de adaptación de nivel para alimentación y señales para ser compatible con 5V.

Precio

El BME 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.

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

arduino-bmp280-bme280-componente

Estar atentos a no comprar un BMP280, físicamente son idénticos. Son mucho más baratos, pero no disponen de medición de humedad.

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

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 BME280 usaremos la librería desarrollada por Adafruit, disponible en https://github.com/adafruit/Adafruit_BME280_Library.

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.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h>

Adafruit_BME280 bme; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();

void setup() {
  Serial.begin(9600);
  Serial.println(F("BME280 Sensor event test"));

  if (!bme.begin()) {
    Serial.println(F("No se ha encontrado el sensor BME280"));
    while (1) delay(10);
  }
  
  bme_temp->printSensorDetails();
  bme_pressure->printSensorDetails();
  bme_humidity->printSensorDetails();
}

void loop() {
  sensors_event_t temp_event, pressure_event, humidity_event;
  bme_temp->getEvent(&temp_event);
  bme_pressure->getEvent(&pressure_event);
  bme_humidity->getEvent(&humidity_event);
  
  Serial.print(F("Temperatura = "));
  Serial.print(temp_event.temperature);
  Serial.println(" *C");

  Serial.print(F("Humedad = "));
  Serial.print(humidity_event.relative_humidity);
  Serial.println(" %");

  Serial.print(F("Presion = "));
  Serial.print(pressure_event.pressure);
  Serial.println(" hPa");

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

Descarga el código

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