TVOC Sensor
来自Waveshare Wiki
| ||||||||||||||||||||
| ||||||||||||||||||||
说明
产品简介
TVOC气体传感器模组专门设计用于精确测量环境中的TVOC(总挥发性有机化合物)气体浓度,为空气质量的评估提供了一种高效工具。其核心优势在于其卓越的适应性和可扩展性,能够根据用户的特定需求进行定制。 这款传感器模组以其卓越的性能特点而著称,包括:高灵敏度、稳定性、小型化设计、简易的测量电路、长寿命。
应用场景
- 智能家居
- 环境空气质量监测
- 车载空气净化器
- 手持空气质量检测仪
- 工厂车间新风系统
工作原理
基于气体分子与半导体材料表面的化学吸附反应,当挥发性有机物(VOC)接触加热的敏感材料时,气体分子与表面氧离子发生反应会改变材料的电阻值;通过测量电阻变化量即可间接推算周围TVOC的浓度。 气体传感器中气敏材料的电阻随着环境中气体浓度的变化而变化,TVOC 气体的浓度越大,传感器电阻就越小。其测量采用与参考电阻串联分压的电路,如图 1-2 所示的参考电路图。传感器响应大小 S 的计算公式跟参考电路如下:

产品参数
TVOC Sensor | |||
供电电压 | 5V | 逻辑电压 | 3.3V |
通信接口 | UART (TTL 信号线电平 3.3V) | 通信波特率 | 115200 |
响应时间 | <20S | 启动时间 | <120S |
检测浓度范围 | 0.1~100 ppm | 刷新率 | 1Hz |
产品尺寸 | 27×20×4.3mm | 固定孔径 | 2.0mm |
工作电流 | ≤60mA | 工作温度 | -20℃~50℃ |
工作湿度 | ≤96%RH | 使用寿命 | 5年 |
- 传感器的IO电平为3.3V,如果使用5V的IO电平,需要经过电平转换,否则传感器会损坏
引脚说明
引脚号 | 标识 | 管脚描述 |
1 | VCC | 5V 电源正 |
2 | GND | 电源地 |
3 | TXD | UART 输出 |
4 | RXD | UART 输入 |
5 | RST | 复位引脚,低电平有效 |
6 | ALM | 报警引脚,TVOC超过2ppm,引脚自动拉低 |
协议解析
UART 通信流程
- 串口默认配置为:数据位 8bit,停止位 1bit,无奇偶校验,无流控制,默认波特率 115200。
- 协议由 Frame Header(帧头)、Data(数据)、Sum Check(校验和)和 Frame Footer(帧尾)组成。
- 其中 Frame Header、Frame Footer 为固定不变的数值,具体可以查阅以下表格;
说明:协议包遵循小端模式原则,即低字节在前,高字节在后。
主动模式
- 模块默认为主动模式
- 原始数据
帧头 | 空气等级 | 保留 | CO2浓度高位 | CO2浓度低位 | CH2O浓度高位 | CH2O浓度低位 | TVOC浓度高位 | TVOC浓度低位 | 校验值 | 帧尾 |
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 | Byte9 | Byte10 |
FE | 02 | 00 | 02 | 32 | 00 | 04 | 01 | 96 | CF | 16 |
- 数据解码
- 空气等级分为优良中差,分别对于1-4等级(0x1-0x4),比如上面数据中可以得出空气等级为“良”
- CO2浓度值 = (气体浓度高位*256+气体浓度低位) ppm
- CH2O浓度值 = (气体浓度高位*256+气体浓度低位) ppb
- TVOC浓度值 = ((气体浓度高位*256+气体浓度低位)/1000) ppm
- 解析表
Data | Type | Length (Bytes) | Hex | Result |
---|---|---|---|---|
帧头 | uint8 | 1 | FE | 0xFE |
空气等级 | uint8 | 1 | 02 | 0x02 |
保留 | uint8 | 1 | 00 | * |
CO2浓度 | uint16 | 2 | 02 32 | 562 ppm |
CH2O浓度 | uint16 | 2 | 00 04 | 4 ppb |
TVOC浓度 | uint16 | 2 | 01 96 | 0.406 ppm |
校验值 | uint8 | 1 | CF | 0xCF |
帧尾 | uint8 | 1 | 16 | 0x16 |
- 恢复主动模式
- 需要切换到主动模式时,向模组发送如下命令:
帧头 | 保留 | 切换模式命令 | 主动上传模式 | 保留 | 保留 | 保留 | 保留 | 校验值 |
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 |
FE | 00 | 78 | 40 | 00 | 00 | 00 | 00 | B8 |
查询模式
- 切换到查询模式
- 需要切换到查询模式时,首先应该发送停止主动上传模式命令,命令格式如下:
帧头 | 保留 | 切换模式命令 | 主动上传模式 | 保留 | 保留 | 保留 | 保留 | 校验值 |
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 |
FE | 00 | 78 | 41 | 00 | 00 | 00 | 00 | B9 |
- 查询当前浓度
- 查询模式下,读取当前浓度命令格式如下:
帧头 | 保留 | 问答模式命令 | 保留 | 保留 | 保留 | 保留 | 保留 | 校验值 |
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 |
FE | 00 | 86 | 00 | 00 | 00 | 00 | 00 | 86 |
- 查询数据解码
- 当发送查询当前浓度的命令后,模组会返回如下数据:
帧头 | 帧头 | 帧头 | 保留 | 保留 | TVOC浓度高位 | TVOC浓度低位 | ADC值高位 | ADC值低位 | 校验值 | 帧尾 |
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 | Byte9 | Byte10 |
FE | FE | 68 | 01 | 01 | 18 | 09 | 09 | 40 | 6C | 16 |
- 数据解码
- TVOC气体浓度值 = (气体浓度高位*256+气体浓度低位)/1000
- ADC值 = (ADC值高位*256 + ADC值低位)
- 解析表
Data | Type | Length (Bytes) | Hex | Result |
---|---|---|---|---|
帧头 | uint24 | 3 | FE FE 68 | 0xFE 0xFE 0x68 |
保留 | uint16 | 2 | 00 00 | xx |
TVOC浓度 | uint16 | 2 | 18 09 | 6.153 ppm |
ADC值 | uint16 | 2 | 09 40 | 2368 |
校验值 | uint8 | 1 | 6C | 0x6C |
帧尾 | uint8 | 1 | 16 | 0x16 |
- ADC:单片机通过 ADC 采样来采集 VS 的电压值,实现输出 12 位 ADC 值,电路在工作原理处。
快速测试
- 测试软件 WS-TVOC 是 TVOC Sensor 配套的调试软件,主要作用为:快速测试
- 测试准备
- windows电脑
- USB TO TTL 1PCS
- TVOC Sensor 1PCS
- 配套线材
- 硬件连接

- 开始测试
- 把串口连接电脑 USB 口
- 等待 2 分钟,传感器预热完成
- 主动模式:
- 方式一:使用串口调试助手(SSCOM),选择好对应的端口号,波特率选115200,打开串口,则每秒上传一次数据。
- 方式二:打开配套的上位机软件
①选择对应串口号
②点击 save
③点击 get directory
④点击 Start 则可直观查看实时数据和曲线。
如果想要查看所有历史数据,⑤点击 save,则可在 DataFile中看到源文件。
- 方式一:使用串口调试助手(SSCOM),选择好对应的端口号,波特率选115200,打开串口,则每秒上传一次数据。
产品尺寸
树莓派使用
- 关于树莓派系统安装与使用可以参考这个链接。
- 成功开机后,进行树莓派环境配置
下载程序
sudo apt install gpiod libgpiod-dev wget https://www.waveshare.net/w/upload/c/c6/TVOC_Sensor_Demo.zip unzip TVOC_Sensor_Demo.zip cd TVOC_Sensor_Demo/
UART示例使用
开启树莓派 UART
- 在树莓派终端输入命令:sudo raspi-config nonint do_serial 2
- 再弹出的窗口中第一个选择NO,第二个选择YES,最后选择OK.
硬件连接
- 参考下图进行连接:
运行C程序
cd ~/TVOC_Sensor_Demo/Raspberrypi/c/ make ./main
运行Python程序
cd ~/TOF_Laser_Range_Sensor_demo/Raspberrypi/python/example python main.py
ESP32S3使用
硬件连接
- 参考下图进行连接:
Arduino esp32示例使用
- 进入到TVOC_Sensor_Demo\ESP32S3\Arduino\TVOC_UART_Demo,双击TVOC_UART_Demo.ino文件
- 选择开发板:
- 选择ESP32S3的端口,然后进行编译上传
- 上传完成后,打开串口监测器,就会输出相关的信息。
Micropython示例使用
- 进入到TVOC_Sensor_Demo\ESP32S3\Micropython,双击TVOC_UART_Demo.py文件
- 选择开发板:
- 选择ESP32S3的端口,然后运行程序
- Shell就会输出相关的信息。
Raspberrypi Pico使用
- 关于Raspberrypi Pico的环境搭建跟基本使用,请参考这个Pico开发环境搭建。
- 环境搭建完成后,即可连接传感器,下载示例
硬件连接
- 参考下图进行连接:
C 示例使用
- 进入到TVOC_Sensor_Demo\Raspberrypi pico\C,通过VS Code打开工程
- 等待自动导入跟加载编译工具,然后进行编译上传
- 上传完成后,打开串口监测器,就会输出相关的信息。
Micropython示例使用
- 先给Raspberrypi Pico刷入micropython固件
- 进入到TVOC_Sensor_Demo\Raspberrypi pico\Micropython,双击TVOC_UART_Demo.py文件
- 选择开发板:
- 选择Raspberrypi pico的端口,然后运行程序
- Shell就会输出相关的信息。
Arduino使用
- Arduino开发板的IO电平必须为3.3V,如果使用5V的IO电平,需要经过电平转换,否则传感器会损坏
- 使用waveshare R3/R4需要将以下的跳线帽设置成3.3V,才能使用
Arduino示例使用
硬件连接
- 参考下图进行连接:
运行程序
- 进入到TVOC_Sensor_Demo\Arduino\TVOC_UART_Demo,双击TVOC_UART_Demo.ino文件
- 选择开发板:
- 选择开发板的端口,然后进行编译上传
- 上传完成后,打开串口监测器,就会输出相关的信息。
STM32使用
- 关于STM32的环境搭建跟基本使用,请参考这个STM32开发环境搭建。
- 环境搭建完成后,即可连接传感器,下载示例
硬件连接
- 参考下图进行连接:
STM32示例使用
- 进入到TVOC_Sensor_Demo\STM32,双击打开.project文件
- 等待自动导入跟加载,然后进行编译烧录
- 上传完成后,连接单片机的PA2 PA3就可以输出相关信息
API简介
- tvoc_init() TVOC初始化
- tvoc_set_device_active_mode() 将传感器设置成主动模式
- tvoc_set_device_query_mode() 将传感器设置成查询模式
- tvoc_get_active_device_data() 获取主动模式的数据,并进行解码
- tvoc_get_query_device_data() 获取查询模式数据,并进行解码
- CRC_Check(uint8_t *Data, uint32_t Size) 计算校验和,模块输出的数据只需要校验Byte 3+Byte4+……+Byte8的值,主机发送给模块的数据校验为Byte 1+Byte2+……+Byte 7
效果展示
主动模式
- 主动模式下,可以输出空气等级、CO2、CH2O和TVOC的值
查询模式
- 查询模式下,可以输出TVOC的值和原始ADC的值
ALM报警
- ALM报警,可以通过IO读取实现,具体表现如下
FAQ
Q1. 上位机不更新数据,怎么回事?
如果出现数据不更新,请重启一下上位机,按照步骤进行操作即可重新获取
Q2. 波特率是固定115200吗?
是的,目前默认是115200波特率。