Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| Adafruit BMP280 | × | 1 |
| Adafruit OLED 128x32 I2C | × | 1 |
Over dit project
Welkom bij deze tutorial waarin we de BMP280-sensor gebruiken om temperatuur, luchtdruk en hoogte te meten met behulp van een Arduino UNO en een OLED-display. Hier zijn de belangrijkste specificaties van de BMP280 volgens de datasheet:

In dit project meten we alle parameters in zowel het metrieke als het imperiale stelsel. De eenheden kunnen in de code worden aangepast. Hieronder volgen de gebruikte componenten:

Testen en probleemoplossing
Na het aansluiten van de module is het raadzaam de voorbeeldcode uit de bibliotheek ("BMP280test") te testen. Als de module niet wordt herkend (zoals in de onderstaande afbeelding):

Voer dan de I²C-scanner code uit (los eventuele andere I²C-apparaten zoals LCD of OLED los). Als de module niet defect is en geen soldeerproblemen heeft, zal de scanner het apparaat detecteren:

Noteer het adres (in dit voorbeeld 0x76) en open het C++-bestand van de bibliotheek (meestal in Documenten/Arduino/Libraries). Gebruik een geschikte editor (bijv. Dev-C++).


Ga naar regel 41 en wijzig het I²C-adres (_i2caddr) naar het adres dat je in de seriële monitor vond (vervang de "a" door het juiste adres):

Sla op en sluit de editor. De bibliotheek is standaard bedoeld voor modules met adres 0x77, maar de gebruikte module heeft adres 0x76. Nu zou de testcode moeten werken:

Testafbeeldingen


Ik hoop dat het voor jou ook werkt. Laat een reactie achter als je problemen ondervindt.
Code
Er zijn vier codebestanden beschikbaar voor verschillende configuraties:
- bmp280_Serial_metric.ino – Metrische weergave op seriële monitor
- bmp280_Serial_Imperial.ino – Imperiale weergave op seriële monitor
- bmp280_OLED_m.ino – Metrische weergave op OLED
- bmp280_OLED_US.ino – Imperiale weergave op OLED
bmp280_Serial_metric.ino
/* Deze code is voor gebruik met Adafruit BMP280 (Metrisch)
* Meet temperatuur en druk en toont ze op de seriële monitor met hoogte
* Gewijzigde versie van de Adafruit-voorbeeldcode
* Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C-interface
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Geen geldige BMP280-sensor gevonden, check bedrading!"));
while (1);
}
/* Standaardinstellingen uit datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Bedrijfsmodus */
Adafruit_BMP280::SAMPLING_X2, /* Temperatuur oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Druk oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering */
Adafruit_BMP280::STANDBY_MS_500); /* Wachttijd */
}
void loop() {
Serial.print(F("Temperatuur = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Druk = "));
Serial.print(bmp.readPressure()/100); // Druk in hPa
Serial.println(" hPa");
Serial.print(F("Benaderende hoogte = "));
Serial.print(bmp.readAltitude(1019.66)); // 1019.66 hPa = luchtdruk op zeeniveau in jouw regio
Serial.println(" m");
Serial.println();
delay(2000);
}
bmp280_Serial_Imperial.ino
/* Deze code is voor gebruik met Adafruit BMP280 (Imperiaal)
* Meet temperatuur en druk en toont ze op de seriële monitor met hoogte
* Gewijzigde versie van de Adafruit-voorbeeldcode
* Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Geen geldige BMP280-sensor gevonden, check bedrading!"));
while (1);
}
/* Standaardinstellingen uit datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
float f = bmp.readTemperature()*9/5 + 32; // Conversie van C naar F
Serial.print(F("Temperatuur = "));
Serial.print(f);
Serial.println(" *F");
float P = bmp.readPressure()/3386.39; // Druk in inches mercury
Serial.print(F("Druk = "));
Serial.print(P);
Serial.println(" inHg");
float A = bmp.readAltitude(1019.66)*3.28084; // Hoogte in voet
Serial.print(F("Benaderende hoogte = "));
Serial.print(A);
Serial.println(" ft");
Serial.println();
delay(2000);
}
bmp280_OLED_m.ino (Metrisch)
/* Deze code is voor gebruik met Adafruit BMP280 en OLED-scherm (Metrisch)
* Meet temperatuur en druk en toont ze op het OLED-display met hoogte
* Gewijzigde versie van de Adafruit-voorbeeldcode
* Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature(); // Temperatuur in °C
float P = bmp.readPressure()/100; // Druk in hPa
float A = bmp.readAltitude(1019.66); // Hoogte in meters
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("C");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Druk");
display.setCursor(65,10);
display.print(P);
display.setCursor(110,10);
display.print("hPa");
display.setCursor(65,25);
display.print("Hoogte");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("m");
display.display();
delay(2000);
}
bmp280_OLED_US.ino (Imperiaal)
/* Deze code is voor gebruik met Adafruit BMP280 en OLED-scherm (Imperiaal)
* Meet temperatuur en druk en toont ze op het OLED-display met hoogte
* Gewijzigde versie van de Adafruit-voorbeeldcode
* Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature()*9/5 + 32; // Temperatuur in °F
float P = bmp.readPressure()/3386.39; // Druk in inHg
float A = bmp.readAltitude(1019.66)*3.28084; // Hoogte in voet
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("F");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Druk");
display.setCursor(65,10);
display.print(P);
display.setCursor(100,10);
display.print("inHg");
display.setCursor(65,25);
display.print("Hoogte");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("ft");
display.display();
delay(2000);
}
Nuttige bibliotheken
Schema
Beide modules gebruiken de I²C-interface (SDA/SCL op A4 en A5). De BMP280 wordt gevoed met 5V, de OLED met 3,3V.

Productieproces
- Geïntegreerde QR, RFID en Temperatuurverificatie Toegangscontrolesysteem
- Meerdere DS18B20 1-Wire Sensoren Aan Een Raspberry Pi Koppelen Voor Nauwkeurige Temperatuurmonitoring
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- Naadloze temperatuur- en vochtigheidsbewaking op Raspberry Pi met EzTemp
- DIY thuisbrouw temperatuurcontrole: Monitoren & regelen met Arduino
- Raspberry Pi BMP085: Accurate temperatuur- en drukmetingen via I2C
- Precieze thermocouple-metingen en logging voor lab- en wetenschappelijke experimenten
- Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
- Precisie druk- en luchtstroommeting met analoge sensor en Arduino
- Arduino temperatuur- en vochtigheidslogger met DHT11 en Ethernet Shield
- Nauwkeurige Frequentie- en Duty Cycle-meting met Arduino UNO