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
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; } }
#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; } }