一、树莓派的基本设置
首先我们得了解树莓派外部gpio口
然后拿出我们sht30传感器,杜邦线,一一对应连接好树莓派的gpio
sht30的vcc对应树莓派的1号口pwr
sht30的gnd对应树莓派的6号口gnd
sht30的sda对应树莓派的3号口sda
sht30的scl对应树莓派的5号口
sht30传感器是i2c通行的,所以我们还必须将树莓派的i2c接口打开
sudo raspi-config
上下方向键选择编号,左右方向键选择下面两个,我们选择第5个interfacing options
选择i2c接口
然后输入sudo reboot重启树莓派即可这样一来树莓派的设置已经完成。
二、sht30获取温湿度的命令地址
关于sht30的官方解释文档我们可以查看这个参考手册
官方网站
传感器获取温湿度的命令地址如下
single shot:在这种模式下,一个发出的测量命令触发- -个数据对的采集。每个数据对由一个16 位温度,和一个16位湿度值(按此顺序)组成。在传输过程中,每个数据值总是紧跟着一个CRC校验和,可以选择不同的测量命令。16 位命令如表8所示。它们与可重复性(低、中、高)和时钟拉伸(启用或禁用)不同。传感器完成测量后,主程序可以通过发送一一个START条件和一个I2C读取头来读取测量结果(RH& T对)。传感器将接收读头的接收,并发送两个字节的数据(温度),接着是一个字节的CRC校验和另外两个字节的数据(相对湿度),然后是一个字节的CRC校验和。每个字节必须承认微控制器与ACK条件传感器继续发送数据。如果传感器在任何字节的数据之后没有从主程序接收到ACK,它就不会继续发送数据。传感器将首先发送温度值,然后发送相对湿度值。在收到湿度值的校验和后,就应该发送一个NACK和停止条件。
Periodic Data Acquisition Mode:在这种模式下,一个发出的测量命令产生一对数据流。每个数据对由一个16 位温度和一个16位湿度值(按此顺序)组成。在周期模式下,可以选择不同的测量命令。相应的16位命令如表9所示。它们与重复性(低、中、高)和数据采集频率(测量每秒0.5, 1, 2, 4和10, MPS)不同。在这种模式下不能选择时钟沿伸。
测:量数据的传输可以通过表10 所示的获取数据命令来启动。如果没有测量数据,I2C 读取头会反应出一个NACK (表10 中的9位),从而停止通信。在读出命令获取数据之后,数据存储器被清除,即测量数据不会存在。
三、C代码
当树莓派的硬件完成好后,我们就可以开始编程了。c编程当然离不开ictol这个函数,它提供了强大的功能,能够让开发者调用它获取到底层的数据。
设备连接好后我们就可以查找传感器的i2c通信地址,
安装好i2c库和工具
sudo apt-get install i2c-tools
之后我们就会发现出现了这个文件
然后查看传感器地址
sudo i2cdetect -y -a 1
0x44就是sht30的通信地址,之后我们就要打开上面我们看到的文件i2c-1
int sht_open(int i2c_addr, uint8_t sht_addr)
{
char i2c_filename[10];
int fd = -1;
int rv = -1;
snprintf(i2c_filename, 19, "/dev/i2c-%d", i2c_addr);
fd=open(i2c_filename, O_RDWR);
if(fd < 0)
{
printf("open %s fialeure\n", i2c_filename);
return -1;
}
return fd;
}
打开文件记得给读写的权限,然后开始往i2c设备也就是sht30传感器写入命令,我们要注意的是,sht30的通信方式是一个字节一个字节的传输的,而我们获取温度的命令地址为16位的,所以我们需要将它拆分,并且通信的时候是高地址为先传送的。我们需要将地址简单处理下
send[0]=(read_model>>8) & 0xff;
send[1]=read_model & 0xff;
利用ioctl函数之前我们得了解下下面的结构体
struct i2c_rdwr_ioctl_data {
struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
__u32 nmsgs; /* number of i2c_msgs */
};
st