Duty-Cycling-Modus
Was dieses Beispiel zeigt
Strom sparen, indem der Sensor nur von Zeit zu Zeit misst. Im Duty-Cycling-Modus misst der BMV080, schläft für den Rest einer von Ihnen festgelegten Periode und liefert einen Messwert pro Periode. Dieses Beispiel legt eine Periode von 20 Sekunden fest und gibt jedes Mal PM2.5 aus, wenn ein Messwert eintrifft.
Der Kompromiss steht im Datenblatt: Duty Cycling verwendet immer den Algorithmus für schnelle Ansprechzeit, und die Genauigkeitsangaben für den kontinuierlichen Modus gelten dafür nicht. Die Periode muss mindestens 2 Sekunden länger sein als die Integrationszeit, die standardmäßig 10 Sekunden beträgt.
Der Beispielcode
Dies ist DutyCycle.ino aus der fest eingebundenen Bibliothek, ohne den Kopfkommentar. Der Sketch selbst ist unverändert wie ausgeliefert. 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();
// Attempt to initialize the sensor via I2C
if (bmv080.begin(BMV080_ADDR, Wire) == false)
{
Serial.println("BMV080 not detected");
while (1)
;
}
Serial.println("BMV080 found!");
// Initialize the sensor
if (bmv080.init())
{
Serial.println("BMV sensor initialized");
}
else
{
Serial.println("BMV initialization failed");
while (1)
;
}
// Set the sensor Duty Cycling Period (seconds)
uint16_t duty_cycling_period = 20;
if(bmv080.setDutyCyclingPeriod(duty_cycling_period) == true)
{
Serial.println("BMV080 set to 20 second duty cycle period.");
}
else
{
Serial.println("Error setting BMV080 duty cycle period.");
}
// Set the sensor mode to Duty Cycle mode
if(bmv080.setMode(BMV080_MODE_DUTY_CYCLE) == true)
{
Serial.println("BMV080 set to Duty Cycle mode");
}
else
{
Serial.println("Error setting BMV080 mode");
}
}
void loop()
{
// Attempt to get reading
if (bmv080.readSensor())
{
float pm25 = bmv080.PM25();
Serial.print(pm25);
if (bmv080.isObstructed() == true)
{
Serial.print("\tObstructed");
}
Serial.println();
}
delay(1000);
}
Erwartetes Ergebnis, aus einem Testlauf auf diesem Board (beim Lauf wurde nicht festgehalten, welcher Controller verwendet wurde):
BMV080 found!
BMV sensor initialized
BMV080 set to 20 second duty cycle period.
BMV080 set to Duty Cycle mode
7.31
7.08
6.94
Nach den Setup-Zeilen folgt eine Zeile pro Periode, etwa alle 20 Sekunden, mit dem PM2.5-Wert in µg/m³ allein, gefolgt von Obstructed, wenn die Sicht des Sensors blockiert ist. Ihre Werte hängen von der Luft um den Sensor ab.
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. Sie startet den I2C-Bus nicht, 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. Standardmäßig BMV080_DEFAULT_ADDRESS, das ist 0x57, die Standardadresse des Boards. |
wirePort | TwoWire & | Der zu verwendende I2C-Port. Standardmäßig 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 sie nach begin() und vor allem anderen auf.
Returnstrue, wenn alle Schritte erfolgreich waren, false, wenn einer fehlgeschlagen ist.
setDutyCyclingPeriod(uint16_t duty_cycling_period)returns boolLegt fest, wie lange ein Duty Cycle dauert: Messzeit plus Schlafzeit. Rufen Sie sie vor setMode() auf, da der Sensor seine Einstellungen beim Start der Messung übernimmt. Der Bosch-Standardwert beträgt 30 Sekunden.
Returnstrue, wenn die Periode gesetzt wurde, sonst false.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
duty_cycling_period | uint16_t | Die Periode in Sekunden. Sie muss mindestens 2 Sekunden länger sein als die Integrationszeit. |
setMode(uint8_t mode)returns boolStartet die Messung im gewählten Modus. Im Duty-Cycling-Modus übergibt die Bibliothek dem Bosch-Driver millis() als Taktgeber.
Returnstrue, wenn der Bosch-Driver die Messung gestartet hat, sonst false.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
mode | uint8_t | BMV080_MODE_DUTY_CYCLE für Duty Cycling, wie hier, oder BMV080_MODE_CONTINUOUS für kontinuierliche Messung. |
readSensor(bmv080_output_t *bmv080_output = nullptr)returns boolLässt den Bosch-Driver einmal Daten vom Sensor abrufen und verarbeiten. Wenn ein neuer Messwert eintrifft, speichert die Bibliothek ihn für PM25() und isObstructed(). Im Duty-Cycling-Modus muss der Driver mindestens einmal pro Sekunde bedient werden, was die Ein-Sekunden-Schleife des Beispiels erfüllt.
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. |
PM25()returns floatGibt den PM2.5-Wert der letzten Messung zurück: Partikel mit einem Durchmesser von 2,5 µm oder kleiner.
ReturnsPM2.5-Massenkonzentration in µg/m³.
isObstructed()returns boolGibt das Obstruktions-Flag der letzten Messung zurück. Der Sensor setzt es, wenn sich ein fester Gegenstand in seinem optischen Pfad befindet.
Returnstrue, wenn die letzte Messung blockiert war, sonst false.
Alles zusammen
Legen Sie zuerst die Periode fest und starten Sie dann das Duty Cycling mit setMode(). Rufen Sie readSensor() weiterhin mindestens einmal pro Sekunde auf: Die Funktion gibt einmal pro Periode true zurück. Der Interrupt-Ausgang des Sensors kann in diesem Modus keine Messwerte auslösen, fragen Sie ihn also wie im Beispiel per Polling ab.