12.STM32F4 温湿度传感器(SHT31)的简单介绍(之一)

一、温湿度传感器概念

       温湿度传感器是一种用于测量环境温度和湿度的电子设备。它通过感知环境中的温度和湿度变化,将其转化为电信号,并输出相应的测量数值。

          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有效读取时间是由前一个开关的下降沿触发的。如下图所示:

数字输入/输出板时序图

    注意:本人所写文章内容均用于记录自己在学习嵌入式的成长过程!!!!!

   

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 13:20:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 13:20:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 13:20:02       87 阅读
  4. Python语言-面向对象

    2024-01-27 13:20:02       96 阅读

热门阅读

  1. 多进程并发服务器与多线程并发服务器

    2024-01-27 13:20:02       51 阅读
  2. react mui textfield marquee 跑马灯效果实现

    2024-01-27 13:20:02       53 阅读
  3. react hooks的useContext

    2024-01-27 13:20:02       57 阅读
  4. torch.empty()造成的内存溢出问题

    2024-01-27 13:20:02       53 阅读
  5. Centos安装mysql/mariadb

    2024-01-27 13:20:02       51 阅读
  6. 搭建简单docker swarm集群

    2024-01-27 13:20:02       55 阅读
  7. Python的语法糖

    2024-01-27 13:20:02       58 阅读
  8. MySQL模糊查询通配符转义总结

    2024-01-27 13:20:02       63 阅读