一、温湿度传感器概念
温湿度传感器是一种用于测量环境温度和湿度的电子设备。它通过感知环境中的温度和湿度变化,将其转化为电信号,并输出相应的测量数值。
SHT-31是一款低成本环境温湿度检测模块。工作电压 2.4-5.5v 功耗小,体积小,采用DFN封装工艺。其工作原理,是通过单片机读取温度湿度数据,IIC通信方式输出。
二、以温湿度传感器为例SHT31
SHT31温湿度传感器实物图如图1所示,相关资料可到某宝进行下载。
图1:SHT31实物图
三、SHT31相关内容由下面各图所展示
四、SHT31时序图
五、温湿度转换公式
六、SHT31函数配置步骤
1、初始化GPIO--PB6/PB7
2、编写获取数据函数,保存起来,打印
七、代码编写
1、sht31.c
#include "sht3x.h"
#include "math.h"
void SHT3x_Init(void){
//初始化GPIO--PB6/PB7
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // 使能GPIOB的时钟
GPIO_InitTypeDef GPIO_SHT3X_Init = {0}; //定义结构体变量
GPIO_SHT3X_Init.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_SHT3X_Init.GPIO_OType = GPIO_OType_OD; //开漏输出
GPIO_SHT3X_Init.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_SHT3X_Init.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空
GPIO_SHT3X_Init.GPIO_Speed = GPIO_Speed_2MHz; //速度2MHz
GPIO_Init(GPIOB, &GPIO_SHT3X_Init);
GPIO_SetBits(GPIOB, GPIO_Pin_6|GPIO_Pin_7); //空闲时高电平
}
//编写获取数据函数,保存起来,打印
struct STU_TH SHT3x;
void SHT3x_TH_Show(void){
u16 TH_buf = 0; //用于拼接数据
int i =0,overtime = 0;
unsigned char buf[6] = {0}; //数据缓冲区
VIP:
overtime++;
if(overtime>10){
return ; //跳出函数
}
IIC_Start(); //起始条件
IIC_WriteByte(0x44<<1|0); //写0
if(IIC_Wait_ACK()==0){
IIC_WriteByte(0x2C);
if(IIC_Wait_ACK()==0) {
IIC_WriteByte(0x06);
if(IIC_Wait_ACK()==0){
do{
IIC_Stop(); //停止条件
Delay_ms(5);
IIC_Start(); //起始条件
IIC_WriteByte(0x44<<1|1); //器件地址+读
}while(IIC_Wait_ACK() != 0);
for(i=0;i<5;i++)
buf[i] = IIC_ReadByte(ACK);
buf[5] = IIC_ReadByte(NACK);
IIC_Stop(); //停止条件
TH_buf=buf[0]<<8|buf[1];//温度测量值
SHT3x.temp=(TH_buf/65535.0)*175-45; //转换温度值
SHT3x.fahr=(TH_buf/65535.0)*315-49; //转换温度值
TH_buf = buf[3]<<8|buf[4];
SHT3x.hum = (TH_buf/65535.0)*100; //转换湿度值
}goto VIP;
}goto VIP;
}goto VIP;
}
2、sht31.h
#ifndef _SHT3X_H_
#define _SHT3X_H_
#include "stm32f4xx.h"
#include "delay.h"
#include "myiic.h"
#include "usart1.h"
struct STU_TH{
float temp; //温度
float fahr; //华氏温度
float hum; //湿度
};
extern struct STU_TH SHT3x;
void SHT3x_Init(void);
void SHT3x_TH_Show(void);
#endif
3、main.c
int delay_flag;
int main(){
//优先级分组,代码中只执行一次
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组2 抢占2位 响应2位
SysTick_Init(168);
Usart1_Init(115200);//波特率、频率
SHT3x_Init();
printf("程序已启动\r\n");
while(1){
//验证温湿度
SHT3x_TH_Show();
printf("温度:%.2f 华氏温度:%.2f 湿度:%.2f\r\n",SHT3x.temp,SHT3x.fahr,SHT3x.hum);
Delay_ms(1000);
}
}
八、其他说明
从传感器可以看到SDA方向。粗体SDA线由传感器控制,普通SDA线由微控制器控制。注意,SDA有效读取时间是由前一个开关的下降沿触发的。如下图所示:
数字输入/输出板时序图
注意:本人所写文章内容均用于记录自己在学习嵌入式的成长过程!!!!!