无法通过I2C总线将Honeywell气流传感器与Raspberry连接

时间:2018-03-06 07:53:21

标签: raspberry-pi3 sensor i2c honeywell

我正在尝试将霍尼韦尔气流传感器(型号HAFBSS0200C4AX3 - 具有I2C 3.3V输出)与我的Raspberry Pi3连接,但我无法从传感器接收真实值(即使值太低,我强烈地呼吸着传感器..)

传感器数据表(https://www.mouser.com/ds/2/187/honeywell-sensing-airflow-zephyr-haf-series-digita-740409.pdf)。

我尝试运行以下脚本:

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

int main (int argc, char *argv[])
 {
        int fd;
        float data;
        wiringPiSetup () ;

        fd=wiringPiI2CSetup (0x49) ;

        if(fd==-1)
        {
                printf("Can't setup the I2C device\n");
                return -1;
        }
        else
        {
                for (;;)
                {
                        data=wiringPiI2CRead(fd);
                        if(data==-1)
                        {
                                printf("No data\n");
                                //return -1;
                                delay(1000);
                        }
                        else
                        {
                                //print data
                                printf("data=%f\n", 200*( 
((data/16383)-0.5)/0.4));
                                delay(1000);
                        }
                }
        }
        return 0;
}

输出值太低...... 数据表说我应该读取2个字节(第一个LSB​​然后是MSB),但我不知道我的脚本是否正在这样做..(我不是I2C专家)..

你能帮助我吗? 在此先感谢!!

1 个答案:

答案 0 :(得分:0)

数据表中提到,在传感器上电后,前两个读序列中的每一个都将响应2字节的唯一4字节串行 数。

上电后的第一次读取将响应序列号的两个最高有效字节,而第二次读取将响应序列号的两个最低有效字节。

在上述上电读取序列之后,传感器将以16位(2字节)数字流读数响应每个I2C读取请求。

如数据表中所述,您没有执行序列号的上电读取序列。 我个人没有用户布线pi,但它似乎只读取1个字节,而传感器希望你读取两个字节。您可以改用Linux I2C驱动程序:

#include <string>
#include <cerrno>
#include <error.h>
#include <fcntl.h>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifdef __linux__
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>

int                 fd;
const uint8_t       dataLength = 2;
uint8_t             data[dataLength], tempCount;

sleep(1);

fd = open("/dev/i2c-1", O_RDWR);
if(fd < 0)
{
    string str;
    str = "Error while opening i2c-1 bus. Error : " + string(strerror(errno)) + "\n";
    cout << str;
    return false;
}
sleep(0);
if (ioctl(fd, I2C_SLAVE, 0x49) < 0)         //Set Slave Address
{
    string str;
    str = "Error while ioctl system call on i2c-1 bus. Error : " + string(strerror(errno)) + "\n";
    cout << str;
    return false;
}
sleep(0);
tempCount = read(fd, data, 2);     //We are to read 2 bytes of serial number
if(tempCount != 2)
{
    string str;
    str = "Error while reading data on i2c-1 bus. Error : " + string(strerror(errno)) + "\n";
    cout << str;
    return false;
}
sleep(0);
tempCount = read(fd, data, 2);     //We are to read 2 bytes of serial number
if(tempCount != 2)
{
    string str;
    str = "Error while reading data on i2c-1 bus. Error : " + string(strerror(errno)) + "\n";
    cout << str;
    return false;
}
sleep(0);
tempCount = read(fd, data, 2);     //We are to read 2 bytes of enviroment data
if(tempCount != 2)
{
    string str;
    str = "Error while reading data on i2c-1 bus. Error : " + string(strerror(errno)) + "\n";
    cout << str;
    return false;
}
close(fd);

sleep(1);

请注意:由于所述传感器不可用,我没有针对传感器测试程序。但是程序应该可以工作,因为我已经使用了几个I2C设备的类似程序。