1+ /*
2+ Using the BMV080 Particulate Matter PM2.5 Sensor
3+
4+ This example shows how to open an instance of the object, take 5 readings,
5+ then close the object.
6+
7+ It then repeats this process every 5 seconds.
8+
9+ This example shows how to use the sensor in "continuous mode" to get
10+ particulate matter readings once every second.
11+
12+ It uses polling of the device to check if new data is available.
13+
14+ By: Pete Lewis
15+ SparkFun Electronics
16+ Date: September, 2024
17+ SparkFun code, firmware, and software is released under the MIT License.
18+ Please see LICENSE.md for further details.
19+
20+ Hardware Connections:
21+ IoT RedBoard --> BMV080
22+ QWIIC --> QWIIC
23+
24+ BMV080 "mode" jumper set to I2C (default)
25+
26+ Serial.print it out at 115200 baud to serial monitor.
27+
28+ Feel like supporting our work? Buy a board from SparkFun!
29+ https://www.sparkfun.com/products/26554
30+ */
31+
32+ #include " SparkFun_BMV080_Arduino_Library.h" // CTRL+Click here to get the library: http://librarymanager/All#SparkFun_BMV080
33+ #include < Wire.h>
34+
35+
36+ #define BMV080_ADDR 0x57 // SparkFun BMV080 Breakout defaults to 0x57
37+
38+ // Some Dev boards have their QWIIC connector on Wire or Wire1
39+ // This #ifdef will help this sketch work across more products
40+
41+ #ifdef ARDUINO_SPARKFUN_THINGPLUS_RP2040
42+ #define wirePort Wire1
43+ #else
44+ #define wirePort Wire
45+ #endif
46+
47+ int testTimes = 0 ; // Test times
48+
49+ void setup ()
50+ {
51+ Serial.begin (115200 );
52+
53+ while (!Serial)
54+ delay (10 ); // Wait for Serial to become available.
55+ // Necessary for boards with native USB (like the SAMD51 Thing+).
56+ // For a final version of a project that does not need serial debug (or a USB cable plugged in),
57+ // Comment out this while loop, or it will prevent the remaining code from running.
58+
59+ Serial.println ();
60+ Serial.println (" BMV080 Example 09 - Open and Close" );
61+ }
62+
63+ void loop ()
64+ {
65+ Serial.print (" Test times: " );
66+ Serial.println (testTimes);
67+ testOnce ();
68+ testTimes++;
69+ delay (5000 );
70+ }
71+
72+
73+ void testOnce ()
74+ {
75+ Serial.println ();
76+ Serial.println (" BMV080 Begin testing readings" );
77+
78+ SparkFunBMV080 bmv080; // Create an instance of the BMV080 class
79+
80+ wirePort.begin ();
81+
82+ if (bmv080.begin (BMV080_ADDR, wirePort) == false )
83+ {
84+ Serial.println (
85+ " BMV080 not detected at default I2C address. Check your jumpers and the hookup guide. Freezing..." );
86+ while (1 )
87+ ;
88+ }
89+ Serial.println (" BMV080 found!" );
90+
91+ // wirePort.setClock(400000); //Increase I2C data rate to 400kHz
92+
93+ /* Initialize the Sensor (read driver, open, reset, id etc.)*/
94+ // Do what init() does, but check each call to each function individually
95+ // to see if there are any issues with the sensor
96+
97+ uint16_t major, minor, patch;
98+ if (bmv080.driverVersion (major, minor, patch) == true )
99+ {
100+ Serial.print (" BMV080 Driver Version: " );
101+ Serial.print (major);
102+ Serial.print (" ." );
103+ Serial.print (minor);
104+ Serial.print (" ." );
105+ Serial.println (patch);
106+ }
107+ else
108+ {
109+ Serial.println (" Error getting BMV080 driver version" );
110+ }
111+
112+ if (bmv080.open () == true )
113+ {
114+ Serial.println (" BMV080 Opened" );
115+ }
116+ else
117+ {
118+ Serial.println (" Error opening BMV080" );
119+ }
120+
121+ if (bmv080.reset () == true )
122+ {
123+ Serial.println (" BMV080 Reset" );
124+ }
125+ else
126+ {
127+ Serial.println (" Error resetting BMV080" );
128+ }
129+
130+ char idOut[13 ];
131+ if (bmv080.ID (idOut) == true )
132+ {
133+ Serial.print (" BMV080 ID: " );
134+ Serial.println (idOut);
135+ }
136+ else
137+ {
138+ Serial.println (" Error getting BMV080 ID" );
139+ }
140+
141+ /* Set the sensor mode to continuous mode */
142+ if (bmv080.setMode (SF_BMV080_MODE_CONTINUOUS) == true )
143+ {
144+ Serial.println (" BMV080 set to continuous mode" );
145+ }
146+ else
147+ {
148+ Serial.println (" Error setting BMV080 mode" );
149+ }
150+
151+ // Take 5 readings
152+
153+ // Poll the sensor 50 times, once every 100ms
154+ // The sensor is setup to report readings once per second
155+ // So this will result in 5 readings.
156+ for (int i = 0 ; i < 50 ; i++)
157+ {
158+ if (bmv080.readSensor ())
159+ {
160+ float pm10 = bmv080.PM10 ();
161+ float pm25 = bmv080.PM25 ();
162+ float pm1 = bmv080.PM1 ();
163+
164+ Serial.print (" PM10: " );
165+ Serial.print (pm10);
166+ Serial.print (" \t " );
167+ Serial.print (" PM2.5: " );
168+ Serial.print (pm25);
169+ Serial.print (" \t " );
170+ Serial.print (" PM1: " );
171+ Serial.print (pm1);
172+
173+ if (bmv080.isObstructed () == true )
174+ {
175+ Serial.print (" \t Obstructed" );
176+ }
177+
178+ Serial.println ();
179+ }
180+ delay (100 );
181+ }
182+
183+ Serial.println (" BMV080 End testing readings" );
184+
185+ bmv080.close ();
186+
187+ wirePort.end ();
188+ }
0 commit comments