RE: Welche Library für BMP/BME280 ggf. BME680
Ich habe die BME280 (MyBME280.h) und die BMP180 (SFE_BMP180.h) Sensoren. Dafür mußte ich auch zwei veschiedene Lib´s nehmen. Da sind große Unterschiede. Also auch keine kleinen Anpassungen im Programm, sondern völlig verschiedene Befehle. Ich fürchte die BMP180 Sensoren werden bei mir wohl die Ladenhüter werden. Die sind für 3,3 Volt und die Arbeit mit dieser Lib ist auch nicht mein´s. Ist aber nur das erste Gefühl anhand der Testprogramme.
Franz
PS: Hier noch die beiden Testprogramme zu den Lib´s:
Code:
//Testprogramm 1 für Luftdrucksensor BME280
//Code fuer Arduino
//Author Retian
//Version 1.1
//Prototypen:
void leseMesswerte(void);
void ausgabeMesswerte(void);
#include <MyBME280.h>
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//Hier auswählen zwischen I2C- und SPI-Schnittstelle
//Mit I2C-Schnittstelle:
#define BME280_I2cAdd 0x76 //I2C-Adresse
MyBME280 BME(BME280_I2cAdd);
//Mit SPI-Schnittstelle:
//#define cs 10 //CS-Pin für SPI-Schnittstelle
//MyBME280 BME(cs, BME280_SPI);
unsigned long zeit;
float luftTemp, luftDruck, redLuftDruck, luftFeuchte;
int hoehe = 460; //Messort 460 m ueber dem Meer
// ------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
lcd.begin(20, 4);
lcd.backlight();
lcd.clear();
if (BME.isReady())
{
Serial.println("BME280 ok");
lcd.setCursor (0, 0);
lcd.print (F("BME280 init ok"));
BME.setWeatherMonitoring(); //Setze Parameter für Wetterueberwachung
BME.init();
//Beim Initialisieren des Parametersatzes für Wetterueberwachung (Forced-Mode)
//wird bereits eine Messung vom Sensor durchgeführt und als Rohwerte gespeichert
leseMesswerte();
ausgabeMesswerte();
}
else
{
Serial.println("BME280 Fehler");
while (1); //hier geht es im Fehlerfall nicht weiter
}
zeit = millis();
}
// -----------------------------------------------------------------------------------------------
void loop() {
if (millis() > zeit + 5000) //Messung alle 5 Sekunden
{
BME.startSingleMeas();
leseMesswerte();
ausgabeMesswerte();
zeit = millis();
}
}
// -----------------------------------------------------------------------------------------------
void leseMesswerte()
{
luftTemp = BME.readTemp();
luftDruck = BME.readPress();
redLuftDruck = BME.readReducedPress(hoehe);
luftFeuchte = BME.readHumidity();
}
// ----------------------------------------------------------------------------------------------
void ausgabeMesswerte()
{
// Ausgabe Serial ----------------------------------------------
Serial.print("Lufttemperatur : ");
Serial.print(luftTemp);
Serial.println(" Grad C");
Serial.print("LuftDruck : ");
Serial.print(luftDruck);
Serial.println(" hPa");
Serial.print("Red. LuftDruck : ");
Serial.print(redLuftDruck);
Serial.println(" hPa");
Serial.print("Luftfeuchtigkeit: ");
Serial.print(luftFeuchte);
Serial.println(" %");
Serial.println();
// Ausgabe auf LCD Display 4x20 Zeichen-----------------
lcd.setCursor (0, 0);
lcd.print (F("Temperatur: "));
lcd.setCursor (12, 0);
lcd.print (luftTemp);
lcd.setCursor (0, 1);
lcd.print (F("LuftDruck:"));
lcd.setCursor (11, 1);
lcd.print (luftDruck);
lcd.print (F(" mb"));
lcd.setCursor (0, 2);
lcd.print (F("Rel.Druck:"));
lcd.setCursor (10, 2);
lcd.print (redLuftDruck);
lcd.print (F(" mb"));
lcd.setCursor (0, 3);
lcd.print (F("Luftfeucht"));
lcd.setCursor (11, 3);
lcd.print (luftFeuchte);
lcd.print (F(" %"));
}
// Mehr Infos: https://arduino-projekte.webnode.at/meine-libraries/luftdruck-luftfeuchtesensor-bme280/
Code:
/*Dieses Programm zeigt, wie Sie die Bibliothek SFE_BMP180 zum Lesen des
Bosch BMP180 Luftdrucksensor einrichten.
https://www.sparkfun.com/products/11824
Wie die meisten Drucksensoren misst der BMP180 den absoluten Druck.
Dies ist der tatsächliche Umgebungsdruck, der vom Gerät gemessen wird
und variieren sowohl mit der Höhe als auch mit dem Wetter.
Vor einer Druckmessung müssen Sie eine Temperaturmessung durchführen.
Dies geschieht mit startTemperature () und getTemperature ().
Das Ergebnis ist in Grad C.
Sobald Sie eine Temperaturmessung durchgeführt haben, können Sie eine Druckmessung durchführen.
Dies geschieht mit startPressure () und getPressure ().
Das Ergebnis wird in Millibar (mb) oder Hektopascal (hPa) angegeben.
#############################################################################################
Wahrscheinlich werden Sie Wettermuster überwachen wollen.
Entfernen Sie die Auswirkungen der Höhe. Dies wird Messwerte erzeugen, die können
mit den veröffentlichten Druckwerten von anderen Orten verglichen werden.
Verwenden Sie dazu die Funktion sealevel (). Sie müssen zur Verfügung stellen
die bekannte Höhe, in der der Druck gemessen wurde.
Wenn Sie die Höhe messen möchten, müssen Sie den Druck kennen
in einer Grundlinie Höhe. Dies kann der durchschnittliche Druck auf Meereshöhe sein oder
in diesem Fall eine vorherige Druckmessung in Ihrer Höhe
Nachfolgende Höhenmessungen sind + oder - die anfängliche Basislinie.
Dies geschieht mit der Funktion height ().
#############################################################################################
Hardware-Verbindungen:
- (GND) to GND
+ (VDD) to 3.3V
(ACHTUNG: + nicht an 5V anschließen, da sonst der Sensor beschädigt wird!)
Sie müssen auch die I2C-Pins (SCL und SDA) mit Ihrem verbinden
Arduino. Die Pins sind auf verschiedenen Arduinos unterschiedlich:
Beliebige Arduino-Pins mit der Bezeichnung: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Fällig: 20 21
Leonardo: 2 3
Lassen Sie den IO (VDDIO) -Pin unverbunden. Dieser Pin dient zum Anschließen
das BMP180 zu Systemen mit niedrigeren Logikniveaus wie 1.8V
Habe Spaß! -Ihre Freunde bei SparkFun.
Die Bibliothek SFE_BMP180 verwendet Gleitkommagleichungen, die von der
Wetterstation-Datenlogger-Projekt: http://wmrx00.sourceforge.net/
In unserem Beispielcode wird die Lizenz "beerware" verwendet. Du kannst alles machen
Sie mögen mit diesem Code. Nein, wirklich nichts. Wenn Sie es nützlich finden,
kauf mir eines Tages ein Bier.
V10 Mike Grusin, SparkFun Electronics 24.10.2013
V1.1.2-Updates für Arduino 1.6.4 5/2015
*/
// Ihr Programm muss diese Bibliothek und die Wire-Bibliothek enthalten.
// (Wire ist eine Standardbibliothek, die in Arduino enthalten ist.):
#include <SFE_BMP180.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Sie müssen ein SFE_BMP180-Objekt mit dem Namen "pressure" erstellen:
SFE_BMP180 pressure
;
#define ALTITUDE 599.0 // Höhe in Metern von meinem Wohnsitz in Penzberg
// ----------------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("REBOOT");
lcd.begin(20, 4);
lcd.backlight();
lcd.clear();
// Initialisieren Sie den Sensor (es ist wichtig, dass die Kalibrierungswerte im Gerät gespeichert werden).
if (pressure.begin())
Serial.println("BMP180 Initialisierung ist erfolgt");
else
{
// Ups, irgendwas ist schief gelaufen, das ist normalerweise ein Verbindungsproblem.
// In den Kommentaren oben in dieser Skizze finden Sie die richtigen Verbindungen.
Serial.println("BMP180 init Fehler\n\n");
while (1); // Pause für immer.
}
}
// ---------------------------------------------------------------------------------------------------------
void loop()
{
char status;
double T, P, p0, a;
// Schleife hier, um alle 10 Sekunden die Druckwerte abzurufen.
// Wenn Sie einen meeresspiegelkompensierten Druck wünschen, wie er in Wetterberichten verwendet wird,
// müssen sie die Höhe kennen, in der Ihre Messungen durchgeführt werden.
// In diesem Programm verwenden wir eine Konstante mit dem Namen ALTITUDE:
Serial.println();
Serial.print("Vergleichs Höhe: ");
Serial.print(ALTITUDE, 0);
Serial.print(" Meter, ");
Serial.println();
// Wenn Sie die Höhe und nicht den Druck messen möchten, benötigen Sie stattdessen
// um einen bekannten Basisdruck bereitzustellen. Dies ist am Ende des Programm´s dargestellt.
// Sie müssen zuerst eine Temperaturmessung durchführen, um eine Druckmessung durchzuführen.
// Temperaturmessung starten:
// Wenn die Anforderung erfolgreich ist, wird die Anzahl der zu wartenden ms zurückgegeben.
// Wenn die Anfrage nicht erfolgreich ist, wird 0 zurückgegeben.
status = pressure.startTemperature();
if (status != 0)
{
// Warten Sie, bis die Messung abgeschlossen ist:
delay(status);
// Abrufen der abgeschlossenen Temperaturmessung:
// Beachten Sie, dass der Messwert in der Variablen T gespeichert ist.
// Funktion gibt 1 zurück, wenn erfolgreich, 0, wenn fehlgeschlagen.
status = pressure.getTemperature(T);
if (status != 0)
{
// Messung ausgeben:
Serial.print(F("Temperatur: "));
Serial.print(T, 2);
Serial.print(F(" Grad C"));
Serial.println();
lcd.setCursor (0, 0);
lcd.print (F("Temperatur: "));
lcd.setCursor (12, 0);
lcd.print (T, 2);
// Druckmessung starten:
// Der Parameter ist die Oversampling-Einstellung von 0 bis 3 (höchste Auflösung, längste Wartezeit).
// Wenn die Anforderung erfolgreich ist, wird die Anzahl der zu wartenden ms zurückgegeben.
// Wenn die Anfrage nicht erfolgreich ist, wird 0 zurückgegeben.
status = pressure.startPressure(3);
if (status != 0)
{
// Warten Sie, bis die Messung abgeschlossen ist:
delay(status);
// Abrufen der abgeschlossenen Druckmessung:
// Beachten Sie, dass der Messwert in der Variablen P gespeichert ist.
// Beachten Sie auch, dass für die Funktion die vorherige Temperaturmessung (T) erforderlich ist.
// (Wenn die Temperatur stabil ist, können Sie eine Temperaturmessung für eine Reihe von Druckmessungen durchführen.)
// Funktion gibt 1 zurück, wenn erfolgreich, 0, wenn fehlgeschlagen.
status = pressure.getPressure(P, T);
if (status != 0)
{
// Messung ausgeben:
Serial.print("absoluter Druck: ");
Serial.print(P, 2);
Serial.print(" mb, ");
Serial.print(P * 0.0295333727, 2);
Serial.println(" inHg");
lcd.setCursor (0, 1);
lcd.print (F("Absol.Dr.:"));
lcd.setCursor (11, 1);
lcd.print (P, 2);
lcd.print (F(" mb"));
// Der Drucksensor gibt den absoluten Druck zurück, der sich mit der Höhe ändert.
// Um die Höheneffekte zu beseitigen, verwenden Sie die Sealevel-Funktion und Ihre aktuelle Höhe.
// Diese Nummer wird häufig in Wetterberichten verwendet.
// Parameter: P = absoluter Druck in mb, ALTITUDE = aktuelle Höhe in m.
// Ergebnis: p0 = Meeresspiegelausgleichsdruck in mb
p0 = pressure.sealevel(P, ALTITUDE); // Wir sind bei 599 Metern (Boulder, CO)
Serial.print("relativer (Meeresspiegel-) Druck: ");
Serial.print(p0, 2);
Serial.print(" mb, ");
Serial.print(p0 * 0.0295333727, 2);
Serial.println(" inHg");
lcd.setCursor (0, 2);
lcd.print (F("Rel.Druck:"));
lcd.setCursor (10, 2);
lcd.print (p0, 2);
lcd.print (F(" mb"));
// Auf der anderen Seite, wenn Sie Ihre Höhe aus dem Druckmesswert bestimmen möchten,
// Verwenden Sie die Höhenfunktion zusammen mit einem Basisdruck (Meeresspiegel oder anderem).
// Parameter: P = Absolutdruck in mb, p0 = Basisdruck in mb.
// Ergebnis: a = Höhe in m.
a = pressure.altitude(P, p0);
Serial.print("Berechnete Höhe: ");
Serial.print(a, 0);
Serial.print(" Meter, ");
Serial.println();
lcd.setCursor (0, 3);
lcd.print (F("Ber.Hoehe:"));
lcd.setCursor (11, 3);
lcd.print (a, 0);
lcd.print (F(" Meter"));
}
else Serial.println("Fehler beim Abrufen der Druckmessung \ n");
}
else Serial.println("Fehler beim Starten der Druckmessung \ n");
}
else Serial.println("Fehler beim Abrufen der Temperaturmessung \ n");
}
else Serial.println("Fehler beim Starten der Temperaturmessung \ n");
delay(1000); // Pause für eine Minute.
}
Ich habe übrigens die Ausgabe auf ein LCD Display geändert, dass ich mit einer Powerbank das ganze Zeug, Mega / Sensor / LCD Display, betreiben kann, und somit auch mal damit die Treppen rauf und runter kann, also die Höhe so knapp 10 Meter ändern kann.
https://www.youtube.com/watch?v=Fnzn85oWM_Q
Hier was zum Thema Deutsche Politik 
Und hier zum Thema richtige Politik
|