對於大氣環境監測來說溫濕度也是重要的指標。原本計划使用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%。
接下來我們試驗一下,對傳感器吹一口氣。由於人呼出的氣體含有大量水蒸氣,所以濕度時都會明顯上升。但是溫度的變化不會太明顯。
由於空氣的流動,濕度會在停止吹氣后開始下降,如下圖所示:
至此,采集溫濕度數據完成。