物联网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)是这些数据结构中的一员,它为数据的组织提供了一种具体的方式。 结构体可以被视为是多…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...