数据表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;
}