OneNET麒麟座應用開發之三:獲取溫濕度數據


對於大氣環境監測來說溫濕度也是重要的指標。原本計划使用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%。

 

接下來我們試驗一下,對傳感器吹一口氣。由於人呼出的氣體含有大量水蒸氣,所以濕度時都會明顯上升。但是溫度的變化不會太明顯。

 

由於空氣的流動,濕度會在停止吹氣后開始下降,如下圖所示:

 

至此,采集溫濕度數據完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM