How to use VOC-LP TAG

Hello all,

I bought a few VOC-LP tags recently.
I planned to used them with a board which is deviation of esp32-s2.
I’m using esp-idf framework for programming.

However it seems that isn’t really easy to do it so :smile_cat:
I found two open source libs 1, 2 for sensor SGP30.
For some reason any of these don’t work properly with VOC-LP TAG.

Both were failing when readings measured values. I started to debug 2nd lib. I figure-out that the issue was with wait interval/delay between sending the i2c command to sensor and reading it:

FYI it seems that delay should be higher in all commands for VOC-LP TAG.
Once I adjusted the ESP lib to match TWR delay it stopped failing.
I was running measurements for 25 hours in my test script / app.
eCO2 values were fluctuating between 10-30 so it seems to work somehow but TVOC values were 65535 ppb all the time. It is worth to mention that I didn’t set any humidity before measurement.

I have a few questions in my mind. It would be super cool if somebody would find the time to help me find answers:

  1. VOC-LP TAG has 5 pins. 4 of them are common for i2c sensors but I’m not familiar with the pin marked as INT. Does this INT pin needs to be connected to the board for measurements ? if so how to use it :face_with_diagonal_mouth:
  2. VOC-LP TAG has really low power consumption. It should be around 0.065 mA per info from ESHOP. How is it possible that it is so effective ? In comparison VOC TAG and original SGP30 sensor claim power consumption around 48 mA. I’m asking whether I had to do something special in order to achieve such low power consumption.
  3. I noticed state TWR_SGPC3_STATE_SET_POWER_MODE
    in TWR lib. However it isn’t called within the file. So I wonder what it should be used for ?
  4. Do you have any idea why my measurements were 65535 ppb all the time in my case?
  5. I also noticed that TWR lib always expect to set humidity TWR_SGPC3_STATE_SET_HUMIDITY after init state - link. Is it expected that this VOC-LP TAG always run by side with some humidity sensor / TAG ?
  6. I planned to disconnect VOC-LT TAG from power every time after measurements e.g. to do measurements in intervals. Is it OK strategy for VOC-LP TAG?

Looking forward to your replies.


Hello Adrian,

  1. On this TAG, the INT interrupt pin is unconnected. See bc-hardware/bc-tag-voc-rev-1-0-sch.pdf at master · hardwario/bc-hardware · GitHub
  2. 65 uA is the sleep current. You have to also add some uA because on that VOC-LP TAG there is also an LDO chip. See schematic above.
  3. You are right, this state seems like is not used in our SDK. You can track the function based on a command that is sent to the sensor.. I’m not able to help you more.
  4. 65535 is the maximal uint16 value. So it might be because conversion or some command wasn’t triggered? You’ll have to dig deeper into the original datasheet.
  5. According to the datasheet you can run without humidity compensation
  6. The sensor needs at least 24 hours to display reliable data. So I don’t think that power cycling is right way to save power.

I would rather suggest studying the original datasheet than sticking with our SDK implementation.

Hi @hub.martin ,

First of all thx for reply.

I spend several hours on it during Easter holiday :slight_smile: … I was reading datasheet, code, testing, etc and here are some notes …

It seems that VOC-LP TAG doesn’t use SGP30 sensor but SGPC3. The sensors are similar but the later one provides TVOC values only. Links to datasheets just for the reference: SGP30, SGPC3.

There are actually two separate TWR libs for these sensors. I noticed these differences as far my concern is going:

  • sgpc.c uses init command { 0x20, 0xae }; but sgp30.c uses { 0x20, 0x03 };.
  • sgpc.c reads only TVOC value from measurement, sgp30.c reads both TVOC and eCO2.
  • Now I understand why this tag is called low power one because sgpc3 has two power modes: lower power and ultra-low power:
The SGPC3 offers two operation modes with different power consumptions and sampling intervals. The low-power mode with
1mA average current and 2s sampling interval and the ultra-low power mode with 0.065mA average current and 30s sampling
interval. By default, the SGPC3 is using the low-power mode.

Looking back on your reply to 2nd point:

65 uA is the sleep current. You have to also add some uA because on that VOC-LP TAG there is also an LDO chip. See schematic above.

Now we know that 65 uA refers to the consumption in ultra-low power mode.

Some questions to think about:

  • It seems that TWR lib doesn’t enable ultra-low power mode. Maybe the reason was to don’t affect sensor accuracy? There is a warning in sgpc3 datasheet but I’m not quite sure whether the accuracy is affected also when ultra-low mode is enabled:
It is recommended to test the two modes on different SGPC3 sensors, as switching the power mode back and forth with the
same sensor will impact sensor accuracy. 
  • Currently I’m not sure if VOC-LP TAG reports TVOC values in range 0 ppb to 60000 ppb as defined in sgpc3 datasheet or it provides some indexed values. There is some table on VOC-LP TAG eshop page. Does this table provides some indexes or it just describes 0-60000 ppb range?

TLDR it seems that ESP lib somehow works with VOC-LP tag after adjustments because sgpc3 provides only one value (TVOC) but I/It expects two as it was designed for SGP30. So value ** 65535 I referenced above is just redundant one for sgpc3 sensor.


Now I see that I linked the wrong schematics of “VOC” and not “VOC-LP”. Sorry for the confusion.

The sensor is not put to sleep between measurements, because after wake-up, it needs at least 24 hours to calibrate. And our projects send values a few times every hour.

The sensor should reply with 0 ppb to 60000 ppb , which nicely fits that 16-bit value/register. The table on our e-shop is there just for illustration.