sht31
#ifndef __SHT31_DIS__H__
#define __SHT31_DIS__H__
#include "I2C.h"
#include "stm32f1xx_hal.h"
#include "Delay.h"
#define ACK 1
#define NACK 0
/**************注意要把SDA配置成开漏模式*****************/
#define set_sht31_scl PAout(15)
#define set_sht31_sda PBout(3)
#define get_sht31_sda PBin(3)
////ADRESS
//#define SHT3X_ADRESS_A 0x44 //ADDR->VSS
//#define SHT3X_ADRESS_B 0x45 //ADDR->VDD
//<<1 !!!!!!!!!!!!!这个很重要
#define SHT31_RHT_W 0X88
#define SHT31_RHT_R 0X89
//MODE COMMAND
#define Mode_Set_H 0x21
#define Mode_Set_L 0X2D
struct sht31_obj
{
uint16_t sth31_RH_Thread_Time;//别忘了需要被DelayTimeCount_ms
struct I2C_Device HardWare;
uint16_t adc_t;
uint16_t adc_rh;
float Temperture;//单位0.01℃
float Humidty; //单位1%
uint8_t Status;
uint8_t RH_Status;
uint8_t RH_Read_Time;
};
extern struct sht31_obj sht31_co2;
void sht31HardWareInit(void);
void sht31_1s_thread(struct sht31_obj *PARA);
#endif
/***************************************************************************************************************************/
/***************************************************************************************************************************/
#include "sht31-dis.h"
struct sht31_obj sht31_co2;
static void set_sht31_scl_fuc(uint8_t a)
{
if(a!=0)
{
set_sht31_scl = 1;
}
else
{
set_sht31_scl = 0;
}
}
static void set_sht31_sda_fuc(uint8_t a)
{
if(a!=0)
{
set_sht31_sda = 1;
}
else
{
set_sht31_sda = 0;
}
}
static uint8_t get_sht31_sda_fuc(void)
{
return get_sht31_sda;
}
static uint8_t sht31_mode_set(struct sht31_obj *PARA, uint8_t mode_h,uint8_t mode_l)
{
I2C_Start(&PARA->HardWare);
I2C_WriteOneByte(&PARA->HardWare,SHT31_RHT_W);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_WriteOneByte(&PARA->HardWare,Mode_Set_H);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_WriteOneByte(&PARA->HardWare,Mode_Set_L);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_Stop(&PARA->HardWare);
return 1;
}
void sht31HardWareInit(void)
{
sht31_co2.HardWare.Get_SDA = get_sht31_sda_fuc;
sht31_co2.HardWare.Set_SCL = set_sht31_scl_fuc;
sht31_co2.HardWare.Set_SDA = set_sht31_sda_fuc;
sht31_co2.HardWare.delayus = I2C_delay_nus;
/*0x212d*/
sht31_mode_set(&sht31_co2,Mode_Set_H,Mode_Set_L);
}
uint8_t StartReadRHTemperature(struct sht31_obj *PARA)
{
I2C_Start(&PARA->HardWare);
I2C_WriteOneByte(&PARA->HardWare,SHT31_RHT_W);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_WriteOneByte(&PARA->HardWare,0xE0);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_WriteOneByte(&PARA->HardWare,0x00);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
I2C_Start(&PARA->HardWare);
I2C_WriteOneByte(&PARA->HardWare,SHT31_RHT_R);
if(Receive_ACK(&PARA->HardWare)!=1)
{
return 0;
}
return 1;
}
uint8_t sht31ReadRHTemperature(struct sht31_obj *PARA)
{
uint8_t T_Data_MSB, T_Data_LSB, RH_Data_MSB, RH_Data_LSB;
uint8_t CRC8_1, CRC8_2;
uint16_t data_t, data_rh;
T_Data_MSB = I2C_ReadOneByte(&PARA->HardWare,ACK);
T_Data_LSB = I2C_ReadOneByte(&PARA->HardWare,ACK);
CRC8_1 = I2C_ReadOneByte(&PARA->HardWare,ACK);
RH_Data_MSB = I2C_ReadOneByte(&PARA->HardWare,ACK);
RH_Data_LSB = I2C_ReadOneByte(&PARA->HardWare,ACK);
CRC8_2 = I2C_ReadOneByte(&PARA->HardWare,NACK);
I2C_Stop(&PARA->HardWare);
// data_rh = (RH_Data_MSB<<8)|(RH_Data_LSB&0xfc);
// PARA->Humidty = -6.0f+(125.0*(float)data_rh/65535);
data_rh = (RH_Data_MSB<<8)|(RH_Data_LSB);
PARA->Humidty = 100*((float)data_rh/65535);
data_t = (T_Data_MSB<<8)|(T_Data_LSB);
PARA->Temperture = -45 + 175*((float)data_t/65535);
return 1;
}
void sht31_1s_thread(struct sht31_obj *PARA)
{
switch(PARA->RH_Status)
{
case 0://启动温湿度检测
{
if(StartReadRHTemperature(PARA)!=0)
{
PARA->RH_Status++;
}
else
{
PARA->RH_Status = 0;//不应答就复位
I2C_Stop(&PARA->HardWare);
PARA->RH_Read_Time = 2;
return;
}
}
case 1:
{
if(sht31ReadRHTemperature(PARA)!=0)
{
PARA->RH_Read_Time = 0;
PARA->RH_Status++;
}
else
{
PARA->RH_Read_Time++;
if(PARA->RH_Read_Time>5)
{
I2C_Stop(&PARA->HardWare);
PARA->RH_Read_Time = 0;
PARA->RH_Status ++;
}
}
}break;
case 2:
{
Set_Delay_Time(1000,&PARA->sth31_RH_Thread_Time);
PARA->RH_Status++;
}break;
case 3:
{
if(CheckDelay(&PARA->sth31_RH_Thread_Time)==0)
{
PARA->RH_Status=0;
}
}break;
default:
{
PARA->RH_Status = 0;
}break;
}
}

浙公网安备 33010602011771号