对于大气环境监测来说温湿度也是重要的指标。原本计划使用SHT15来采集温湿度数据,不过在OneNET麒麟开发板上,我们发现已经集成有SHT20温湿度传感器,于是我们就使用它了。如下图的红框处:
我们还得再核实一下究竟是怎么连接的呢?我们察看原理图,发现使用了I2C2(PB10、PB11)作为通讯接口。
接下来我们在STM32CubeMX中配置I2C2端口,具体配置如下:
配置完成后,对I2C2的具体初始化代码如下:
static void MX_I2C2_Init(void) { hi2c2.Instance = I2C2; hi2c2.Init.ClockSpeed = 100000; hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c2.Init.OwnAddress1 = 0; hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c2.Init.OwnAddress2 = 0; hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c2) != HAL_OK) { Error_Handler(); } } 对GPIO的初始化配置: void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C2) { /**I2C2 GPIO 配置 PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_RCC_I2C2_CLK_ENABLE(); } }
完成以上配置后,接下来我们编写SHT20的驱动程序,由于SHT20采用的是标准的I2C协议,所以我们可以方便的使用ST提供的相关库函数。
//读取测量数据 uint8_t SHT2x_MeasureHM(etSHT2xMeasureType eSHT2xMeasureType, nt16 *pMeasurand) { uint8_t checksum; uint8_t data[2]; uint8_t error=0; uint16_t i; I2c_StartCondition(); error |= I2c_WriteByte (I2C_ADR_W); switch(eSHT2xMeasureType) { case HUMIDITY: { error |= I2c_WriteByte (TRIG_RH_MEASUREMENT_HM); break; } case TEMP : { error |= I2c_WriteByte (TRIG_T_MEASUREMENT_HM); break; } default: assert(0); } I2c_StartCondition(); error |= I2c_WriteByte (I2C_ADR_R); SCL=HIGH; for(i=0; i<1000; i++) { DelayMicroSeconds(1000); if (SCL_CONF==1) break; } if(SCL_CONF==0) error |= TIME_OUT_ERROR; pMeasurand->s16.u8H = data[0] = I2c_ReadByte(ACK); pMeasurand->s16.u8L = data[1] = I2c_ReadByte(ACK); checksum=I2c_ReadByte(NO_ACK); error |= SHT2x_CheckCrc (data,2,checksum); I2c_StopCondition(); return error; } //软件复位 uint8_t SHT2x_SoftReset() { uint8_t error=0; I2c_StartCondition(); error |= I2c_WriteByte (I2C_ADR_W); error |= I2c_WriteByte (SOFT_RESET); I2c_StopCondition(); DelayMicroSeconds(15000); return error; } //计算相对湿度 float SHT2x_CalcRH(uint16_t u16sRH) { ft humidityRH; u16sRH &= ~0x0003; humidityRH = -6.0 + 125.0/65536 * (ft)u16sRH; return humidityRH; } //计算温度 float SHT2x_CalcTemperatureC(uint16_t u16sT) { ft temperatureC; u16sT &= ~0x0003; temperatureC= -46.85 + 175.72/65536 *(ft)u16sT; return temperatureC; }
编写完成编译没问题,运行看一看结果。显示当前的室温为23.3摄氏度,相对湿度为17.5%。
接下来我们试验一下,对传感器吹一口气。由于人呼出的气体含有大量水蒸气,所以湿度时都会明显上升。但是温度的变化不会太明显。
由于空气的流动,湿度会在停止吹气后开始下降,如下图所示:
至此,采集温湿度数据完成。