Skip to content

Commit e3f12e7

Browse files
committed
ex3 interrupt
1 parent 61e099d commit e3f12e7

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/*
2+
Using the BMV080 Particulate Matter PM2.5 Sensor
3+
4+
This example shows how to use the sensor in "continuous mode" to get
5+
particulate matter readings once every second.
6+
7+
The hardware interrupt of the BMV080 sensor unit cannot be used as trigger
8+
in duty cycling mode.
9+
10+
This example sets up an interrupt triggered by the BMV080's IRQ pin to take readings.
11+
12+
By: Pete Lewis
13+
SparkFun Electronics
14+
Date: September, 2024
15+
SparkFun code, firmware, and software is released under the MIT License.
16+
Please see LICENSE.md for further details.
17+
18+
Hardware Connections:
19+
IoT RedBoard --> BMV080
20+
QWIIC --> QWIIC
21+
14 --> IRQ
22+
23+
BMV080 "mode" jumper set to I2C (default)
24+
25+
Serial.print it out at 115200 baud to serial monitor.
26+
27+
Feel like supporting our work? Buy a board from SparkFun!
28+
https://www.sparkfun.com/products/?????
29+
*/
30+
31+
#include <Wire.h>
32+
#include "SparkFun_BMV080_Arduino_Library.h" // CTRL+Click here to get the library: http://librarymanager/All#SparkFun_BMV080
33+
34+
Bmv080 bmv080; // Create an instance of the BMV080 class
35+
#define BMV080_ADDR 0x57 // SparkFun BMV080 Breakout defaults to 0x57
36+
#define IRQ_Pin 14
37+
38+
i2c_device_t i2c_device = {}; // I2C device struct instance for Bosch API
39+
40+
bool int_flag = false;
41+
42+
void setup()
43+
{
44+
Serial.begin(115200);
45+
46+
while(!Serial) delay(10); // Wait for Serial to become available.
47+
// Necessary for boards with native USB (like the SAMD51 Thing+).
48+
// For a final version of a project that does not need serial debug (or a USB cable plugged in),
49+
// Comment out this while loop, or it will prevent the remaining code from running.
50+
51+
Serial.println();
52+
Serial.println("BMV080 Example 3 - Interrupt");
53+
54+
Wire.begin();
55+
56+
if (bmv080.begin(BMV080_ADDR, Wire) == false) {
57+
Serial.println("BMV080 not detected at default I2C address. Check your jumpers and the hookup guide. Freezing...");
58+
while (1)
59+
;
60+
}
61+
Serial.println("BMV080 found!");
62+
63+
// Wire.setClock(400000); //Increase I2C data rate to 400kHz
64+
65+
/* Communication interface initialization */
66+
i2c_init(&i2c_device);
67+
68+
/* Initialize the Sensor (read driver, open, reset, id etc.)*/
69+
bmv080.init(&i2c_device);
70+
71+
/* Set the sensor mode to continuous mode */
72+
// The hardware interrupt of the BMV080 sensor unit cannot be used as trigger
73+
// in duty cycling mode.
74+
if(bmv080.setMode(SFE_BMV080_MODE_CONTINUOUS) == true)
75+
{
76+
Serial.println("BMV080 set to continuous mode");
77+
}
78+
else
79+
{
80+
Serial.println("Error setting BMV080 mode");
81+
}
82+
83+
enable_external_interrupt(true);
84+
}
85+
86+
void loop()
87+
{
88+
if(int_flag == true)
89+
{
90+
Serial.println("Interrupt triggered");
91+
int_flag = false; // Reset the flag
92+
do{
93+
Serial.println("Reading BMV080");
94+
if(bmv080.dataAvailable())
95+
{
96+
float pm25 = bmv080.getPM25();
97+
Serial.print(pm25);
98+
if(bmv080.getIsObstructed() == true)
99+
{
100+
Serial.print("\tObstructed");
101+
}
102+
Serial.println();
103+
}
104+
} while (digitalRead(IRQ_Pin) == LOW);
105+
}
106+
delay(100);
107+
Serial.print(".");
108+
}
109+
110+
void enable_external_interrupt(bool enable)
111+
{
112+
int checkPin = digitalPinToInterrupt(IRQ_Pin);
113+
114+
if (checkPin == -1) {
115+
Serial.println("Not a valid interrupt pin!");
116+
}
117+
else
118+
{
119+
Serial.println("Valid interrupt pin.");
120+
}
121+
122+
pinMode(IRQ_Pin, INPUT_PULLUP);
123+
124+
if(enable)
125+
{ /* Enabel external interrupt */
126+
attachInterrupt(digitalPinToInterrupt(IRQ_Pin), gpio_isr_handler, FALLING );
127+
}
128+
else
129+
{ /* Disable external interrupt */
130+
detachInterrupt(digitalPinToInterrupt(IRQ_Pin) );
131+
}
132+
}
133+
134+
void gpio_isr_handler(void)
135+
{
136+
int_flag = true;
137+
}

0 commit comments

Comments
 (0)