Arduino

Aansluiten van een BME280 Sensor op Arduino met behulp van I2C

Laatst bijgewerkt: 14/03/2021

Overzicht

De BME280 van Bosch Sensortec is een geïntegreerde omgevingssensor die is ontworpen voor de mobiele markt. Het ontwerp met een laag stroomverbruik combineert hoge lineariteit en hoge nauwkeurigheidssensoren voor druk, vochtigheid en temperatuur.

De BME280 ondersteunt een SPI of I2C interface om met de microcontroller te communiceren.

Vanwege de kleine omvang van de sensor, is de beste manier om deze sensor te gebruiken met een breakout bord. Het breakout bord van Adafruit wordt hier gebruikt.

In deze aansluiting verbinden we slechts één apparaat met de Arduino via de I2C bus. We kunnen elk adres (0x77 of 0x76) gebruiken. Het leest de barometrische druk, vochtigheid en temperatuur en geeft dit weer op de console.

De BME280 Module

Datasheet

Bedrading van de BME280 sensor

We kunnen de sensor bedraden met behulp van de SPI of I2C bus. De SPI bus heeft 4 draden plus voeding en aarde nodig. De I2C bus heeft slechts 2 draden plus voeding en aarde nodig. Beide kunnen worden bedraad met 5V of 3,3V als stroombron, aangezien de breakout kaart een vermogensregelaar aan boord heeft om deze te regelen tot 3,3 V voor de sensor.

Aansluitschema voor Adafruit BME280 breakoutboard naar Arduino met SPI

Voor aansluitingsdetails met behulp van de SPI bus (inclusief schets en bibliotheek) klikt u op deze link.

Aansluitschema voor Adafruit BME280 breakout board met I2C en standaard adres (0x77)

Als we de I2C bus gebruiken, kan de sensor een van de twee adressen gebruiken om mee te communiceren. De standaardwaarde is 0x77. Het adres wordt ingesteld door de spanning die op de SDO pin wordt toegepast. Het Adafruit bord heeft een pullup weerstand op de breakout kaart die de pin hoog trekt en het standaardadres instelt op 0x77. Het alternatief is om de pin naar de grond te trekken en dit zal het adres op 0x76 zetten.

Pinout van de module voor adres 0x77

BME280 Uno / Nano Mego Leonardo
SCK A5 21 21
SDI A4 20 20
VCC 5V 5V 5V
GND Gnd Gnd Gnd

Pinout van de module voor alternatief adres 0x76

BME280 Uno / Nano Mego Leonardo
SCK A5 21 21
SDI A4 20 20
SDO Gnd Gnd Gnd
VCC 5V 5V 5V
GND Gnd Gnd Gnd

Noodzakelijke bibliotheken installeren

Communiceren met een BME280 module is een hoop werk. Gelukkig is de Adafruit BME280 Library geschreven om alle complexiteit weg te werken, zodat we eenvoudige commando's kunnen geven om de temperatuur, relatieve vochtigheid en luchtdrukgegevens te lezen.

Om de bibliotheek te installeren, gaat u naar Schets > Bibliotheek opnemen > Bibliotheken beheren. Wacht tot Library Manager de index van de bibliotheken downloadt en de lijst met geïnstalleerde bibliotheken bijwerkt.

Filter uw zoekopdracht door bme280 te typen. Er zouden een paar mogelijkheden moeten zijn. Zoek naar Adafruit BME280 Library. Klik op dat item en selecteer vervolgens Installeren.

De BME280 sensorbibliotheek gebruikt de Adafruit Sensor ondersteunings backend. Dus, zoek in de bibliotheek manager naar Adafruit Unified Sensor en installeer dat ook (mogelijk moet je een beetje scrollen)

Arduino Code Uitlezing temperatuur, relatieve vochtigheid en luchtdruk

De volgende schets geeft u volledig inzicht in hoe de temperatuur, relatieve vochtigheid en luchtdruk van de BME280 module te lezen en kan als basis dienen voor meer praktische experimenten en projecten.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
void setup() {
Serial.begin(9600);
if (!bme.begin(0x77)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
}
}
void loop() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println("*C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println("hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println("m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println("%");
Serial.println();
delay(1000);
}

Zo ziet de uitvoer eruit in de seriële monitor.

Code Uitleg

De schets begint met het opnemen van drie bibliotheken namelijk. Wire.h, Adafruit_Sensor.h en Adafruit_BME280.h .

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

Vervolgens definiëren we de SEALEVELPRESSURE_HPA variabele die nodig is om de hoogte te berekenen en een object van de Adafruit_BME280 bibliotheek te maken, zodat we toegang hebben tot functies die ermee verband houden.

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

In het setup gedeelte van de code initialiseren we de seriële communicatie met de pc en roepen we de begin() functie aan.

De begin(I2C_ADDR) functie neemt het I2C adres van de module als parameter. Als uw module een ander I2C adres heeft of u hebt dit gewijzigd , moet u dit correct opgeven. Deze functie initialiseert de I2C interface met het opgegeven I2C adres en controleert of de chip ID correct is. Het reset vervolgens de chip met behulp van soft reset en wacht op de sensor voor kalibratie na activering.

Serial.begin(9600);
if (!bme.begin(0x77)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
};

In het loop gedeelte van de code gebruiken we de volgende functies om temperatuur, relatieve vochtigheid en luchtdruk van de BME280 module te lezen.

De functie readTemperature() retourneert de temperatuur van de sensor.

De functie readPressure() retourneert de barometerdruk van de sensor.

De functie readAltitude(SEALEVELPRESSURE_HPA) berekent de hoogte (in meters) van de opgegeven atmosferische druk (in hPa) en luchtdruk op zeeniveau (in hPa).

De functie readHumidity() retourneert de relatieve vochtigheid van de sensor.

Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println("*C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println("hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println("m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println("%");