无法通过 I2C 总线将霍尼韦尔气流传感器与 Raspberry 接口
Can't interface Honeywell airflow sensor with Raspberry via I2C bus
我正在尝试将霍尼韦尔气流传感器(型号 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 专家)..
你能帮帮我吗?
提前致谢!!
data-sheet中提到传感器power-up之后,前两个读取序列中的每一个都将以唯一的 4 字节序列中的 2 个字节作为响应
数字。
power-up 之后的第一次读取将响应序列号的两个最高有效字节,而第二次读取将响应序列号的两个最低有效字节。
在上述 power-up 读取序列之后,传感器将以 16 位(2 字节)数字流量读数响应每个 I2C 读取请求。
如 data-sheet 中所述,您没有对序列号执行 power-up 读取序列。
我个人没有用户接线 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 设备使用了类似的程序。
我正在尝试将霍尼韦尔气流传感器(型号 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 专家)..
你能帮帮我吗? 提前致谢!!
data-sheet中提到传感器power-up之后,前两个读取序列中的每一个都将以唯一的 4 字节序列中的 2 个字节作为响应 数字。
power-up 之后的第一次读取将响应序列号的两个最高有效字节,而第二次读取将响应序列号的两个最低有效字节。
在上述 power-up 读取序列之后,传感器将以 16 位(2 字节)数字流量读数响应每个 I2C 读取请求。
如 data-sheet 中所述,您没有对序列号执行 power-up 读取序列。 我个人没有用户接线 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 设备使用了类似的程序。