物联网AI MicroPython传感器学习 之 CCS811空气质量检测传感器
学物联网,来万物简单IoT物联网!!
一、产品简介
通过CCS811传感器模块可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2(二氧化碳)浓度,作为衡量空气质量(IAQ)的指标。

引脚定义
- VCC:3.3V
- GND:接地
- SCL:I2C时钟
- SDA:I2C数字
- WAK:接地
- INT:NC(阈值中断引脚)
- RST:NC(复位引脚)
- ADD:NC
二、技术参数
- 供电电压:3.3V
- 接口:I2C接口
- 分辨率:14位
- 工作电流:20mA
- 睡眠模式的电流:3uA
- 模块尺寸:15mm * 21mm
三、软件接口
CCS811(i2cObj) - 创建CCS811驱动对象
- 函数原型:
ccs811Obj = CCS811(i2cObj)
- 参数说明:
| 参数 | 类型 | 必选参数? | 说明 |
|---|---|---|---|
| i2cObj | I2C | 是 | 传入i2c对象 |
- 返回值:
CCS811对象创建成功,返回CCS811对象;CCS811对象创建失败,抛出Exception - 示例代码:
from machine import I2C,Pin # 驱动库
import ccs811 # CCS811空气质量传感器驱动库# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("ccs811 inited!")
ccs811Obj = ccs811.CCS811(i2cObj)
- 输出:
ccs811 inited!
geteCO2 - 获取空气中二氧化碳浓度
- 函数功能:
获取空气中二氧化碳浓度 - 函数原型:
CCS811.geteCO2()
-
参数说明:
无 -
返回值:
| 返回值 | 类型 | 说明 |
| — | — | — |
| status | 整型 | 0-无效数值;
1-有效数值 |
| eco2 | 整型 | 单位:ppm,>=400 | -
示例:
from machine import I2C,Pin # 驱动库
import ccs811 # CCS811空气质量传感器驱动库
import utime# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("ccs811 inited!")
ccs811Obj = ccs811.CCS811(i2cObj)
while True:status,eco2 = ccs811Obj.geteCO2()if status == 1:print('eCO2: %d ppm' %(eco2))utime.sleep(1)
- 输出:
ccs811 inited!
eCO2: 400 ppm
eCO2: 868 ppm
eCO2: 400 ppm
eCO2: 400 ppm
getTVOC - 获取空气中挥发有机物的浓度
- 函数功能:
获取空气中挥发有机物的浓度 - 函数原型:
CCS811.getTVOC()
- 参数说明:
无 - 返回值:
| 返回值 | 类型 | 说明 |
|---|---|---|
| status | 整型 | 0 - 无效数值 1 - 有效数值 |
| tvoc | 整型 | 单位:ppb |
- 示例:
from machine import I2C,Pin # 驱动库
import ccs811 # CCS811空气质量传感器驱动库
import utime# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("ccs811 inited!")
ccs811Obj = ccs811.CCS811(i2cObj)
while True:status,tvoc = ccs811Obj.getTVOC()if status == 1:print('TVOC: %d ppb' %(tvoc))utime.sleep(1)
- 输出:
ccs811 inited!
TVOC: 0 ppb
TVOC: 0 ppb
TVOC: 0 ppb
TVOC: 3 ppb
TVOC: 734 ppb
TVOC: 68 ppb
TVOC: 129 ppb
TVOC: 62 ppb
TVOC: 25 ppb
geteCO2TVOC - 获取空气中二氧化碳以及挥发有机物的浓度
- 函数功能:
获取空气中二氧化碳以及挥发有机物的浓度 - 函数原型:
CCS811.geteCO2TVOC()
- 参数说明:
无 - 返回值:
| 返回值 | 类型 | 说明 |
|---|---|---|
| status | 整型 | 0-无效数值 1-有效数值 |
| eco2 | 整型 | 单位:ppm , >=400 |
| tvoc | 整型 | 单位:ppb |
- 示例:
from machine import I2C,Pin # 驱动库
import ccs811 # CCS811空气质量传感器驱动库
import utime# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("ccs811 inited!")
ccs811Obj = ccs811.CCS811(i2cObj)
while True:status,eco2,tvoc = ccs811Obj.geteCO2TVOC()if status == 1:print('eCO2: %d ppm, TVOC: %d ppb' % (eco2, tvoc))utime.sleep(1)
- 输出:
ccs811 inited!
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 1495 ppm, TVOC: 168 ppb
eCO2: 481 ppm, TVOC: 12 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
四、接口案例
# Python代码
from machine import I2C,Pin # 驱动库
import ccs811 # CCS811空气质量传感器驱动库
import utime# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("ccs811 inited!")
ccs811Obj = ccs811.CCS811(i2cObj)
while True:status,eco2,tvoc = ccs811Obj.geteCO2TVOC()if status == 1:print('eCO2: %d ppm, TVOC: %d ppb' % (eco2, tvoc))utime.sleep(1)
- 输出:
ccs811 inited!
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 1495 ppm, TVOC: 168 ppb
eCO2: 481 ppm, TVOC: 12 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
eCO2: 400 ppm, TVOC: 0 ppb
五、工作原理
INA219传感器寄存器描述如下表所示:
| 序号 | 寄存器地址 | 功能说明 | 默认值 |
|---|---|---|---|
| 1 | 0x00 | 状态寄存器 | – |
| 2 | 0x01 | 测量模式寄存器 | – |
| 3 | 0x02 | 测量结果寄存器 | – |
| 4 | 0x20 | 硬件ID寄存器 | 0x81 |
| 5 | 0x21 | 硬件版本寄存器 | 0x1X |
| 6 | 0xF4 | APP启动寄存器 | – |
| 7 | 0xFF | 软件重启寄存器 | – |
从下图可以看到CCS811内置I2C通信单元,与MCU进行数据交互。其中nINT和nRESET是可选的,根据实际项目需要而定,nWAKE低电平状态为激活CCS811。

引脚分布如下:
| 序号 | 引脚名 | 功能说明 |
|---|---|---|
| 1 | I2C_ADDR | 低电平 - I2C地址总线0x5A 高电平 - I2C地址总线0x5B |
| 2 | nRESET | 复位引脚,低电平有效 |
| 3 | nINT | 阈值中断引脚 |
| 4 | PWM | – |
| 5 | Sense | – |
| 6 | VDD | 电源正 |
| 7 | nWAKE | 唤醒引脚,低电平有效 |
| 8 | AUX | – |
| 9 | I2C_SDA | I2C数据线 |
| 10 | I2C_SCK | I2C时钟线 |
参考文献及购买链接
[1] CCS811传感器DATASHEET
[2] CCS811传感器模块购买
相关文章:
物联网AI MicroPython传感器学习 之 CCS811空气质量检测传感器
学物联网,来万物简单IoT物联网!! 一、产品简介 通过CCS811传感器模块可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2(二氧化碳)浓度,作为衡量空气质量(IAQ)的指标。 引脚定义 VCC:3.3VGND&…...
TCP/IP(十五)拥塞控制
一 拥塞控制 ① 拥塞控制必要性 思考: 为什么要有拥塞控制呀,不是有流量控制了吗? ② 拥赛窗口 cwnd 什么是拥塞窗口? 和发送窗口有什么关系呢?明白: cwnd、swnd、rwnd 缩写 含义 ③ 如何知道当前网络是否出现了拥塞呢?…...
vue3 404解决方法
在 Vue 3 应用中解决 404 错误通常涉及到 Vue Router,因为 404 错误通常与路由无法匹配到的路径有关. 1. **检查路由配置**:首先确保你的路由配置正确。确保每个路由路径都与你的组件正确匹配,并且在需要时添加必要的路由守卫。 2. **通配符…...
Unity中使用Xlua调用lua相关
//引用命名空间 using XLua; public class L1 : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//Lua解析器 让我们在Unity中使用luaLuaEnv env new LuaEnv();//执行env.DoString("print(OK)");//执行一个Lua脚本 在resource文件夹…...
基于http的protobuf服务实现
本文介绍在http协议中,使用protobuf格式进行二进制数据通信。双方需设置http的header中ContentType为application/x-protobuf。 1、springboot下实现protobuf: 1)pom.xml <dependency><groupId>org.springframework.boot</g…...
基于uniapp的商城外卖小程序
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
【CSS】Tailwind CSS
直接参考 Tailwind CSS 安装提供了四种方式。因为我常用构建工具搭建项目,所以选择 Using PostCSS 。 其中 tailwind.config.js 的配置可以改为: module.exports {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,tsx}],theme: {extend: {},},pl…...
leetcode-电话号码组合(C CODE)
1. 题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” 输出&#…...
Leetcode92. 反转链表 II
Every day a Leetcode 题目来源:92. 反转链表 II 解法1:模拟 注意 STL 的 reverse() 是左闭右开的。 代码: class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right){vector<int> nums getNums(…...
【算法作业记录】
插入排序 递归实现 直接插入 #将a[n]插入有序区间a[0,n-1]中 时间复杂度 O(n) def Insert(a,n):inwhile(i>0 and a[i-1]>a[i]):tmpa[i]a[i]a[i-1]a[i-1]tmpi-1return #直接插入排序 def Insertsort(a,n):for i in range(1,n):#【1,n-…...
回归预测、分类预测、时间序列预测 都有什么区别?
回归预测、分类预测和时间序列预测都是统计和机器学习领域中的预测任务,它们在问题设置和解决的方式上有一些关键区别: 回归预测: 回归预测用于预测连续数值的输出,通常是实数。例如,预测房价、气温、销售额等连续型输…...
关于网络协议的若干问题(三)
1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢? 答:不会导致产生 ICMP 差错报文的有: ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文…...
办公室人人在用的iTab桌面真的好用吗?
本人坐标北京,在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象,我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同? 我是去年1月份在刷B站时偶然刷到一条评论,有人分享自己…...
循环中的else语句
while 循环else结构: 循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码. 需求:女朋友生气了,要惩罚:连续说5遍“老婆大人,我错了”,如果道歉正常完毕后女朋友就原谅我了:…...
三.镜头知识之FOV
三.镜头知识之视场角 最近试了很多sensor, 每次在选镜头时都对其提到的FOV参数一头雾水。不同的sensor要配不同的镜头,而不同的镜头由于焦距的不同,FOV也不一样。这其中有什么联系呢?FOV又分为HFOV(水平), VFOV( 垂直)…...
分布式事务入门
文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程…...
Ubuntu的中文乱码问题
一、Ubuntu的中文乱码问题 sudo apt-get install language-pack-zh-hans 二、修改/etc/environment(在文件的末尾追加): LANG"zh_CN.UTF-8" LANGUAGE"zh_CN:zh:en_US:en" 三、修改/var/lib/locales/supported.d/loca…...
[GXYCTF2019]Ping Ping Ping - RCE(空格、关键字绕过[3种方式])
[GXYCTF2019]Ping Ping Ping 1 解题流程1.1 小试牛刀1.2 三种解法1.2.1 解法一:变量定义拼接绕过1.2.2 解法二:base64编码绕过1.2.3 解法三:内联执行绕过2 思考总结1 解题流程 1.1 小试牛刀 1、提示?ip,结合题目名称,我们直接输入?ip=127.0.0.1 PING 127.0.0.1 (127.…...
ceph 分布式存储与部署
目录 一、存储基础: 1.单机存储设备: 2. 单机存储的问题: 3. 商业存储解决方案: 4. 分布式存储: 5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构:…...
Go 结构体深度探索:从基础到应用
1. 结构体概述 在计算机编程中,数据结构是组织、管理和存储数据的一种方式,它允许高效地执行各种操作。Go语言中的结构体(Struct)是这些数据结构中的一员,它为数据的组织提供了一种具体的方式。 结构体可以被视为是多…...
TensorRT量化实战:动态范围计算中的熵校准与直方图优化
1. TensorRT量化中的动态范围计算基础 在模型部署的工程实践中,量化技术是提升推理效率的关键手段。TensorRT作为业界领先的推理优化框架,其INT8量化功能可以将模型体积压缩至原来的1/4,同时保持较高的推理精度。但量化过程中最关键的挑战就是…...
DIY蓝牙街机摇杆:从零打造无线复古游戏控制器
1. 项目概述与核心思路作为一个玩了二十多年街机,也折腾了十几年硬件的“老炮儿”,我始终觉得,有些东西的味道是数字模拟不出来的。比如,用键盘或现代手柄玩《拳皇97》或《合金弹头》,总觉得少了点灵魂——那“咔哒咔哒…...
ncmdump终极解决方案:解锁网易云音乐NCM格式的完整指南
ncmdump终极解决方案:解锁网易云音乐NCM格式的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他设备播放而烦恼吗?ncmdump工具使用为你提供了完美的NCM格…...
揭秘macOS独立滚动控制:Scroll Reverser如何巧妙解决输入设备冲突
揭秘macOS独立滚动控制:Scroll Reverser如何巧妙解决输入设备冲突 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾经为macOS系统的滚动方向设置感到困扰&…...
深入RISC-V链接脚本:从.lds文件看C程序的内存‘出生’与‘搬家’全过程
深入RISC-V链接脚本:从.lds文件看C程序的内存‘出生’与‘搬家’全过程 在嵌入式开发的世界里,一个C程序从源代码到最终在硬件上运行,经历了编译、链接和加载三个关键阶段。这个过程就像一个人的生命历程:编译是"出生"&…...
Faust高级特性:窗口聚合与状态管理完整教程
Faust高级特性:窗口聚合与状态管理完整教程 【免费下载链接】faust Python Stream Processing. A Faust fork 项目地址: https://gitcode.com/gh_mirrors/faus/faust 掌握Faust的窗口聚合与状态管理功能,构建高效的Python流处理应用!&…...
开源项目文档自动化验证:gate-of-oss 守护 README 与代码一致性
1. 项目概述:一个开源项目的“守门人” 在开源的世界里,项目仓库的README文件就像是项目的“门面”和“说明书”。然而,随着项目迭代,依赖项更新、构建脚本变动、环境配置要求变化是家常便饭。你有没有遇到过这样的场景࿱…...
JAVA低空经济无人机飞手接单平台系统源码开发与部署方案
随着低空经济产业的快速发展,无人机应用场景不断拓展,航拍、测绘、巡检、物流等领域对专业飞手的需求日益增长,飞手接单难、需求方找飞手繁琐的行业痛点愈发突出。一、系统开发核心原则(务实合规,贴合场景)…...
无感定位技术白皮书——传统ReID跨镜跟踪局限重重,无短板碾压式突破
前言在智慧安防、智慧园区、工业物联网等数字化转型核心场景中,跨摄像头目标追踪与精准定位是支撑场景智能化升级的关键底座。长期以来,ReID(行人重识别)技术因无需额外硬件部署、可依托目标外观特征实现跨镜身份关联,…...
RK3506开发板PWM输入捕获配置与调试实战指南
1. 项目概述:在RK3506上搞定PWM输入捕获最近在做一个工业网关项目,需要精确测量外部传感器发来的PWM信号频率和占空比,核心板选型正好落在了触觉智能的RK3506开发板上。这块板子接口丰富,性能也够用,但上手调试PWM输入…...

