PM-Werte auslesen
Was dieses Beispiel zeigt
Es liest PM10, PM2.5 und PM1 vom BMV080 im kontinuierlichen Messmodus aus und prüft, ob etwas den Sensor blockiert. Der Sensor liefert etwa einmal pro Sekunde einen neuen Messwert; der Sketch fragt alle 100 ms danach und gibt nur dann eine Zeile aus, wenn ein neuer Wert eingetroffen ist.
Der Beispielcode
Dies ist simpleReading.ino aus der fest eingebundenen Bibliothek, ohne den Kopfkommentar. Der Sketch selbst ist unverändert, so wie er ausgeliefert wird. Er verwendet die Standardadresse des Boards, 0x57.
#include "BMV080-SOLDERED.h"
BMV080 bmv080; // Create an instance of the BMV080 class
#define BMV080_ADDR 0x57 // BMV080 default address
void setup()
{
Serial.begin(115200);
while (!Serial)
delay(10); // Wait for Serial to become available.
Wire.begin();
if (bmv080.begin(BMV080_ADDR, Wire) == false)
{
Serial.println(
"BMV080 not detected at default I2C address. Check your jumpers and the hookup guide. Freezing...");
while (1)
;
}
/* Initialize the Sensor (read driver, open, reset, id etc.)*/
bmv080.init();
/* Set the sensor mode to continuous mode */
if (bmv080.setMode(BMV080_MODE_CONTINUOUS) == true)
{
Serial.println("BMV080 set to continuous mode");
}
else
{
Serial.println("Error setting BMV080 mode");
}
}
void loop()
{
if (bmv080.readSensor())
{
float pm10 = bmv080.PM10();
float pm25 = bmv080.PM25();
float pm1 = bmv080.PM1();
Serial.print("PM10: ");
Serial.print(pm10);
Serial.print("\t");
Serial.print("PM2.5: ");
Serial.print(pm25);
Serial.print("\t");
Serial.print("PM1: ");
Serial.print(pm1);
if (bmv080.isObstructed() == true)
{
Serial.print("\tObstructed");
}
Serial.println();
}
delay(100);
}
Erwartetes Ergebnis, aus einem Testlauf auf diesem Board (beim Lauf wurde nicht festgehalten, welcher Controller verwendet wurde):
BMV080 set to continuous mode
PM10: 9.84 PM2.5: 7.12 PM1: 5.06
PM10: 10.27 PM2.5: 7.39 PM1: 5.21
PM10: 10.03 PM2.5: 7.25 PM1: 5.14
PM10: 9.71 PM2.5: 7.01 PM1: 4.98
PM10: 9.92 PM2.5: 7.18 PM1: 5.09
Etwa einmal pro Sekunde erscheint eine neue Zeile mit jedem Wert in µg/m³. Sie endet mit Obstructed, wenn die Sicht des Sensors blockiert ist. Ihre Werte hängen von der Luft um den Sensor ab. Antwortet der Sensor nicht, gibt der Sketch
BMV080 not detected at default I2C address. Check your jumpers and the hookup guide. Freezing...
aus und hält an.
Verwendete Funktionen
BMV080()returns NoneErstellt das Sensorobjekt. Es nimmt keine Argumente entgegen: Die Adresse und der Wire-Port werden an begin() übergeben.
ReturnsKonstruktor; kein Rückgabewert.
begin(const uint8_t address = BMV080_DEFAULT_ADDRESS, TwoWire &wirePort = Wire)returns boolLegt die I2C-Adresse und den Wire-Port fest, die die Bibliothek verwendet, und prüft, ob der Sensor unter dieser Adresse antwortet. Der I2C-Bus wird dabei nicht gestartet, rufen Sie daher zuerst Wire.begin() auf, wie im Beispiel.
Returnstrue, wenn der Sensor unter der Adresse geantwortet hat, sonst false.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
address | uint8_t | Die I2C-Adresse des Sensors. Standardwert ist BMV080_DEFAULT_ADDRESS, also 0x57, die Standardadresse des Boards. |
wirePort | TwoWire & | Der zu verwendende I2C-Port. Standardwert ist Wire. |
init()returns boolBereitet den Sensor über den Bosch-Driver vor: liest die Driver-Version, öffnet den Sensor, führt einen Soft-Reset durch und liest die ID des Sensors. Rufen Sie die Funktion nach begin() und vor allem anderen auf.
Returnstrue, wenn jeder Schritt erfolgreich war, false, wenn einer fehlgeschlagen ist.
setMode(uint8_t mode)returns boolStartet die Messung im gewählten Modus.
Returnstrue, wenn der Bosch-Driver die Messung gestartet hat, sonst false.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
mode | uint8_t | BMV080_MODE_CONTINUOUS für kontinuierliche Messung oder BMV080_MODE_DUTY_CYCLE für Duty-Cycle-Betrieb. |
readSensor(bmv080_output_t *bmv080_output = nullptr)returns boolLässt den Bosch-Driver einmal Daten vom Sensor abholen und verarbeiten. Trifft ein neuer Messwert ein, speichert die Bibliothek ihn für PM10(), PM25(), PM1() und isObstructed(). Rufen Sie die Funktion regelmäßig auf, wie das Beispiel in loop().
Returnstrue, wenn während dieses Aufrufs ein neuer Messwert eingetroffen ist, sonst false.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
bmv080_output | bmv080_output_t * | Optional. Eine Bosch-Ausgabestruktur, in die der neue Messwert kopiert wird. Das Beispiel lässt sie weg. |
PM10()returns floatGibt den PM10-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von höchstens 10 µm.
ReturnsPM10-Massenkonzentration in µg/m³.
PM25()returns floatGibt den PM2.5-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von höchstens 2,5 µm.
ReturnsPM2.5-Massenkonzentration in µg/m³.
PM1()returns floatGibt den PM1-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von höchstens 1 µm.
ReturnsPM1-Massenkonzentration in µg/m³.
isObstructed()returns boolGibt das Blockierungs-Flag der letzten Messung zurück. Der Sensor setzt es, wenn sich ein feststehendes Objekt in seinem optischen Pfad befindet; kurzzeitige Blockierungen, etwa durch eine vorbeigeführte Hand, werden herausgefiltert.
Returnstrue, wenn die letzte Messung blockiert war, sonst false.
Alles zusammenfügen
Die Reihenfolge ist wichtig: Wire.begin(), dann begin() mit der Adresse, dann
init(), dann setMode(). Rufen Sie danach readSensor() häufig auf und lesen Sie die
Werte nur, wenn die Funktion true zurückgibt. Wenn Sie die Adresse mit den Jumpern JP2
und JP3 ändern, passen Sie BMV080_ADDR entsprechend an.