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
 

 

posted @ 2022-03-03 10:23  98年互联网打工老阿姨  阅读(67)  评论(0)    收藏  举报