0%

多通道气体传感器

Arduino库

MultichannelGasSensor.c

定义MultichannelGasSensor类,初始化变量

begin() 初始化I2C,根据传入的地址确定版本号

getVersion() 获取传感器模块的版本号,根据返回值来判断具体的版本

sendI2C() 用于向I2C设备发送数据

get_addr_dta() 用于从指定地址读取数据,可用于读取传感器的各种值

readData() 用于读取R0值,存储在从机MCU中

readR() 读取每个通道的电阻值

calcGas() 计算每个通道的气体浓度

changeI2CAddr() 用于更改从机的I2C地址

doCalibrate() 执行校准过程

powerOn() 和 powerOff() 用于开启和关闭传感器

factory_setting() 恢复传感器模块的出厂设置

change_i2c_address() 改变从机的I2C地址

Linux

Arduino库移植到Linux下

替换库函数:Wire.h替换为I2C库,替换delay()为linux下的延时函数

在Linux下,可以使用’/dev/i2c-x’设备文件来进行I2C通信,使用read()和write()函数进行数据的读写操作

具体来说,根据每个函数的功能,分别寻找Linux下对应的函数或者库进行替换。open()函数打开设备文件,ioctl()函数设置I2C地址。

通常,与硬件相关的函数(如I2C通信、延时)以及与Arduino库紧密相关的函数(如Wire库中的函数、串口通信函数)需要较大程度的移植或重写。

而一些逻辑上独立、与平台无关的函数可能可以直接在Linux下使用,如数据处理函数和控制逻辑函数。

通常情况下,Linux 中的 I2C 设备读取函数返回的是一个字节序列,而不是像 Arduino 中一样直接读取四个字节。因此,在 Linux 中你需要对读取的字节进行适当的解析以得到你所需的数据。

i2c_smbus_read_byte_data 函数是 Linux 提供的用户空间 I2C 接口函数之一,用于从 I2C 设备中读取一个字节的数据。它通常是通过调用 Linux 提供的 i2c-dev.h 头文件中的宏定义来实现的。

读取数据

声明buffer[4],调用sendI2C,延迟2ms,等待传感器响应,使用I2C协议向传感器请求4个字节的数据。

在传感器数据可用之前进行循环等待,如果超时次数大于100次则返回-2表示超时错误。

再次延迟2ms,如果接收到的数据长度不为4,则返回-3表示数据长度错误。

从传感器中读取的数据存储在buffer数组中,计算校验和 checksum = (uint8_t)(buffer[0] + buffer[1] + buffer[2]);

检查校验和是否正确 checksum!=buffer[3],不正确就返回-4表示检验和错误

rtnData = ((buffer[1] << 8) + buffer[2]) 将接收到的数据组合成一个16位整数,并存储在rtnData变量中

读取初始电阻值R0

R0值是传感器在特定条件下的基准电阻值,用于后续计算气体浓度。

0x11、0x12、0x13代表不同通道的命令码,根据返回的数据是否大于0来判断读取是否成功,将读取到的数据存储在res0数组中。

如果读取到的数据小于等于0,则表示读取失败,函数会返回读取到的数据。读取成功,返回1表示成功。

读取气体浓度数据

调用readData分别获取三个通道(通道0、1、2)的气体浓度数据,每个通道对应的命令是0x01、0x02和0x03,存储在数组rtnData中。

计算气体浓度

通过readR0()读取基准电阻,存储在res0数组中,通过ReadR()读取气体浓度相关数据,存储在res数组中。

根据传入的气体类型计算相应的气体浓度,不同的气体类型对应不同的计算公式。

CO的计算公式:c = pow(ratio1, -1.179) * 4.385;