
文章目录一、SHT35 简介二、引脚功能三、驱动与数据说明驱动说明数据说明CRC校验四、程序STM32五、测试一、SHT35 简介SHT35 是一款高精度数字式温湿度传感器采用 I²C 通信接口可测量环境温度和相对湿度温度测量范围为 −40125℃湿度测量范围为 0100%RH具有测量精度高、功耗低、体积小和稳定性好等特点。通过单片机发送测量命令并读取传感器数据广泛应用于环境监测、智能家居及工业温湿度检测等领域二、引脚功能引脚功能VCC电源正 3.3-5VGND参考地SDA数据线SCL时钟线三、驱动与数据说明驱动说明传感器上电后需等待小段时间发送写命令 0x2400等待 20ms 测量完成后读取 6 字节温湿度数据再进行CRC检验数据说明温湿度数据计算CRC校验CRC计算代码如下staticuint8_tSHT35_CRC8(constuint8_t*data,uint8_tlen){uint8_tcrc0xFF;uint8_ti,j;for(i0;ilen;i){crc^data[i];for(j0;j8;j){if(crc0x80){crc(uint8_t)((crc1)^0x31);}else{crc(uint8_t)(crc1);}}}returncrc;}四、程序STM32SHT35 .C#includesht35.h#includedelay.h#defineSHT35_ADDR0x44#defineI2C_TIMEOUT100000Ustaticuint8_tI2C1_WaitEvent(uint32_tevent){uint32_ttimeoutI2C_TIMEOUT;while(!I2C_CheckEvent(I2C1,event)){if(--timeout0)return0;}return1;}staticuint8_tI2C1_WaitFlag(uint32_tflag,FlagStatus status){uint32_ttimeoutI2C_TIMEOUT;while(I2C_GetFlagStatus(I2C1,flag)!status){if(--timeout0)return0;}return1;}staticvoidI2C1_Stop(void){I2C_GenerateSTOP(I2C1,ENABLE);I2C_AcknowledgeConfig(I2C1,ENABLE);}staticvoidI2C1_Init(void){GPIO_InitTypeDef gpio;I2C_InitTypeDef i2c;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);/* PB6 SCL,PB7 SDA */gpio.GPIO_PinGPIO_Pin_6|GPIO_Pin_7;gpio.GPIO_SpeedGPIO_Speed_50MHz;gpio.GPIO_ModeGPIO_Mode_AF_OD;GPIO_Init(GPIOB,gpio);I2C_DeInit(I2C1);I2C_StructInit(i2c);i2c.I2C_ModeI2C_Mode_I2C;i2c.I2C_DutyCycleI2C_DutyCycle_2;i2c.I2C_OwnAddress10;i2c.I2C_AckI2C_Ack_Enable;i2c.I2C_AcknowledgedAddressI2C_AcknowledgedAddress_7bit;i2c.I2C_ClockSpeed100000;I2C_Init(I2C1,i2c);I2C_Cmd(I2C1,ENABLE);}voidSHT35_Init(void){I2C1_Init();}staticuint8_tSHT35_WriteCommand(uint16_tcmd){if(!I2C1_WaitFlag(I2C_FLAG_BUSY,RESET))return0;I2C_GenerateSTART(I2C1,ENABLE);if(!I2C1_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))gotoerror;I2C_Send7bitAddress(I2C1,SHT35_ADDR1,I2C_Direction_Transmitter);if(!I2C1_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))gotoerror;I2C_SendData(I2C1,(uint8_t)(cmd8));if(!I2C1_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED))gotoerror;I2C_SendData(I2C1,(uint8_t)cmd);if(!I2C1_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED))gotoerror;I2C1_Stop();return1;error:I2C1_Stop();return0;}staticuint8_tSHT35_ReadBytes(uint8_t*data){uint8_ti;if(!I2C1_WaitFlag(I2C_FLAG_BUSY,RESET))return0;I2C_AcknowledgeConfig(I2C1,ENABLE);I2C_GenerateSTART(I2C1,ENABLE);if(!I2C1_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))gotoerror;I2C_Send7bitAddress(I2C1,SHT35_ADDR1,I2C_Direction_Receiver);if(!I2C1_WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))gotoerror;for(i0;i3;i){if(!I2C1_WaitFlag(I2C_FLAG_RXNE,SET))gotoerror;data[i]I2C_ReceiveData(I2C1);}if(!I2C1_WaitFlag(I2C_FLAG_BTF,SET))gotoerror;I2C_AcknowledgeConfig(I2C1,DISABLE);data[3]I2C_ReceiveData(I2C1);if(!I2C1_WaitFlag(I2C_FLAG_BTF,SET))gotoerror;I2C_GenerateSTOP(I2C1,ENABLE);data[4]I2C_ReceiveData(I2C1);data[5]I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1,ENABLE);return1;error:I2C1_Stop();return0;}staticuint8_tSHT35_CRC8(constuint8_t*data,uint8_tlen){uint8_tcrc0xFF;uint8_ti,j;for(i0;ilen;i){crc^data[i];for(j0;j8;j){if(crc0x80){crc(uint8_t)((crc1)^0x31);}else{crc(uint8_t)(crc1);}}}returncrc;}uint8_tSHT35_ReadData(float*temperature,float*humidity){uint8_tdata[6];uint16_trawT,rawRH;if(temperature0||humidity0)return0;if(!SHT35_WriteCommand(0x2400))return0;Delay_ms(20);if(!SHT35_ReadBytes(data))return0;if(SHT35_CRC8(data[0],2)!data[2])return0;if(SHT35_CRC8(data[3],2)!data[5])return0;rawT((uint16_t)data[0]8)|data[1];rawRH((uint16_t)data[3]8)|data[4];*temperature-45.0f175.0f*(float)rawT/65535.0f;*humidity100.0f*(float)rawRH/65535.0f;if(*humidity0.0f)*humidity0.0f;if(*humidity100.0f)*humidity100.0f;return1;}main.C#includestm32f10x.h#includestdio.h#includeDelay.h#includesht35.h#includestdint.hvoidUSART1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStructure);USART_InitStructure.USART_BaudRate115200;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;USART_Init(USART1,USART_InitStructure);USART_Cmd(USART1,ENABLE);}intfputc(intch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);returnch;}intmain(void){floattemperature0.0f;floathumidity0.0f;int32_tt100;uint32_th100;SystemInit();USART1_Init();SHT35_Init();Delay_ms(500);while(1){if(SHT35_ReadData(temperature,humidity)){t100(int32_t)(temperature*100.0f);h100(uint32_t)(humidity*100.0f);if(t1000){printf(Temperature: -%ld.%02ld C, ,(long)(-t100/100),(long)(-t100%100));}else{printf(Temperature: %ld.%02ld C, ,(long)(t100/100),(long)(t100%100));}printf(Humidity: %lu.%02lu %%RH\r\n,(unsignedlong)(h100/100),(unsignedlong)(h100%100));}else{printf(Error!\r\n);}Delay_ms(1000);}}五、测试---------------------------------------------------接线--------------------------------------------------UARTPA9 - TXPA10 - RXIICPB6 - SCLPB7 - SDA开发板串口输出如下以上内容个人理解如有不正欢迎指正需要资料及工程可留言邮箱