温湿度传感器-SHT30芯片驱动

温湿度传感器数据表SHT3x-DIS
温湿度传感器

代码如下:

#ifndef __SHT30_H
#define __SHT30_H
#include "main.h"
#include "sys.h"

struct SHT30_data
{
	float humidity;
	float temperature;
};

extern struct SHT30_data SHT30_d;
extern float humidity_sht30;
//引脚初始化_软件IIC通讯
#define SHT30_SDA_H			HAL_GPIO_WritePin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_PIN_SET)
#define SHT30_SDA_L			HAL_GPIO_WritePin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_PIN_RESET)
#define SHT30_SCL_H			HAL_GPIO_WritePin(SHT30_SCL_GPIO_Port,SHT30_SCL_Pin,GPIO_PIN_SET)
#define SHT30_SCL_L			HAL_GPIO_WritePin(SHT30_SCL_GPIO_Port,SHT30_SCL_Pin,GPIO_PIN_RESET)

#define SHT30_SDA_IN		GPIO_SetPinMode(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_MODE_INPUT)
#define SHT30_SDA_OUT		GPIO_SetPinMode(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_MODE_OUTPUT_PP)

#define SHT30_SDA_Read 	HAL_GPIO_ReadPin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin)
void SHT30_initialize(void);
void SHT30_read_result(void);
u32 SHT30_cal(float cal_value);    //SHT30--标定
u32 SHT30_c_cal(float cal_value);    //SHT30--零点标定  
#endif
#include "SHT30.h"
#include "Delay.h"


#define SHT30_SDA_H			HAL_GPIO_WritePin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_PIN_SET)
#define SHT30_SDA_L			HAL_GPIO_WritePin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_PIN_RESET)
#define SHT30_SCL_H			HAL_GPIO_WritePin(SHT30_SCL_GPIO_Port,SHT30_SCL_Pin,GPIO_PIN_SET)
#define SHT30_SCL_L			HAL_GPIO_WritePin(SHT30_SCL_GPIO_Port,SHT30_SCL_Pin,GPIO_PIN_RESET)

#define SHT30_SDA_IN		GPIO_SetPinMode(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_MODE_INPUT)
#define SHT30_SDA_OUT		GPIO_SetPinMode(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin,GPIO_MODE_OUTPUT_PP)

#define SHT30_SDA_Read 	HAL_GPIO_ReadPin(SHT30_SDA_GPIO_Port,SHT30_SDA_Pin)
#define SHT30_ADDR 0x8a

struct SHT30_data SHT30_d;
float humidity_sht30;
//产生IIC起始信号
void SHT30_Start(void)
{
    SHT30_SDA_OUT;
	SHT30_SDA_H;
    delay_us(5);
    SHT30_SCL_H;
	delay_us(5);
 	SHT30_SDA_L;
	delay_us(5);
	SHT30_SCL_L;
}	  
//产生IIC停止信号
void SHT30_Stop(void)
{
	  SHT30_SDA_OUT;
	  SHT30_SDA_L;
	  delay_us(2);
	  SHT30_SCL_H;
	  delay_us(2);
	  SHT30_SDA_H;
	  delay_us(5);					   	
}
//等待应答信号到来
static u8 SHT30_Wait_Ack(void)
{
	u8  k = 0,CY=0;
	SHT30_SDA_IN;
	delay_us(1);
    SHT30_SDA_H;         
	delay_us(1); 
	SHT30_SCL_H;
	delay_us(1);
	while(SHT30_SDA_Read) //等待SDA拉低
	{
		delay_us(2);
		k++;            //等待计数
		if(k>250)        //超时跳出循环
		{
			SHT30_Stop();
      CY=1;
      return CY;
		}
	}
	SHT30_SCL_L;
    SHT30_SDA_H;
	delay_us(10);
    return CY;
} 			 				  
void SHT30_Ack(void)
{
	SHT30_SCL_L;
	SHT30_SDA_OUT;
	SHT30_SDA_L;
	delay_us(5);
	SHT30_SCL_H;
	delay_us(5);
	SHT30_SCL_L;
	delay_us(5);
}	
//不产生ACK应答		    
void SHT30_NAck(void)
{
	SHT30_SCL_L;
	SHT30_SDA_OUT;
	SHT30_SDA_H;
	delay_us(5);
	SHT30_SCL_H;
	delay_us(5);
	SHT30_SCL_L;
    delay_us(5);
}


// * 向IIC总线发送一个字节数据
 //* 一个字节8bit,当SCL低电平时,准备好SDA,SCL高电平时,从机采样SDA  
void SHT30_Send_Byte(u8 wdata)
{                        
	  u8  i;
	  SHT30_SDA_OUT;
	  SHT30_SCL_L;               //拉低时钟,给SDA准备
	  for(i = 0; i < 8; i++)    //8位计数器
	  {
		if(wdata & 0x80)   //SDA准备
				SHT30_SDA_H;
		else
				SHT30_SDA_L;
	    wdata <<= 1;        //移出数据的最高位
	    delay_us(5);
	    SHT30_SCL_H;     //拉高时钟,给从机采样
	    delay_us(1);
	    SHT30_SCL_L;     //拉高时钟,给从机采样	
		delay_us(1);   //延时保持IIC时钟频率,也是给从机采样有充足时间  
	}
} 	
//读取数据
static u8 SHT30_read_byte(u8 ack)
{
    u8  i, bytedata=0;
	SHT30_SDA_IN;
	delay_us(10);        //延时给从机准备SDA时间
	for(i = 0; i < 8; i++)  //8位计数器
	{
		SHT30_SCL_L;		
		delay_us(5);
   	    SHT30_SCL_H;
        bytedata <<= 1;    
		if(SHT30_SDA_Read)        //读数据
		bytedata++;
		delay_us(5);     //延时给从机准备SDA时间
	}
  if(!ack)
    SHT30_NAck();
  else
    SHT30_Ack();
  SHT30_SDA_H;
  return bytedata;
}

****读取数据****//
void cmd_write_sht30(char msb,char lsb)
{
  SHT30_Start();
  SHT30_Send_Byte(SHT30_ADDR);
  SHT30_Wait_Ack();
  SHT30_Send_Byte(msb);
  SHT30_Wait_Ack();
  SHT30_Send_Byte(lsb);
  SHT30_Wait_Ack();
  SHT30_Stop();
  delay_ms(5);
}
//SHT30初始化
void SHT30_initialize(void)
{
  cmd_write_sht30(0x21,0x30);
}	
void SHT30_read_result(void)
{
	u16 tem=0,hum=0;
	u16 bufft[6];
	float template = 0;
	float humidity = 0;
	SHT30_Start();
	SHT30_Send_Byte(SHT30_ADDR);
	SHT30_Wait_Ack();
	SHT30_Send_Byte(0xe0);
	SHT30_Wait_Ack();
	SHT30_Send_Byte(0x00);
	SHT30_Wait_Ack();
	delay_ms(500);  
	SHT30_Start();
	SHT30_Send_Byte(SHT30_ADDR+1);
	SHT30_Wait_Ack();
	bufft[0]=SHT30_read_byte(1);
	bufft[1]=SHT30_read_byte(1);
	bufft[2]=SHT30_read_byte(1);
	bufft[3]=SHT30_read_byte(1);
	bufft[4]=SHT30_read_byte(1);
	bufft[5]=SHT30_read_byte(0);
	SHT30_Stop();
	
	tem = (bufft[0]<<8 | bufft[1]);  //温度
	hum = (bufft[3]<<8 | bufft[4]);  //湿度
	template = (175.0F*(float)tem/65535.0F-45.0f);  //T=-45+175*tem/(2^16-1)
	humidity = (100.0F*(float)hum/65535.0F);//RH=hum*100/(2^16-1)
	humidity_sht30=humidity;
	if((template>=0)&&(template<=130)&&(humidity>=0)&&(humidity<=100))
	{
	    SHT30_d.temperature=SHT30_d.temperature*0.9f+(float)template*0.1f;
	    SHT30_d.humidity=SHT30_d.humidity*0.9f+(((float)humidity*(e32_k_h2o_SHT30/1000.0f)+(e32_c_h2o_SHT30/100.0f))*0.1f);
    }
}
u32 SHT30_cal(float cal_value)    //SHT30--标定
{
	float pre_k;
	pre_k = (cal_value-(e32_c_h2o_SHT30/100.0f))/(float)humidity_sht30;					
	e32_k_h2o_SHT30 =(s32)(pre_k*1000);
    return e32_k_h2o_SHT30;
}
u32 SHT30_c_cal(float cal_value)    //SHT30--零点标定
{
	float pre_c;
	pre_c = cal_value-(float)humidity_sht30;					
	e32_c_h2o_SHT30 =(s32)(pre_c*100);
    return e32_c_h2o_SHT30;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值