Example Code for Arduino-Concentration Alarm
Input the baseline value to the function `sensor.writeBaseLine();` Upload it to UNO, when the CO2 concentration moves from the current range (low, medium, high) to another range (more than 50 ppm), an interruption is generated and the current CO2 value will be printed. **NOTE: This example requires the INT pin of the sensor to be connected to the corresponding interrupt pin on the main board (in the sample, D2 of UNO is selected).**
Hardware Preparation
- DFRduino UNO R3 (or similar) x 1
- Gravity: CCS811 Air Quality Sensor x 1
- Jumper wires
Software Preparation
- Arduino IDE
- Download and install the CCS811 Library and examples. (About how to install the library?)
Wiring Diagram

Other Preparation Work
NOTE: This example requires the INT pin of the sensor to be connected to the corresponding interrupt pin on the main board (in the sample, D2 of UNO is selected).
AVR Series Interrupt Pin and Interrupt Number
Please run the sensor for 48hours when using it for the first time.
| 328 Mainboards: Uno, Nano, Mini... | Mega2560 | 32u4 Mainboards: Leonardo... | |
|---|---|---|---|
| Interrupt Pin | D2, D3 | D2, D3, D21, D20, D19, D18 | D3, D2, D0, D1, D7 |
| Interrupt Number | 0, 1 | 0, 1, 2, 3, 4, 5 | 0, 1, 2, 3 ,4 |
Sample Code
/*!
* @file setInterrupt.ino
* @brief Set interrupt parameter, when CO2 concentration range changes, get an interrupt
* @n Experiment phenomenon: read data every 1s, and print it out on serial port.
*
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [LuoYufeng]([email protected])
* @version V1.0
* @date 2019-07-13
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_Sensor
*/
#include "DFRobot_CCS811.h"
volatile int8_t GPIO1TRIG = 0;
/*
* IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
*/
//DFRobot_CCS811 CCS811(&Wire, /*IIC_ADDRESS=*/0x5A);
DFRobot_CCS811 CCS811;
void setup(void)
{
Serial.begin(115200);
/*wait for the chip to be initialized completely, and then exit*/
while(CCS811.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
attachInterrupt(0, interrupt, RISING);
/**
* @brief Measurement parameter configuration
* @param mode:in typedef enum{
* eClosed, //Idle (Measurements are disabled in this mode)
* eCycle_1s, //Constant power mode, IAQ measurement every second
* eCycle_10s, //Pulse heating mode IAQ measurement every 10 seconds
* eCycle_60s, //Low power pulse heating mode IAQ measurement every 60 seconds
* eCycle_250ms //Constant power mode, sensor measurement every 250ms 1xx: Reserved modes (For future use)
* }eCycle_t;
* @param thresh:0 for Interrupt mode operates normally; 1 for interrupt mode only asserts the nINT signal (driven low) if the new
* @param interrupt:0 for Interrupt generation is disabled; 1 for the nINT signal is asserted (driven low) when a new sample is ready in
*/
CCS811.setMeasurementMode(CCS811.eCycle_250ms, 1, 1);
/**
* @brief Set interrupt thresholds
* @param lowToMed: interrupt triggered value in range low to middle
* @param medToHigh: interrupt triggered value in range middle to high
*/
CCS811.setThresholds(1500,2500);
}
void loop() {
if(GPIO1TRIG == 1){
Serial.println("CO2 range has changed");
Serial.print("CO2: ");
Serial.print(CCS811.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(CCS811.getTVOCPPB());
Serial.println("ppb");
delay(1000);
}
GPIO1TRIG = 0;
Serial.print("CO2: ");
Serial.print(CCS811.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(CCS811.getTVOCPPB());
Serial.println("ppb");
CCS811.writeBaseLine(0x447B);
delay(1000);
}
void interrupt(){
GPIO1TRIG = 1;
}
Result

Was this article helpful?
