【mcuclub】CO2及TVOC检测-SGP30

2023-11-16

一、实物图

二、原理图

编号 名称 功能
1 VCC 电源正
2 GND 电源地
3 SDA 串行地址和数据输入/输出
4 SCL 串行时钟输入

三、简介

SGP30是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器,内部集成4个气体传感元件,具有完全校准的空气质量输出信号,主要是对空气质量进行检测。可以输出:

TVOC(Total Volatile Organic Compounds,总挥发性有机物),量程为0~60000ppb;CO2浓度,量程400~60000ppm。

四、工作原理

SGP30的传感(MEMS)部分基于金属氧化物(MOx)纳米颗粒的加热膜。气敏材料——金属氧化物颗粒上吸附的氧气与目标气体发生反应,从而释放出电子。这导致由传感器测量的金属氧化物层的电阻发生改变。简而言之,还原性气体的出现造成气敏材料表面氧浓度降低,改变了半导体的电阻(或电导率)。后续通过电路(ASIC)部分对电阻进行检测、信号处理与转换等,最终获取到气体值。

五、通信协议(I2C通信)

1、I2C总线介绍

<1>I2C总线(Inter IC bus)是由Philips公司开发的一种通用数据总线。

<2>两根通信线:SCL(Serial Clock串行时钟线)、SDA(Serial Data串行数据线)。

<3>同步、半双工,带数据应答。

*注:同步(因为它有单独的时钟线)、半双工(SDA只有一根线,并且还要来回通信)

<4>通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。

2、I2C电路规范

<1>所有I2C设备的SCL连在一起,SDA连在一起

<2>设备的SCL和SDA均要配置成开漏输出模式(硬件IIC)

*开漏输出模式——断开时引脚成浮空状态(电路断开,电压不稳定)

<3>SCL和SDA各添加一个上拉电阻,阻值一般为4.7K~10K左右

<4>开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题。

3、I2C时序结构

起始信号:SCL高电平期间,SDA从高电平切换到低电平

停止信号:SCL高电平期间,SDA从低电平切换到高电平

代码如下:

/****

*******I2C总线启动信号

*****/

void SGP30_IIC_Start(void)

{

   SGP30_SDA = 1;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SDA = 0;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 0;

}

/****

*******I2C总线停止信号

*****/

void SGP30_IIC_Stop(void)

{

   SGP30_SDA = 0;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SDA = 1;

   SGP30_IIC_Delay(DELAY_TIME);

}

发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。

接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)。

代码如下:

/****

*******发送应答或非应答信号

*****/

void SGP30_IIC_SendAck(bit ackbit)

{

   SGP30_SCL = 0;

   SGP30_SDA = ackbit;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 0;

   SGP30_SDA = 1;

   SGP30_IIC_Delay(DELAY_TIME);

}

/****

*******等待应答信号

*****/

bit SGP30_IIC_WaitAck(void)

{

   bit ackbit;

   SGP30_SDA = 1;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   ackbit = SGP30_SDA;

   SGP30_SCL = 0;

   SGP30_IIC_Delay(DELAY_TIME);

   return ackbit;

}

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

代码如下:

/****

*******I2C总线发送一个字节数据

*****/

void SGP30_IIC_SendByte(uchar byte)

{

   uchar i;

   SGP30_SCL = 0;

   for(i=0; i<8; i++)

   {

      if(byte & 0x80)

         SGP30_SDA = 1;

      else

         SGP30_SDA = 0;

      SGP30_IIC_Delay(DELAY_TIME);

      SGP30_SCL = 1;

      SGP30_IIC_Delay(DELAY_TIME);

      SGP30_SCL = 0;

      SGP30_IIC_Delay(DELAY_TIME);

      byte <<= 1;

   }

   SGP30_IIC_WaitAck();

}

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA总线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

代码如下:

/****

*******I2C总线接收一个字节数据

*****/

uchar SGP30_IIC_RecByte(bit ackbit)

{

   uchar i, dat;

   SGP30_SDA = 1;

   for(i=0; i<8; i++)

   {

      SGP30_SCL = 1;

      SGP30_IIC_Delay(DELAY_TIME);

      dat <<= 1;

      if(SGP30_SDA)

         dat |= 1;

      SGP30_SCL = 0;

      SGP30_IIC_Delay(DELAY_TIME);

   }

   SGP30_IIC_SendAck(ackbit);

   return dat;

}

4、SGP30读取数据

I2C从机地址是0X58,由于地址只用到了7bit,最高位未使用,最低位为判断是读还是写,为0是读,为1是写,所以:

  • 对于写SGP30,地址为(0X58 << 1) = 0XB0
  • 对于读SGP30,地址为((0X58 << 1)) | 0X01 = 0XB1

SGP30的命令都是双字节的,先发高位,有如下命令:

常用的有两个,一个是0x2003为初始化SGP30命令,另一个0x2008为获取空气质量值命令。

SGP30获取的数据格式为:2位CO2数据+1位CO2的CRC校验+2位TVOC数据+1位TVOC的CRC校验。模块上电需要15s左右初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变。因此上电后一直读,直到TVOC不为0并且CO2不为400,SGP30模块才初始化完成。

初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。气体类传感器比较容易受环境影响,测量数据出现波动是正常的,可以添加滤波函数进行滤波。

代码如下:

/****

*******向SGP30的地址address中写入一个字节的数据

*****/

void SGP30_Write_Data(uchar address,uchar dat)

{

   SGP30_IIC_Start();

   SGP30_IIC_SendByte(SGP30_SlaveAddress);

   SGP30_IIC_SendByte(address);

   SGP30_IIC_SendByte(dat);

   SGP30_IIC_Stop();

}

/****

*******从SGP30的地址address中读取一个字节的数据

*****/

ulong SGP30_Read_Data()

{

   ulong dat;

   uint crc;

   SGP30_IIC_Start();

   SGP30_IIC_SendByte(SGP30_SlaveAddress + 1);

   dat = SGP30_IIC_RecByte(SGP30_ACK);               //CO2高位数据

   dat <<= 8;

   dat += SGP30_IIC_RecByte(SGP30_ACK);              //CO2低位数据

   crc = SGP30_IIC_RecByte(SGP30_ACK);                //CRC校验值

   dat <<= 8;

   dat += SGP30_IIC_RecByte(SGP30_ACK);              //TVOC高位数据

   dat <<= 8;

   dat += SGP30_IIC_RecByte(SGP30_ACK);              //TVOC低位数据

   crc = SGP30_IIC_RecByte(SGP30_NACK);               //CRC校验值

   SGP30_IIC_Stop();

   return(dat);

}

/****

*******SGP30初始化函数

*****/

void SGP30_Init(void)

{

   SGP30_Write_Data(0x20,0x03);

}

/****

*******SGP30获取CO2和TVOC值函数

*****/

void SGP30_Get_Co2_Tvoc_Value(uint *co2_value, uint *tvoc_value)

{

   ulong sgp30_value;

   SGP30_Write_Data(0x20,0x08);

   sgp30_value = SGP30_Read_Data();

   *co2_value = (sgp30_value & 0xffff0000) >> 16;

   *tvoc_value = sgp30_value & 0x0000ffff;

}

六、流程设计

首先初始化引脚,然后发送初始化指令0x2003。接着发送读取数据指令0x2008,然后开始获取数据,先获取CO2高8位数据,再获取CO2低8位数据,再获取一次CRC校验值;然后再获取TVOC高8位数据,再获取TVOC低8位数据,再获取一次CRC校验值。数据获取好后,将CO2的高8位数据和低8位数据整合为一个数据即为CO2值,将TVOC的高8位数据和低8位数据整合为一个数据即为TVOC值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【mcuclub】CO2及TVOC检测-SGP30 的相关文章

  • SSH登录步骤

    SSH登录格式 ssh 用户名 ip地址 回车 比如 ssh root 0 0 0 1 如果需要切换用户 su 用户名 比如 su test1 从普通用户切换到root用户 可以使用sudo su 或 su
  • ingress是什么

    ingress是什么 需求 概念 详细说明 Ingress和Service的区别 注意点 需求 每个Service都要有一个负载均衡服务 所以这个做法实际上既浪费成本又高 作为用户 更希望看到Kubernetes为我内置一个全局的负载均衡器
  • 怎么制作睡袋rust_怎么不花钱自己在野外制作吊床—户外手工技能(吊床露营的好处)...

    当你想到露营的时候 你会想到什么形象 可能是帐篷 几十年来 帐篷和露营旅行确实已经密不可分 但最近这种感觉已经开始发生变化 因为出现了另一种露营方式 吊床 这样的吊床在中美洲和南美洲已经很常见了 但现在在设计和材料上经历了许多进步 越来越受
  • C#开发---Aspose.Word操作Word文档(一)

    目录 1 书签赋值 2 新起一行添加文本 3 查找文档内标题 4 往pdf中插入目录 1 书签赋值 提前创建好word文档 插入书签 在程序中给书签赋值

随机推荐

  • linux编程获取本机IP地址

    getifaddrs 和struct ifaddrs的使用 获取本机IP 博客分类 Linux C编程 ifaddrs结构体定义如下 C代码 struct ifaddrs struct ifaddrs ifa next Next item
  • VMware Ubuntu安装详细过程(详细图解)

    说明 该篇博客是博主一字一码编写的 实属不易 请尊重原创 谢谢大家 一 下载Ubuntu镜像文件 下载地址 http mirrors aliyun com ubuntu releases 16 04 进入下载页面 如下图选择版本点击即可下载
  • Android NDK 编译时出现make (e=2): 系统找不到指定的文

    今天编译一个so文件时出现如下错误 C Users xxj Desktop test OpenCamera gt ndk build armeabi v7a Compile SeetafaceSo lt face detection cpp
  • java中访问修_Java中常见的访问/非访问修饰符

    Java中常见的访问 非访问修饰符 Java中常见的访问 非访问修饰符 1 Java中有下列常见访问修饰符 private 私有变量和方法 非外部类 只能被声明它们的类的实例所使用 default 类中的数据 方法和它本身能够被声明为默认d
  • 如何新建Quartus工程—FPGA入门教程

    这一章我们来实现第一个FPGA工程 LED流水灯 我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程 从新建工程 代码设计 综合实现 管脚约束 下载FPGA程序 掌握本章内容 大家就算正式的开始入门FPGA开发了 1 1 2 新建工程
  • 老Java程序员花两天做了个消消乐(天天爱消除)

    老Java程序员花两天做了个消消乐 天天爱消除 引言 一直就想做一个消消乐 这次正好找到了素材 就自己琢磨写了一个 我觉得这个游戏难点就在消除 以及消除后的下落 其他的地方也就还好 这次做完了写个文章大家唠一波 效果图 实现思路 1 绘制窗
  • PostgreSQL

    PostgreSQL 是一个免费的对象 关系数据库服务器 ORDBMS 在灵活的BSD许可证下发行 PostgreSQL 开发者把它念作 post gress Q L PostgreSQL 的 Slogan 是 世界上最先进的 开源关系型数
  • VMware16虚拟机安装及配置(保姆级教程),这一篇就够了

    1 虚拟机VMware的下载官网地址 https www vmware com cn html VMware 安装 1 打开下载好的 exe 文件 即可开始安装 2 点击下一步 3先勾选我接受许可协议中的条款 然后点击下一步 4 自定义安装
  • 05-----撤销add,commit,push的方法(包括如何删除已经push到远程库的单个文件或者文件夹)

    1 撤销add添加的多余文件 git reset filename 撤销add到缓冲区的部分文件 2 撤销commit的多余文件 git log 先使用查看已经提交的commitId节点 git reset commit id 回退到上一个
  • 为什么我选用了springcloud而不是dubbo

    写好的代码越来越满足不了需求 因为需求总是在不断的变化 在技术选型时 实在是心有余而力不足 思来想去 就考虑了使用微服务架构来实现 功能模块化 今天主要讲讲为什么需要微服务架构 还是以故事的形式呈现 一 认识微服务 阶段一 单体服务 话说小
  • C语言密码破译

    请用C语言编程序将 China 译成密码 密码规律是 用原来的字母后面第4个字母代替原来的字母 例如 字母 A 后面第4个字母是 E 用 E 代替 A 因此 China 应译为 Glmre 请编一程序 用赋初值的方法使 cl c2 c3 c
  • IntelliJ IDEA(编码篇):集成Junit4插件,快速生成测试类

    目录 安装JUnitGenerator V2 0 修改JUnitGenerator V2 0的配置 生成JUnit4测试用例 注意 安装JUnitGenerator V2 0 1 通过网络安装 如下 2 手动下载插件安装 插件下载 http
  • 全网最简单解决方式1045-Access denied for user root@localhost(using password:YES)

    最近 Javaweb小学期 和 数据库小学期 答辩 极限赶大作业 唉 1045 Access denied for user root localhost using password YES 连接数据库时出现了这个问题 网上大概有3种解决
  • React Hooks:Effect无限回调踩坑

    场景 我的目的是通过Effect来模拟组件的componentDidMount 在渲染完成之后 通过setTimeout来处理操作 向keyIndex中push一个新的元素 并更新keyIndex 但是这个操作我确定只会执行一次 错误代码如
  • a和ajax跳转页面,ajax 页面跳转

    ajax 页面跳转 内容精选 换一换 面包屑组件 是项目中常用的一种组件 结构大致是 首页 菜单1 菜单2 菜单3 接入配置完成后 伙伴可以在能力开放页面配置伙伴平台回跳地址 以便于客户在完成订单支付后能返回到伙伴销售平台或者客户支付订单需
  • 适合下班后的副业,4个比较实际的副业兼职

    每一个上班族 都有一个发财的梦想 希望可以通过自己的努力 让领导看到自身价值 得到赏识 快速升职加薪 赚得盆满钵满 这样是不错 而且不少上班族单纯依靠工作就实现了这样的梦想 但是对于绝大部分普通人来说 还只存在于 想 如果现有的工作暂时没有
  • pdf注释上锁_如何在iPad上突出显示和注释PDF

    pdf注释上锁 Khamosh Pathak Khamosh Pathak The iPad is a great way to read PDFs but what if you want to highlight parts of it
  • STM32采用普通的IO口来测量PWM的频率

    STM32测量外部输入信号的频率的方法有很多 采用内部定时器输入捕获功能 采用普通的IO口设置外部中断 定时器的当时测量PWM信号的频率 这两种方式比较推荐使用第一种 比较使用内部的资源可以节省CPU资源的利用 当然当内部资源不够使用的时候
  • Unity LensFlares(镜头炫光)踩坑以及解决总结

    镜头光晕 Lens Flares 模拟相机镜头内的折射光线的效果 主要作用就是让太阳光 其他光源更加真实 Build in Build in管线中 可以直接添加Lens Flare组件即可获得效果 URP 2019 在Unity2019版本
  • 【mcuclub】CO2及TVOC检测-SGP30

    一 实物图 二 原理图 编号 名称 功能 1 VCC 电源正 2 GND 电源地 3 SDA 串行地址和数据输入 输出 4 SCL 串行时钟输入 三 简介 SGP30是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器 内部集成4个气