CCS811 digital gas sensor and LINKIT example
In this article we will connect a CCS811 gas sensor to a Linkit One and we will create an example using the Arduino IDE to display the values via web page and also a version which displays values on a web page
CCS811 is a low-power digital gas sensor solution, which integrates a gas sensor solution for detecting low levels of VOCs typically found indoors, with a microcontroller unit (MCU) and an Analog-to-Digital converter to monitor the local environment and provide an indication of the indoor air quality via an equivalent CO2 or TVOC output over a standard I2C digital interface.
Features
Integrated MCU
On-board processing
Standard digital interface
Optimised low power modes
IAQ threshold alarms
Programmable baseline
2.7mm x 4.0mm LGA package
Low component count
Proven technology platform
Specs
Interface | I²C |
---|---|
Supply Voltage [V] | 1.8 to 3.6 |
Power Consumption [mW] | 1.2 to 46 |
Dimension [mm] | 2.7 x 4.0 x 1.1 LGA |
Ambient Temperature Range [°C] | -40 to 85 |
Ambient Humidity Range [% r.h.] | 10 to 95 |
Parts List
Amount | Part Type |
---|---|
1 | CJMCU-811 CCS811 Air Quality Gas Sensor |
1 | LinkIt ONE MT2502A wireless 2503 development board |
Schematics/Layout
Remember and connect WAKE to gnd


Code
Again we use a library – the adafruit CCS811 one, you can add this in the library manager
And this is the out of the box example
#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;
void setup()
{
Serial.begin(9600);
Serial.println("CCS811 test");
if(!ccs.begin())
{
Serial.println("Failed to start sensor! Please check your wiring.");
while(1);
}
//calibrate temperature sensor
while(!ccs.available());
float temp = ccs.calculateTemperature();
ccs.setTempOffset(temp - 25.0);
}
void loop()
{
if(ccs.available())
{
float temp = ccs.calculateTemperature();
if(!ccs.readData())
{
Serial.print("CO2: ");
Serial.print(ccs.geteCO2());
Serial.print("ppm, TVOC: ");
Serial.print(ccs.getTVOC());
Serial.print("ppb Temp:");
Serial.println(temp);
}
else
{
Serial.println("ERROR!");
while(1);
}
}
delay(500);
}
Output
Open the serial monitor – this is what I saw. The higher CO2 level was when I breathed on the sensor
CO2: 400ppm, TVOC: 0ppb Temp:24.25
CO2: 400ppm, TVOC: 0ppb Temp:25.00
CO2: 400ppm, TVOC: 0ppb Temp:25.38
CO2: 1012ppm, TVOC: 93ppb Temp:25.38
CO2: 424ppm, TVOC: 3ppb Temp:25.00
CO2: 400ppm, TVOC: 0ppb Temp:25.38
CO2: 400ppm, TVOC: 0ppb Temp:24.25
CO2: 400ppm, TVOC: 0ppb Temp:13.68
WIFI Example
There are 3 lines that will/may need changed for your Wifi details
#define WIFI_AP "wifi ssid here" #define WIFI_PASSWORD "password here" #define WIFI_AUTH LWIFI_WPA The last one you can select from from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP according to your WiFi AP configuration
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiServer.h>
#include <LWiFiClient.h>
#include "Adafruit_CCS811.h"
#define WIFI_AP "wifi ssid here"
#define WIFI_PASSWORD "password here"
#define WIFI_AUTH LWIFI_WPA
Adafruit_CCS811 ccs;
LWiFiServer server(80);
void setup()
{
LTask.begin();
LWiFi.begin();
Serial.begin(9600);
if(!ccs.begin())
{
Serial.println("Failed to start sensor! Please check your wiring.");
//calibrate temperature sensor
while(!ccs.available());
float temp = ccs.calculateTemperature();
ccs.setTempOffset(temp - 25.0);
}
// keep retrying until connected to AP
Serial.println("Connecting to AP");
while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
{
delay(1000);
}
printWifiStatus();
Serial.println("Start Server");
server.begin();
Serial.println("Server Started");
}
int loopCount = 0;
void loop()
{
// put your main code here, to run repeatedly:
delay(500);
loopCount++;
LWiFiClient client = server.available();
if (client)
{
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
unsigned long timer_out = millis();
while (client.connected())
{
if(millis()-timer_out > 5000)break;
if (client.available())
{
// we basically ignores client request, but wait for HTTP request end
int c = client.read();
Serial.print((char)c);
if (c == '\n' && currentLineIsBlank)
{
Serial.println("send response");
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
if(ccs.available())
{
float temp = ccs.calculateTemperature();
if(!ccs.readData())
{
client.print("CO2: ");
client.print(ccs.geteCO2());
client.print("ppm, TVOC: ");
client.print(ccs.getTVOC());
client.print("ppb Temp:");
client.println(temp);
}
else
{
client.println("ERROR!");
while(1);
}
}
break;
}
if (c == '\n')
{
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r')
{
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(500);
// close the connection:
Serial.println("close connection");
client.stop();
Serial.println("client disconnected");
}
}
void printWifiStatus()
{
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(LWiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = LWiFi.localIP();
Serial.println("Please open your browser, and input the following address:");
Serial.println(ip);
Serial.print("\r\nsubnet mask: ");
Serial.println(LWiFi.subnetMask());
Serial.print("gateway IP: ");
Serial.println(LWiFi.gatewayIP());
// print the received signal strength:
long rssi = LWiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
This example has test code to help you out – the printWifiStatus function, open up the USB Modem Port – not the programming port. You should see a message like this
Connecting to AP
SSID: your ssid here
Please open your browser, and input the following address:
192.168.1.15
Now open the IP address above using your favourite web browser and you should see something like this
CO2: 564ppm, TVOC: 24ppb Temp:91.23
Links
CJMCU-811 CCS811 Air Quality Gas Sensor
Comments are closed, but trackbacks and pingbacks are open.