sht31 --fuwei


#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 soft_reset_sensor(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,RESET_SET_H);   if(Receive_ACK(&PARA->HardWare)!=1)   {     return 0;   }   I2C_WriteOneByte(&PARA->HardWare,RESET_SET_L);   if(Receive_ACK(&PARA->HardWare)!=1)   {     return 0;   }   I2C_Stop(&PARA->HardWare);   return 1; }
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; }

void 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); } void sht31_1s_thread(struct sht31_obj *PARA) {   switch(PARA->RH_Status)   {     case 0:     {       sht31_mode_set(&sht31_co2,Mode_Set_H,Mode_Set_L);       Set_Delay_Time(1200,&PARA->sth31_RH_Thread_Time);       PARA->RH_Status++;     }break;     case 1://启动温湿度检测     {       if(CheckDelay(&PARA->sth31_RH_Thread_Time)==0)       {         if(StartReadRHTemperature(PARA)!=0)         {            sht31ReadRHTemperature(PARA);            Set_Delay_Time(1200,&PARA->sth31_RH_Thread_Time);            PARA->RH_Read_Time = 0;         }         else         {           I2C_Stop(&PARA->HardWare);           PARA->RH_Read_Time++;           if(PARA->RH_Read_Time > 5)           {             PARA->RH_Read_Time = 0;             PARA->RH_Status = 0;           }         }       }     }break;     default:     {       PARA->RH_Status = 0;     }break;   } }
/*********************************************************************************************************************/

#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
//SOFTRESET COMMAND #define RESET_SET_H   0x30 #define RESET_SET_L   0xA2
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  

相关