SHTx系列温湿度传感器驱动(IIC)
本文最后更新于83 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

在嵌入式开发中,SHTx 系列温湿度传感器高精度和低功耗,成为智能家居、环境监测、工业控制等场景的主流选择。目前主流使用的SHT3x/SHT4x型号的信号接口为标准的I2C 设计

对于开发者而言,对于不同型号的传感器,无需重复造轮子,只需掌握其通用驱动框架以及通信配置,再根据型号以及数据手册的差异做细节适配,就能快速实现稳定、可靠的数据采集。

我将从 SHTx 系列的通信原理出发,拆解驱动开发的核心要点,I2C(及专用 2 线)接口配置、指令交互、数据校验、温湿度换算等关键环节,同时结合嵌入式开发常用的 MCU 平台给出实战代码思路,最后给出大家实战的代码,帮助大家快速完成 SHTx 系列传感器的驱动开发与移植。

SHT系列传感器有多种功能和模式,需要我们通过IIC总线,向传感器内部的寄存器下发指令,并通过IIC总线接收传感器发出的数据,这是使用这个传感器的核心思想。

使用STM32HAL库进行开发,首先要了解基础的CubeMX的IIC配置、IIC协议以及基础的HAL库代码。

IIC的配置没有什么需要特殊说明的,直接打开I2C的开关即可,具体是哪一个IIC看自己喜好。需要说明的是可以根据需要选择IIC的通信速率,100k、400k、1MHz三挡可选,选择时需要注意你使用的IIC器件所支持的最高IIC速率

以下两行代码,分别是使用Hal库中使用IIC进行发送和接收的函数,

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,uint16_t Size, uint32_t Timeout)

其中:

”*hi2c”是指开发者所开启的i2c编号,如开发者通过CubeMX打开了i2c1的配置,这里就需要调用I2C1的地址:&hi2c1;

“DevAddress”是7位设备地址加1位读写地址,在IIC中,读写位地址的规定为:0为写,1为读;

“*pData”是你所要写入或者读出数据的地址,需要注意的是这个数据需要是8位的;

“Size”则是我们需要写入或者读出数据的字节的个数

“Timeout”则是超时时间,很多外设的函数都含有这个参数,在IIC使用中通常可以设置为IIC的超时时间,建议>10ms

以上这一块相当于复习了一遍STM32HAL库IIC的使用,接下来我们需要根据SHT30的数据手册,来尝试驱动SHT30这个温湿度传感器:

对于一个IIC器件,我们首先要从数据手册中寻找它的器件地址和操作指令;

由它的数据手册我们可以知道,在器件芯片的ADDR引脚连接低电平时,器件的地址为0x44,若器件的ADDR连接高电平,则为0x45;通常来说,IIC器件地址就为0x44除非你所购买的模块厂家有特殊说明。

根据数据手册,可以知道SHT30的工作模式有单次测量周期测量两种,并可以知道他们的操作指令。

以及周期测量结果的读出和停止,其中需要留意的是周期测量的结果一次性读出六个字节,且读出的数据需要经过换算才能够得到温湿度:

综合上述说明,我们算是大致了解了SHT30的使用方法,以周期测量为例,可以用以下代码来驱动传感器


uint8_t SHT3X_Modecommand_Buffer[2]={0x23,0x22}; //SHT传感器指令
uint8_t SHT3X_Fetchcommand_Buffer[2]={0xE0,0x00};//读取测量结果
uint8_t SHT3X_Data_Buffer[6]; //byte0,1为温度 byte4,5为湿度

float Hum;//湿度,正数
float Tem;//温度

//传感器初始化函数
void SensorInit()
{
	HAL_I2C_Master_Transmit(&hi2c1,0x44<<1,SHT3X_Modecommand_Buffer,2,0x10); //第一步,发送16位数据0x22,0x36,传感器周期性的进行温湿度转换
}

//传感器读取函数
void SensorRead()
{
	HAL_I2C_Master_Transmit(&hi2c1,0x44<<1,SHT3X_Fetchcommand_Buffer,2,0x10); //第二步,发送读取指令:0xE0,0x00,随时读取传感器的数据 
	HAL_I2C_Master_Receive(&hi2c1,(0x44<<1)+1,SHT3X_Data_Buffer,6,0x10); //设置温湿度IIC传输地址
	Tem=(float)((((SHT3X_Data_Buffer[0]<<8)+SHT3X_Data_Buffer[1])*175)/65535.0f)-45; //读取摄氏度温度 
	Hum=(((SHT3X_Data_Buffer[3]<<8)+SHT3X_Data_Buffer[4])*100)/65535.0f; //读取相对湿度
}

//通过串口显示结果,放入中断或者轮询即可
void SensorShow()
{
	SensorRead();
	printf("Tem:%.2f  Hum:%.2f\r\n",Tem,Hum);
}

对上面这几行代码,有几点需要说明,我使用的周期测量指令为0x23,0x22,是4Hz中重复性测量指令,还有0.5Hz、1Hz、2Hz、10Hz测量频率可选;且sht30的周期转换开启后,会自动发送数据,可以把这行代码删除,不影响正常功能:

HAL_I2C_Master_Transmit(&hi2c1,0x44<<1,SHT3X_Fetchcommand_Buffer,2,0x10); //第二步,发送读取指令:0xE0,0x00,随时读取传感器的数据 

附:SHT3x资料包

通过网盘分享的文件:SHT30资料包
链接: https://pan.baidu.com/s/1fZ5WnKISS9RIa2Uu2PoWCw?pwd=6666 提取码: 6666
–来自百度网盘超级会员v5的分享

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇