树莓派通过I2C从SHT30传感器获取温湿度

一、树莓派的基本设置

首先我们得了解树莓派外部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
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值