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;