stm32 HTU21D例程 联系客服

发布时间 : 星期二 文章stm32 HTU21D例程更新完毕开始阅读328f55b1f8c75fbfc77db2f7

#include \#include \#include \#include \ #define A 8.1332f #define B 1762.39f #define C 235.66f HTU21D_Struct HTU; Kalman_Data_Struct Kalman_Temperature_Data,Kalman_Dew_Data; float Dew_Q=1,Dew_R=400; void Data_Send_3Axis(int16_t x,int16_t y,int16_t z); uint8_t HTU21D_Check_CRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor); uint8_t Read_User_Register(void) { uint8_t User_Reg; Anal_I2C_START(); Anal_I2C_SendByte(0x80); //写地址 Anal_I2C_SendByte(0xe7); //写入读指令 Anal_I2C_START(); Anal_I2C_SendByte(0x81); //读地址 while (!Anal_I2C_SCL_STATE); User_Reg=Anal_I2C_ReceiveByte(); //读取 //Anal_I2C_ReceiveBuf(User_Reg,1); Anal_I2C_STOP(); return User_Reg; } float Read_Temperature(void) { uint8_t Tem_Reg[3]; uint16_t Temp=0; float T; Anal_I2C_START(); Anal_I2C_SendByte(0x80); //写地址 Anal_I2C_SendByte(0xe3); //e3触发温度测量 e5湿度 Anal_I2C_START(); Anal_I2C_SendByte(0x81); //读地址 while (!Anal_I2C_SCL_STATE); Anal_I2C_ReceiveBuf(Tem_Reg,3); Anal_I2C_STOP(); Temp= ( (Temp|Tem_Reg[0]) << 8 ) | Tem_Reg[1] ; if(HTU21D_Check_CRC(Temp,Tem_Reg[2])==0) //CRC-8校验 { Temp&=0xfffc; T=Temp*175.72f/0xffff-46.85f; //Data_Send_3Axis(T*100.0f,2,3); //return KalmanFilter(T,&Kalman_Temperature_Data,1,1); return T; } else return 999; } float Read_Humidity(void) { uint8_t Hum_Reg[4]; uint16_t Temp=0; float RT; Anal_I2C_START(); Anal_I2C_SendByte(0x80); //写地址 Anal_I2C_SendByte(0xe5); //e3触发温度测量 e5湿度 Anal_I2C_START(); Anal_I2C_SendByte(0x81); //读地址 while (!Anal_I2C_SCL_STATE); Anal_I2C_ReceiveBuf(Hum_Reg,3); Anal_I2C_STOP(); Temp= ( (Temp|Hum_Reg[0]) << 8 ) | Hum_Reg[1] ; if(HTU21D_Check_CRC(Temp,Hum_Reg[2])==0) //CRC-8校验 { Temp&=0xfffc; RT=Temp*125.0f/0xffff-6.0f; //Data_Send_3Axis(Hum_Reg[0],Hum_Reg[1],RT); //return KalmanFilter(RT,&Kalman_Humidity_Data,Humidity_Q,Humidity_R); return RT; } else return 999; } void HTU21D_Init(void) { Anal_I2C_START(); Anal_I2C_SendByte(0x80); //写地址 Anal_I2C_SendByte(0xe6); //写入写指令 Anal_I2C_SendByte(0x83); //读地址 //Anal_I2C_ReceiveBuf(User_Reg,1); Anal_I2C_STOP(); } //************************************************************************************************************** //两个参数一个是传感器的源数据,另一个是传感器得出的CRC校验值 //如果校验通过返回0,不通过返回非0 //From: http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html //POLYNOMIAL = 0x0131 = x^8 + x^5 + x^4 + 1 : http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks #define SHIFTED_DIVISOR 0x988000 //This is the 0x0131 polynomial shifted to farthest left of three bytes //************************************************************************************************************** uint8_t HTU21D_Check_CRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor) { uint8_t i; //Test cases from datasheet: //message = 0xDC, checkvalue is 0x79 //message = 0x683A, checkvalue is 0x7C //message = 0x4E85, checkvalue is 0x6B uint32_t remainder = (uint32_t)message_from_sensor << 8; //Pad with 8 bits because we have to add in the check value uint32_t divsor = (uint32_t)SHIFTED_DIVISOR; remainder |= check_value_from_sensor; //Add on the check value for (i = 0 ; i < 16 ; i++) //Operate on only 16 positions of max 24. The remaining 8 are our remainder and should be zero when we're done. { if( remainder & (uint32_t)1<<(23 - i) ) //Check if there is a one in the left position remainder ^= divsor; divsor >>= 1; //Rotate the divsor max 16 times so that we have 8 bits left of a remainder } return (uint8_t)remainder; } void Updata_HTU(void) { float temp; if((temp=Read_Temperature())!=999) HTU.T=temp; if((temp=Read_Humidity())!=999) HTU.RH=temp; temp=Calc_Dewpoint(HTU.RH,HTU.T); HTU.Dew=KalmanFilter(temp,&Kalman_Dew_Data,Dew_Q,Dew_R); } float Calc_Dewpoint(float RH,float T) { float PP,T_Dew; PP=powf(10, A-B/(T+C)); T_Dew=-(B/(log10f(RH*PP/100.0f)-A ) +C); return T_Dew; } //头文件 #ifndef __HTU21D_H_ #define __HTU21D_H_ #include typedef struct{ float T; float RH; float T_Set; float RH_Set; float Dew; float Dew_Set; } HTU21D_Struct; extern HTU21D_Struct HTU; extern float Dew_Q,Dew_R; uint8_t Read_User_Register(void); float Read_Temperature(void); float Read_Humidity(void); void HTU21D_Init(void); void Updata_HTU(void); float Calc_Dewpoint(float RH,float T); #endif