SGP30 TVOC/eCO2 Gas Sensor Datasheet by Adafruit Industries LLC

View All Related Products | Download PDF Datasheet
:2- adafruit learning system
Adafruit SGP30 TVOC/eCO2 Gas Sensor
Created by lady ada
Last updated on 2019-04-05 04:24:37 PM UTC
Overview
Breathe easy with the SGP30 Multi-Pixel Gas Sensor, a fully integrated MOX gas sensor. This is a very fine air quality
sensor from the sensor experts at Sensirion, with I2C interfacing and fully calibrated output signals with a typical
accuracy of 15% within measured values. The SGP combines multiple metal-oxide sensing elements on one chip to
provide more detailed air quality signals.
This is a gas sensor that can detect a wide range of Volatile Organic Compounds (VOCs) and H2 and is intended for
indoor air quality monitoring. When connected to your microcontroller (running our library code) it will return a Total
Volatile Organic Compound (TVOC) reading and an equivalent carbon dioxide reading (eCO2) over I2C.
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 3 of 19
The SGP30 has a 'standard' hot-plate MOX sensor, as well as a small microcontroller that controls power to the plate,
reads the analog voltage, tracks the baseline calibration, calcluates TVOC and eCO2 values, and provides an I2C
interface to read from. Unlike the CCS811, this sensor does not require I2C clock stretching.
This part will measure eCO2 (equivalent calculated carbon-dioxide) concentration within a range of 400 to 60,000
parts per million (ppm), and TVOC (Total Volatile Organic Compound) concentration within a range of 0 to 60,000
parts per billion (ppb).
Please note, this sensor, like all VOC/gas sensors, has variability and to get precise measurements you will want to
calibrate it against known sources! That said, for general environmental sensors, it will give you a good idea of trends
and comparison. The SGP30 does have built in calibration capabilities, note that eCO2 is calculated based on H2
concentration, it is not a 'true' CO2 sensor for laboratory use.
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 4 of 19
,~\a "alrfih! ' \ ; v $61336 V ‘l10X_ Gas Sensor Uin: 1. 8- SUDC ‘Ulnu {(31.8- SUDC } EGG “$35755
Another nice element to this sensor is the ability to set humidity compensation for better accuracy. An external
humidity sensor is required and then the RH% is written over I2C to the sensor, so it can better calculate the
TVOC/eCO2 values.
For your convenience we've pick-and-placed the sensor on a PCB with a 1.8V regulator and some level shifting so it
can be easily used with your favorite 3.3V or 5V microcontroller.
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 5 of 19
" we ‘ s""CL
Pinouts
Power Pins:
Vin - this is the power pin. Since the sensor chip uses 3 VDC for logic, we have included a voltage regulator on
board that will take 3-5VDC and safely convert it down. To power the board, give it the same power as the logic
level of your microcontroller - e.g. for a 5V micro like Arduino, use 5V
1V8 - this is the 1.8V output from the voltage regulator, you can grab up to 50mA from this if you like
GND - common ground for power and logic
Data Pins
SCL - I2C clock pin, connect to your microcontrollers I2C clock line. Can use 3V or 5V logic, and has a 10K pullup
to Vin
SDA - I2C data pin, connect to your microcontrollers I2C data line. Can use 3V or 5V logic, and has a 10K pullup
to Vin
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 6 of 19
Arduino Test
You can easily wire this breakout to any microcontroller; we'll be using an Arduino.
Start by soldering the headers to the SGP30 breakout board. Check out the Adafruit guide to excellent
soldering (https://adafru.it/dxy) if you're new to soldering. Then continue on below to learn how to wire it to a Metro.
The sensor uses I2C address 0x58 and cannot be changed.
Wiring
Connect the SGP30 breakout to your board using an I2C connection. Here's an example with an Arduino-compatible
Metro:
Board 5V to Sensor Vin. (Metro is a 5V logic
chip)
Board ground / GND to sensor ground / GND.
Board SCL to sensor SCL.
Board SDA to sensor SDA.
https://adafru.it/At6
https://adafru.it/At6
Install Adafruit_SGP30 library
To begin reading sensor data, you will need to install the Adafruit_SGP30 library (code on our github
repository) (https://adafru.it/BnZ). It is available from the Arduino library manager so we recommend using that.
From the IDE open up the library manager...
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 7 of 19
m [an m 1am; Help Vuify/Compik cum: A “Pb“ CW" Manage Lihmis... “9'“ Upload Using Programing! CMoshimu r’l Dem awn wmpikd Binuly CM~AII9$ A“ 1" WW“ ‘ Ilnclud 5m 5km, Fold" CWK Arduma “mung ' mama Indud: mm, ArdumoHIwCflem llnclud ' m m" AldullmSound .1“an ,r/ u: ugh: one plxe] at a an, mu 1: an . , A. midn- 9 ”my Mm," may. 4MP. VH5“ WE‘VE-Sum by mam Lu xvsIAuEn : magma-ni—u‘msmiml ”Mann—7M; .3." Muir. itx-ry «a 1»: Manama a“, .. qua», an... / Mme m [an Skekh Tank Hdp A Exampls . . , a” (WW Mahun m Llhury 5m GM Mama 56m Sam 59me Adah-m SHARP Memnry Display r SaveAs... (Mosnims V V Mifnm m llbnly r @con ‘ ' M scum my: mm Saran “m; Manama :1 mm um mm E E mmimii gaasafiaaaaaa % g
And type in adafruit sgp30 to locate the library. Click Install
Load Demo
Open up File->Examples->Adafruit_SGP30->sgp30test and upload to your microcontroller wired up to the sensor
Then open up the serial console at 9600 baud, you'll see the serial number printed out - this is a unique 48-bit number
burned into each chip. Since you may want to do per-chip calibration, this can help keep your calibration detail
separate
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 8 of 19
us m an ppm ma can no ppm 43: van «a pm 45: pp: 454 am am: nxflElS s IVOC: mam 453 um an ppm lea mu m: pm :91 min 492 pm 459 pp: 465 pm EEESEEEE D 7 mm In) 5 mm m a m: m 1 mm m 9 mm um us pph 7w mum: mm mm pp- 212.5 pp» .5552 mu m: m I195 m- 25:16 pph 15.9 man 1791: pph 1117 pph m: pph 139a pph m EEEEEESEEfiEEEEE
The first 10-20 readings will always be TVOC 0 ppb eCO2 400 ppm . That's because the sensor is warming up, so it will
have 'null' readings.
After a few seconds, you will see the TVOC and eCO2 readings fluctuate:
Every minute or so you'll also get a Baseline value printed out. More about that later!
You can take a bit of alcohol on a swap and swipe it nearby to get the readings to spike
That's it! The sensor pretty much only does that - all the calculations for the TVOC and eCO2 are done within the
sensor itself, no other data is exposed beyond the 'baseline' values
Baseline Set & Get
All VOC/gas sensors use the same underlying technology: a tin oxide element that, when exposed to organic
compounds, changes resistance. The 'problem' with these sensors is that the baseline changes, often with humidity,
temperature, and other non-gas-related-events. To keep the values coming out reasonable, you'll need to calibrate the
sensor.
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 9 of 19
If no stored baseline is available after initializing the baseline algorithm, the sensor has to run for 12 hours until the
baseline can be stored. This will ensure an optimal behavior for preceding startups. Reading out the baseline prior
should be avoided unless a valid baseline is restored first. Once the baseline is properly initialized or restored, the
current baseline value should be stored approximately once per hour. While the sensor is off, baseline values are
valid for a maximum of seven days.
Restarting the sensor without reading back a previously stored baseline will result in the sensor trying to
determine a new baseline. The adjustement algorithm will be accelerated for 12hrs which is the Maximum time
required to find a new baseline.
The sensor adjusts to the best value it has been exposed to. So keeping it indoors the sensor thinks this is the
best value and sets it to ~0ppb tVOC and 400ppm CO2eq. As soon as you expose the sensor to outside air it can
adjust to the global H2 Background Signal. For normal Operation exposing the sensor to outside air for 10min
cumulative time should be sufficient.
If you're experienced with sensors that don't have a baseline, you either won't be able to measure absolute
values or you'll have to implement your own baseline algorithm.
The sensor to sensor variation of SGP30 in terms of sensitivity is very good as each of them is calibrated. But the
baseline has to be determined for each sensor individually during the first Operation.
To make that easy, SGP lets you query the 'baseline calibration readings' from the sensor with code like this:
This will grab the two 16-bit sensor calibration words and place them in the variables so-named.
You should store these in EEPROM, FLASH or hard-coded. Then, next time you start up the sensor, you can pre-fill the
calibration words with sgp.setIAQBaseline(
eCO2_baseline
,
TVOC_baseline
);
uint16_t TVOC_base, eCO2_base;
sgp.getIAQBaseline(&eCO2_base, &TVOC_base);
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 10 of 19
Arduino Library Docs
Arduino Library Docs (https://adafru.it/AuL)
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 11 of 19
a... «r :ziny
Python & CircuitPython Test
It's easy to use the SGP30 sensor with Python or CircuitPython and the Adafruit CircuitPython
SGP30 (https://adafru.it/Bn-) module. This module allows you to easily write Python code that reads the TVOC, eCO2,
and more from the sensor.
You can use this sensor with any CircuitPython microcontroller board or with a computer that has GPIO and Python
thanks to Adafruit_Blinka, our CircuitPython-for-Python compatibility library (https://adafru.it/BSN).
CircuitPython MicroController Wiring
Connect the SGP30 breakout to your board using an I2C connection, exactly as shown on the previous page for
Arduino. Here's an example with a Feather M0:
Board 3.3V to sensor Vin (Feather is 3.3V logic)
Board ground / GND to sensor ground / GND.
Board SCL to sensor SCL.
Board SDA to sensor SDA.
https://adafru.it/At8
https://adafru.it/At8
Python Computer Wiring
Since there's
dozens
of Linux computers/boards you can use we will show wiring for Raspberry Pi. For other platforms,
please visit the guide for CircuitPython on Linux to see whether your platform is supported (https://adafru.it/BSN).
Here's the Raspberry Pi wired with I2C:
Pi 3V3 to sensor VIN
Pi GND to sensor GND
Pi SCL to sensor SCL
Pi SDA to sensor SDA
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 12 of 19
CircuitPython Installation of SGP30 Library
To use the SGP30 you'll need to install the Adafruit CircuitPython SGP30 (https://adafru.it/Bn-) library on your
CircuitPython board.
First make sure you are running the latest version of Adafruit CircuitPython (https://adafru.it/Amd) for your board.
Next you'll need to install the necessary libraries to use the hardware--carefully follow the steps to find and install these
libraries from Adafruit's CircuitPython library bundle (https://adafru.it/zdx). Our introduction guide has a great page on
how to install the library bundle (https://adafru.it/ABU) for both express and non-express boards.
Remember for non-express boards like the, you'll need to manually install the necessary libraries from the bundle:
adafruit_sgp30.mpy
adafruit_bus_device
You can also download the adafruit_sgp.mpy from its releases page on Github (https://adafru.it/Bo0).
Before continuing make sure your board's lib folder or root filesystem has
the adafruit_sgp30.mpy, and adafruit_bus_device files and folders copied over.
Next connect to the board's serial REPL (https://adafru.it/Awz)so you are at the CircuitPython >>> prompt.
Python Installation of SGP30 Library
You'll need to install the Adafruit_Blinka library that provides the CircuitPython support in Python. This may also
require enabling I2C on your platform and verifying you are running Python 3. Since each platform is a little different,
and Linux changes often, please visit the CircuitPython on Linux guide to get your computer
ready (https://adafru.it/BSN)!
Once that's done, from your command line run the following command:
sudo pip3 install adafruit-circuitpython-sgp30
If your default Python is version 3 you may need to run 'pip' instead. Just make sure you aren't trying to use
CircuitPython on Python 2.x, it isn't supported!
CircuitPython & Python Usage
To demonstrate the usage of the sensor we'll initialize it and read the eCO2 and TVOC data and print it to the REPL
Save this example sketch as main.py on your CircuitPython board:
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 13 of 19
mam-mm ssvse senal : wean 'bes7s'] cozeq : 499 ppm TVOC : 0 Dub cozeq 45a ppm TVOC ppb cozeq ace ppm TVOC - ppb cozeq 400 ppm 1VOC - ppb cozeq 460 ppm TVOC pup cozeq 400 ppm TVOC ppb cozeq = we pm No: - ppb cozeq - 400 ppm no: - - ppb (Mm 499 ppm TVOC - ppb 400 ppm TVOC = 0 ppb 490 pm we: ppb “u Easehne values: cozeq - exams, TVCC - exsaae :ozeq : 4m ppm TVOC : 9 ppb (Ozeq 490 ppm TVOC 0 ppb (ozeq 400 ppm we: ppb c0254 7 490 ppm No: 7 174 pph nae ppm TVOC ms pph 490 ppm TVOC 652 ppb _ Arie ppm 1V0: . 549 ppb 469 ppm won 539 pph
In the REPL you'll see the serial number printed out: [0x0, 0x64, 0xb878] in this case. This is a unique 48-bit number
burned into each chip. Since you may want to do per-chip calibration, this can help keep your calibration detail
separate
The first 10-20 readings will always be eCO2 400 ppm TVOC 0 ppb . That's because the sensor is warming up, so it
will have 'null' readings.
After a few seconds, you will see the TVOC and eCO2 readings fluctuate
Every minute or so you'll also get a Baseline value printed out. More about that later!
""" Example for using the SGP30 with CircuitPython and the Adafruit library"""
import time
import board
import busio
import adafruit_sgp30
i2c = busio.I2C(board.SCL, board.SDA, frequency=100000)
# Create library object on our I2C port
sgp30 = adafruit_sgp30.Adafruit_SGP30(i2c)
print("SGP30 serial #", [hex(i) for i in sgp30.serial])
sgp30.iaq_init()
sgp30.set_iaq_baseline(0x8973, 0x8aae)
elapsed_sec = 0
while True:
print("eCO2 = %d ppm \t TVOC = %d ppb" % (sgp30.eCO2, sgp30.TVOC))
time.sleep(1)
elapsed_sec += 1
if elapsed_sec > 10:
elapsed_sec = 0
print("**** Baseline values: eCO2 = 0x%x, TVOC = 0x%x"
% (sgp30.baseline_eCO2, sgp30.baseline_TVOC))
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 14 of 19
Cozeq = 400 ppm TVOC = 0 ppb C02eq = 400 ppm TVOC = 0 ppb COZeq = 400 ppm TVOC = 0 ppb COZeq = 400 ppm TVOC = 0 ppb AAA! Baseline Values: COZeq = 0x8973, TVOC = oxsabl Cozeq = 400 ppm TVOC = 0 ppb COZeq = 60000 ppm TVOC = 60000 ppb Cozeq = 38277 ppm TVOC = 13302 ppb COZeq 3208 ppm TVOC 307s ppb COZeq = 994 ppm TVOC = 1638 ppb COZeq - 415 ppm TVOC - 799 ppb COZEq 400 ppm TVOC 663 ppb Cozeq = 400 ppm TVOC = 666 ppb
You can take a bit of alcohol on a swap and swipe it nearby to get the readings to spike
That's it! The sensor pretty much only does that - all the calculations for the TVOC and eCO2 are done within the
sensor itself, no other data is exposed beyond the 'baseline' values
Baseline Set & Get
All VOC/gas sensors use the same underlying technology: a tin oxide element that, when exposed to organic
compounds, changes resistance. The 'problem' with these sensors is that the baseline changes, often with humidity,
temperature, and other non-gas-related-events. To keep the values coming out reasonable, you'll need to calibrate the
sensor.
If no stored baseline is available after initializing the baseline algorithm, the sensor has to run for 12 hours until the
baseline can be stored. This will ensure an optimal behavior for preceding startups. Reading out the baseline prior
should be avoided unless a valid baseline is restored first. Once the baseline is properly initialized or restored, the
current baseline value should be stored approximately once per hour. While the sensor is off, baseline values are
valid for a maximum of seven days.
Restarting the sensor without reading back a previously stored baseline will result in the sensor trying to
determine a new baseline. The adjustement algorithm will be accelerated for 12hrs which is the Maximum time
required to find a new baseline.
The sensor adjusts to the best value it has been exposed to. So keeping it indoors the sensor thinks this is the
best value and sets it to ~0ppb tVOC and 400ppm CO2eq. As soon as you expose the sensor to outside air it can
adjust to the global H2 Background Signal. For normal Operation exposing the sensor to outside air for 10min
cumulative time should be sufficient.
If you're experienced with sensors that don't have a baseline, you either won't be able to measure absolute
values or you'll have to implement your own baseline algorithm.
The sensor to sensor variation of SGP30 in terms of sensitivity is very good as each of them is calibrated. But the
baseline has to be determined for each sensor individually during the first Operation.
To make that easy, SGP lets you query the 'baseline calibration readings' from the sensor with code like this:
This will grab the two 16-bit sensor calibration words and place them in the variables so-named.
co2eq_base, tvoc_base = sgp30.baseline_co2eq, sgp30.baseline_tvoc
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 15 of 19
You should store these in EEPROM, FLASH or hard-coded. Then, next time you start up the sensor, you can pre-fill the
calibration words with sgp30.set_iaq_baseline(
co2eq_base
,
tvoc_base
)
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 16 of 19
Python Library Docs
Python Library Docs (https://adafru.it/C3c)
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 17 of 19
1 2 a < s="" e="" m="" e="" e="" o="" 0="" m.="" mrnuxr="" mnusmlss="" jam="" um="" um:="" m="" m“="" a="" t‘tz="" ,="" a="" una="" m="" m="" ,="" mum="" was="" an="" mm="" w.="" nu:="" swan="" m="" a="" \vnaz:="" m="" a="" ‘="" 4="" a="" ‘="" s="">
Download
Files:
SGP30 Datasheet (https://adafru.it/Bo1)
Fritzing object in Adafruit Fritzing library (https://adafru.it/aP3)
Schematic & Fabrication Print
© Adafruit Industries https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor Page 18 of 19
© Adafruit Industries Last Updated: 2019-04-05 04:24:37 PM UTC Page 19 of 19

Products related to this Datasheet

SGP30 AIR QUALITY SENSOR BREAKOU