BMP280 - Tem­pe­ra­tur und Luft­druck messen

Lese­zeit: 8 Minu­ten

Lösung
Seite als PDF

Ardui­no

Der Sen­sor BMP280 kann die Tem­pe­ra­tur mes­sen und den Luft­druck bestim­men. Er wird über ➨I2C ange­steu­ert. Auf einem LCD sol­len Tem­pe­ra­tur und Luft­druck ange­zeigt werden.

Das Pro­gramm im Film

LCD anschlie­ßen

LCD

Nor­ma­ler­wei­se wäre eine kom­ple­xe Ver­ka­be­lung zum Betrieb eines LCDs nötig. Der ➨I2C-Bus regelt über einen eige­nen Mikro­pro­zes­sor die Kom­mu­ni­ka­ti­on der Daten­lei­tun­gen unter­ein­an­der. Es wer­den des­halb nur vier Anschlüs­se benötigt.

Die Hel­lig­keit kann mit einem Poten­tio­me­ter auf der Rück­sei­te des LCDs ein­ge­stellt werden.

Benö­tig­te Bauteile

  • BMP280
  • LCD 1602
  • Lei­tungs­dräh­te

Der Schalt­plan

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Der BMP280 wird in ver­schie­de­nen Bau­for­men mit unter­schied­li­cher Pin­be­le­gung ange­bo­ten.

Bei einem BMP280 mit sechs Pins müs­sen SDO und CSB eben­falls an VCC (5V) ange­schlos­sen werden.

Quel­le: 🔗https://​sen​sor​kit​.joy​-it​.net/​d​e​/​s​e​n​s​o​r​s​/​k​y​-​052 (abge­ru­fen am 01.03.24)

Die Schal­tung weist eine Beson­der­heit auf:

Weil I²C (Inter Inte­gra­ted Cir­cuit) ein seri­el­les Bus­sys­tem ist, kön­nen die Daten­lei­tun­gen auf die Lei­ter­plat­te geführt wer­den. Die Anschlüs­se für 5V (VCC) und GND befin­den sich auf der ande­ren Sei­te der Steckplatine. 

Das Pro­gramm

Benö­tig­te Bibliotheken

Bin­de die benö­ti­gen Biblio­the­ken und defi­nie­re die Bauteile.

# include "Adafruit_BMP280.h"
# include "LCDIC2.h"

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

Adafruit_BMP280 bmp;

Der set­up-Teil

Im set­up-Teil wer­den das LCD und der BMP280 gestartet:

void setup()
{
  // BMP280 starten
  bmp.begin();
  Serial.begin(9600);
  
  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);
}

Der loop-Teil

Im loop-Teil wird die Tem­pe­ra­tur und der Luft­druck gemes­sen. Beach­te die Kommentare.

void loop()
{
  // readTemperature() Temperatur messen und Messergebnis formatieren
  String Temperatur = String(bmp.readTemperature());

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  /* 
    readPressure() Luftdruck messen und Messergebnis formatieren
    readPressure() liest in Pascal, ausgabe in hPa (Hekto-Pascal)
    Ergebnis durch 100 teilen
  */
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("Luftdruck: " + Luftdruck + " hPa");

  // Ausgabe LCD
  lcd.setCursor(0, 0);
  lcd.print("Temperatur: ");
  lcd.setCursor(0, 1);

  // \337C -> °
  lcd.print(Temperatur + "\337C");

  lcd.setCursor(0, 2);
  lcd.print("Luftdruck: ");
  lcd.setCursor(0, 3);
  lcd.print(Luftdruck + " hPa");

  delay(3000);
}

ESP32-Wroom

Der ESP32-Wroom ver­bin­det sich über WiFi mit einem Zeit­ser­ver und zeigt das aktu­el­le Datum und die aktu­el­le Zeit an.

So sieht es aus:

Board instal­lie­ren

Der Schalt­plan

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Das Pro­gramm

Bibio­the­ken und Variablen

/*
  WiFi.h   -> WiFi-Verbindungen herstellen
  time.h   -> Zeitfunktionen bereitstellen
  Adafruit_BMP280.h -> Messfunktionen für den Sensor BMP280
  LCDIC2.h -> Anzeige auf LCD1602 mit I2C
  DHT.h    -> Messfunktionen für die Sensoren DHT11/DHT22
*/
#include "WiFi.h"
#include "time.h"
#include "Adafruit_BMP280.h"
#include "LCDIC2.h"
#include "Wire.h"

// Router-SSID und Passwort
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// NTP-Server aus dem Pool für Deutschland
#define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
// Zeit -> Name der Struktur
tm Zeit;

// Kommunikation des Servers über den Standardport 80
WiFiServer Server(80);

// Name des Klienten
WiFiClient Client;

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

// Name des Sensorobjekts
Adafruit_BMP280 bmp;

// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP festlegen
// ip und gateway müssen an das lokale Netz angepasst werden
bool statischeIP = true;
IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

/*
  öffentliche DNS-Server
  -----------------------------------------------
  OpenDNS 208, 67, 222, 222 (USA)
  Google 8, 8, 8, 8 (USA)
  Cloudfare 1, 1, 1, 1 (USA)
  DNSWWatch 84.200.69.80 (Deutschland)
  Quad9 9, 9, 9, 9 (Schweiz)
  Neustar UltraDNS 56, 154, 70, 3 (USA, gefiltert)
  Deutsche Telekom 217, 5,100,185
  ------------------------------------------------
  oder die im Router eingetragene IP
  im Beispiel: 192, 168, 1, 20
*/
IPAddress primaryDNS(192, 168, 1, 20);
IPAddress secondaryDNS(9, 9, 9, 9);

Der set­up-Teil

void setup()
{
  // Zeitzone: Parameter für die zu ermittelnde Zeit
  configTzTime(Zeitzone, Zeitserver);

  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(500);

  // WiFi starten
  WiFi.begin(Router, Passwort);
    
  // statische IP vergeben
  if (statischeIP) 
  {
    WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); 
    Serial.print("Verbunden mit ");
    Serial.println(Router);

    // IP anzeigen
    Serial.print("IP: ");
    Serial.println(ip);
  }

  // IP über DHCP ermitteln
  else
  {
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(200);
      Serial.print(".");
    }
    Serial.println();
    Serial.print("Verbunden mit ");
    Serial.println(Router);
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
  }

  // BMP280 starten
  bmp.begin();

  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);
}

Der loop-Teil

void loop() 
{
  // aktuelle Zeit holen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);

  lcd.setCursor(0, 0);

  // es kann bis zu 60 Sekunden dauern 
  // bis die Zeit ermittelt wird
  // Tag: führende 0 ergänzen
  if (Zeit.tm_mday < 10) 
  {
    Serial.print("0");
    lcd.print("0");
  }
  Serial.print(Zeit.tm_mday);
  lcd.print(String(Zeit.tm_mday));

  Serial.print(".");
  lcd.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 10) 
  {
    Serial.print("0");
    lcd.print("0");
  }

  // Zählung beginnt mit 0 -> +1
  Serial.print(Zeit.tm_mon + 1);
  lcd.print(String(Zeit.tm_mon + 1));
  Serial.print(".");
  lcd.print(". ");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);
  Serial.print(" ");

  // Stunde: wenn Stunde < 10 -> 0 davor setzen
  if (Zeit.tm_hour < 10) 
  {
    Serial.print("0");
    lcd.print("0");
  }
  Serial.print(Zeit.tm_hour);
  Serial.print(":");
  lcd.print(String(Zeit.tm_hour));
  lcd.print(":");

  // Minuten
  if (Zeit.tm_min < 10) 
  {
    Serial.print("0");
    lcd.print("0");
  }
  Serial.print(Zeit.tm_min);
  lcd.print(String(Zeit.tm_min));

  Serial.print(":");
  lcd.print(":");

  // Sekunden
  if (Zeit.tm_sec < 10) 
  {
    Serial.print("0");
    lcd.print("0");
  }
  Serial.print(Zeit.tm_sec);
  lcd.print(String(Zeit.tm_sec));

  Serial.println();

  // gelesene Temperatur in String umwandeln
  String Temperatur = String(bmp.readTemperature());

  // . durch , ersetzen
  Temperatur.replace(".", ",");

  /* 
    readPressure() Luftdruck messen und Messergebnis formatieren
    readPressure() liest in Pascal, ausgabe in hPa (Hekto-Pascal)
    Ergebnis durch 100 teilen
  */
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // Ausgabe Serieller Monitor
  Serial.println("Temperatur: " + Temperatur + "°C");
  Serial.println("Luftdruck: " + Luftdruck + " hPa");

  Serial.println("--------------------------------");

  // Ausgabe auf dem LCD 
  // Ausgabe LCD
  lcd.setCursor(0, 1);
  lcd.print("Temperatur: ");
  
  // \337C -> °
  lcd.print(Temperatur + "\337C");

  lcd.setCursor(0, 2);
  lcd.print("Luftdruck: ");
  lcd.setCursor(0, 3);
  lcd.print(Luftdruck + " hPa");
  delay(5000);
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:

Letzte Aktualisierung: 14. Mrz 2024 @ 18:15