Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Präzise Temperatur-, Druck- und Höhenmessung mit BMP280 und Arduino UNO

Komponenten und Materialien

Komponente Anzahl
Arduino UNO 1
Adafruit BMP280 Sensor 1
Adafruit OLED 128x32 I2C Display 1

Projektübersicht

In diesem Tutorial zeigen wir, wie Sie mit dem BMP280-Sensor Temperatur, Luftdruck und Höhe messen können – unterstützt von einem Arduino UNO und einem OLED-Display. Der BMP280 ist ein hochpräziser Barometer-Sensor mit folgenden Schlüsselspezifikationen laut Datenblatt:

Das Projekt deckt sowohl metrische als auch imperiale Einheiten ab. Die Umrechnung erfolgt direkt im Code. Im Folgenden finden Sie die Verdrahtung, den Programmcode und Tipps zur Fehlerbehebung.

Verdrahtung (Schaltplan)

Beide Module nutzen die I2C-Schnittstelle:

Hinweis: Der BMP280 wird mit 5 V betrieben (auf dem Modul befindet sich ein Spannungsregler), das OLED-Display benötigt 3,3 V.

Test und Fehlerbehebung

Nach dem Verdrahten empfiehlt es sich, zunächst das Bibliotheks-Beispiel BMP280test auszuführen. Wird der Sensor nicht erkannt (Fehlermeldung „Could not find a valid BMP280 sensor“), liegt oft eine abweichende I2C-Adresse vor.

I2C-Adresse ermitteln

  1. Trennen Sie alle anderen I2C-Geräte (z. B. OLED).
  2. Laden Sie einen I2C-Scanner-Sketch auf den Arduino.
  3. Öffnen Sie den Seriellen Monitor (9600 Baud). Der Scanner zeigt die gefundene Adresse an (typischerweise 0x76 oder 0x77).

Bibliothek anpassen

Die Adafruit-BMP280-Bibliothek ist standardmäßig auf Adresse 0x77 eingestellt. Falls Ihr Modul 0x76 verwendet, müssen Sie die Datei Adafruit_BMP280.cpp im Bibliotheksordner (Dokumente/Arduino/libraries/Adafruit_BMP280_Library) anpassen:

// Zeile ~41 ändern:
_i2caddr = 0x76; // statt 0x77

Speichern Sie die Datei, starten Sie die Arduino-IDE neu und führen Sie den Test erneut aus.

Programmcode

Vier Sketches stehen zur Verfügung – jeweils für serielle Ausgabe oder OLED-Display, in metrischen oder imperialen Einheiten.

1. Serielle Ausgabe – Metrisch (°C, hPa, m)

/* BMP280 Serielle Ausgabe (Metrisch)
 * Misst Temperatur, Druck und Höhe
 * Angepasstes Adafruit-Beispiel
 */
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // I2C-Schnittstelle

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

  if (!bmp.begin()) {
    Serial.println(F("Kein gültiger BMP280 Sensor gefunden, Verdrahtung prüfen!"));
    while (1);
  }

  // Standard-Einstellungen laut Datenblatt
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                  Adafruit_BMP280::SAMPLING_X2,   // Temp. Oversampling
                  Adafruit_BMP280::SAMPLING_X16,  // Druck Oversampling
                  Adafruit_BMP280::FILTER_X16,    // Filterung
                  Adafruit_BMP280::STANDBY_MS_500); // Standby-Zeit
}

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

  Serial.print(F("Druck = "));
  Serial.print(bmp.readPressure() / 100.0); // Umrechnung in hPa
  Serial.println(" hPa");

  Serial.print(F("Ca. Höhe = "));
  Serial.print(bmp.readAltitude(1019.66)); // Meeresspiegeldruck in hPa anpassen!
  Serial.println(" m");

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

2. Serielle Ausgabe – Imperial (°F, inHg, ft)

/* BMP280 Serielle Ausgabe (Imperial) */
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 Test"));
  if (!bmp.begin()) {
    Serial.println(F("Kein gültiger BMP280 Sensor gefunden!"));
    while (1);
  }
  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 tempF = bmp.readTemperature() * 9.0 / 5.0 + 32.0;
  float pressureInHg = bmp.readPressure() / 3386.39;
  float altitudeFt = bmp.readAltitude(1019.66) * 3.28084;

  Serial.print(F("Temperatur = "));
  Serial.print(tempF);
  Serial.println(" °F");

  Serial.print(F("Druck = "));
  Serial.print(pressureInHg);
  Serial.println(" inHg");

  Serial.print(F("Ca. Höhe = "));
  Serial.print(altitudeFt);
  Serial.println(" ft");

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

3. OLED-Display – Metrisch

/* BMP280 + OLED 128x32 (Metrisch) */
#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.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("BMP280 Monitor");
  display.setCursor(32, 12);
  display.setTextSize(2);
  display.println("Ready");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  float T = bmp.readTemperature();
  float P = bmp.readPressure() / 100.0;
  float A = bmp.readAltitude(1019.66); // Meeresspiegeldruck anpassen!

  display.setCursor(0, 0);
  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.setCursor(65, 0);
  display.setTextSize(1);
  display.print("Druck");
  display.setCursor(65, 10);
  display.print(P, 0);
  display.setCursor(110, 10);
  display.print("hPa");

  display.setCursor(65, 25);
  display.print("Hoehe");
  display.setCursor(90, 25);
  display.print(A, 0);
  display.setCursor(110, 25);
  display.print("m");

  display.display();
  delay(2000);
}

4. OLED-Display – Imperial

/* BMP280 + OLED 128x32 (Imperial) */
#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.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("BMP280 Monitor");
  display.setCursor(32, 12);
  display.setTextSize(2);
  display.println("Ready");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  float T = bmp.readTemperature() * 9.0 / 5.0 + 32.0;
  float P = bmp.readPressure() / 3386.39;
  float A = bmp.readAltitude(1019.66) * 3.28084;

  display.setCursor(0, 0);
  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.setCursor(65, 0);
  display.setTextSize(1);
  display.print("Druck");
  display.setCursor(65, 10);
  display.print(P, 2);
  display.setCursor(100, 10);
  display.print("inHg");

  display.setCursor(65, 25);
  display.print("Hoehe");
  display.setCursor(90, 25);
  display.print(A, 0);
  display.setCursor(110, 25);
  display.print("ft");

  display.display();
  delay(2000);
}

Wichtige Hinweise

  • Meeresspiegeldruck: Der Wert 1019.66 in readAltitude() muss dem aktuellen Luftdruck auf Meereshöhe Ihres Standorts entsprechen. Passen Sie ihn an, bis die angezeigte Höhe stimmt.
  • I2C-Adresse: Prüfen Sie vor dem ersten Einsatz die Adresse mit dem Scanner.
  • Bibliotheken: Installieren Sie über den Bibliotheksverwalter: Adafruit BMP280 Library, Adafruit GFX Library, Adafruit SSD1306.

Weiterführende Links

Herstellungsprozess

  1. Integriertes QR-, RFID- und Temperatur-Verifikations-Zugangskontrollsystem
  2. Mehrere DS18B20 1-Wire Sensoren an Raspberry Pi anschließen für präzises Temperaturmonitoring
  3. Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
  4. Nahtlose Temperatur- & Feuchtigkeitsüberwachung am Raspberry Pi mit EzTemp
  5. DIY Heimbrau-Temperaturregelung: Überwachen & Steuern mit Arduino
  6. Raspberry Pi BMP085: Präzise Temperatur- & Druckmessung via I2C
  7. Präzise Thermoelement-Messung & Logging für Labor & Wissenschaftsexperimente
  8. Multi-Sensor Temperatur- & Licht-Überwachung mit Raspberry Pi & DS18B20
  9. Präzise Druck- & Luftstrommessung mit analogem Sensor und Arduino
  10. Arduino Temperatur- & Feuchtelogger mit DHT11 & Ethernet Shield