Zum Hauptinhalt springen

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.

Select Board
simpleReading.ino
#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):

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
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 None

Erstellt 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 bool

Legt 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

NameTypBeschreibung
addressuint8_tDie I2C-Adresse des Sensors. Standardwert ist BMV080_DEFAULT_ADDRESS, also 0x57, die Standardadresse des Boards.
wirePortTwoWire &Der zu verwendende I2C-Port. Standardwert ist Wire.
init()returns bool

Bereitet 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 bool

Startet die Messung im gewählten Modus.

Returnstrue, wenn der Bosch-Driver die Messung gestartet hat, sonst false.

Parameter

NameTypBeschreibung
modeuint8_tBMV080_MODE_CONTINUOUS für kontinuierliche Messung oder BMV080_MODE_DUTY_CYCLE für Duty-Cycle-Betrieb.
readSensor(bmv080_output_t *bmv080_output = nullptr)returns bool

Lä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

NameTypBeschreibung
bmv080_outputbmv080_output_t *Optional. Eine Bosch-Ausgabestruktur, in die der neue Messwert kopiert wird. Das Beispiel lässt sie weg.
PM10()returns float

Gibt den PM10-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von höchstens 10 µm.

ReturnsPM10-Massenkonzentration in µg/m³.

PM25()returns float

Gibt 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 float

Gibt den PM1-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von höchstens 1 µm.

ReturnsPM1-Massenkonzentration in µg/m³.

isObstructed()returns bool

Gibt 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.