Skip to main content

Način rada s ciklusima uključivanja

Što ovaj primjer prikazuje​

Štednja energije tako da senzor mjeri samo povremeno. U načinu rada s ciklusima uključivanja BMV080 mjeri, ostatak zadanog razdoblja miruje i isporučuje jedno očitanje po razdoblju. Ovaj primjer postavlja razdoblje od 20 sekundi i ispisuje PM2.5 svaki put kad stigne očitanje.

Kompromis je naveden u tehničkom listu: rad s ciklusima uključivanja uvijek koristi algoritam brzog odziva mjerenja, a podaci o preciznosti za kontinuirani način rada za njega ne vrijede. Razdoblje mora biti barem 2 sekunde dulje od vremena integracije, koje je prema zadanim postavkama 10 sekundi.

Kôd primjera​

Ovo je DutyCycle.ino iz fiksirane verzije biblioteke, bez uvodnog komentara. Sama skica je točno onakva kakva se isporučuje. Koristi zadanu adresu pločice, 0x57.

Select Board
DutyCycle.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();

// 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);
}

Očekivani rezultat, iz ispitivanja na ovoj pločici (u ispitivanju nije zabilježeno koji je kontroler korišten):

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

Nakon redaka za postavljanje slijedi jedan redak po razdoblju, otprilike svakih 20 sekundi, s vrijednošću PM2.5 u µg/m³ samom, a iza nje Obstructed kad je pogled senzora blokiran. Vaše vrijednosti ovise o zraku oko senzora.

Korištene funkcije​

BMV080()returns None

Stvara objekt senzora. Ne prima argumente: adresa i Wire port zadaju se u begin().

ReturnsKonstruktor; nema povratne vrijednosti.

begin(const uint8_t address = BMV080_DEFAULT_ADDRESS, TwoWire &wirePort = Wire)returns bool

Postavlja I2C adresu i Wire port koje biblioteka koristi te provjerava odgovara li senzor na toj adresi. Ne pokreće I2C sabirnicu, zato prvo pozovite Wire.begin(), kao što to radi primjer.

Returnstrue kad je senzor odgovorio na adresi, inače false.

Parametri

NazivTipOpis
addressuint8_tI2C adresa senzora. Zadano BMV080_DEFAULT_ADDRESS, a to je 0x57, zadana adresa pločice.
wirePortTwoWire &I2C port koji se koristi. Zadano Wire.
init()returns bool

Priprema senzor putem Bosch upravljačkog programa: čita verziju upravljačkog programa, otvara senzor, izvodi programsko resetiranje i čita ID senzora. Pozovite ga nakon begin() i prije bilo čega drugog.

Returnstrue kad su svi koraci uspjeli, false kad je neki neuspio.

setDutyCyclingPeriod(uint16_t duty_cycling_period)returns bool

Postavlja trajanje jednog ciklusa: vrijeme mjerenja plus vrijeme mirovanja. Pozovite ga prije setMode(), jer senzor preuzima postavke kad mjerenje započne. Zadana vrijednost tvrtke Bosch je 30 sekundi.

Returnstrue kad je razdoblje postavljeno, inače false.

Parametri

NazivTipOpis
duty_cycling_perioduint16_tRazdoblje u sekundama. Mora biti barem 2 sekunde dulje od vremena integracije.
setMode(uint8_t mode)returns bool

Pokreće mjerenje u odabranom načinu rada. U načinu rada s ciklusima uključivanja biblioteka daje Bosch upravljačkom programu millis() kao sat.

Returnstrue kad je Bosch upravljački program pokrenuo mjerenje, inače false.

Parametri

NazivTipOpis
modeuint8_tBMV080_MODE_DUTY_CYCLE za rad s ciklusima uključivanja, kao ovdje, ili BMV080_MODE_CONTINUOUS za kontinuirano mjerenje.
readSensor(bmv080_output_t *bmv080_output = nullptr)returns bool

Omogućuje Bosch upravljačkom programu da jednom dohvati i obradi podatke sa senzora. Kad stigne novo očitanje, biblioteka ga pohranjuje za PM25() i isObstructed(). U načinu rada s ciklusima uključivanja upravljački program treba posluživati barem jednom u sekundi, što i radi petlja primjera od jedne sekunde.

Returnstrue kad je tijekom ovog poziva stiglo novo očitanje, inače false.

Parametri

NazivTipOpis
bmv080_outputbmv080_output_t *Neobavezno. Bosch izlazna struktura u koju se kopira novo očitanje. Primjer je izostavlja.
PM25()returns float

Vraća vrijednost PM2.5 najnovijeg očitanja: čestice promjera 2,5 µm ili manje.

ReturnsMasena koncentracija PM2.5 u µg/m³.

isObstructed()returns bool

Vraća oznaku zapriječenosti najnovijeg očitanja. Senzor je postavlja kad se u njegovom optičkom putu nalazi nepomičan predmet.

Returnstrue kad je najnovije očitanje bilo zapriječeno, inače false.

Sastavljanje cjeline​

Prvo postavite razdoblje, zatim pokrenite rad s ciklusima uključivanja pomoću setMode(). Pozivajte readSensor() barem jednom u sekundi: vraća true jednom po razdoblju. Izlaz prekida senzora u ovom načinu rada ne može pokrenuti očitanja, zato ga ispitujte (polling) kao što to radi primjer.