zoukankan      html  css  js  c++  java
  • 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%。

     

    接下来我们试验一下,对传感器吹一口气。由于人呼出的气体含有大量水蒸气,所以湿度时都会明显上升。但是温度的变化不会太明显。

     

    由于空气的流动,湿度会在停止吹气后开始下降,如下图所示:

     

    至此,采集温湿度数据完成。

  • 相关阅读:
    Nilearn教程系列(2)-3D和4D niimgs:处理和可视化
    Python-EEG工具库MNE中文教程(9)-参考电极应用
    EEMD算法原理与python实现
    Python-EEG工具库MNE中文教程(8)-参考电极简介
    联想笔记本 thinkpad BIOS 超级密码 Supervisor Password 清除 破解 亲测有效 转载地址https://blog.csdn.net/ot512csdn/article/details/72571674
    C Primer Plus 学习 第四章
    C Primer Plus 学习 第三章
    六 BASH 高级变量
    五 shell 变量与字符串操作
    四 shell基本命令
  • 原文地址:https://www.cnblogs.com/foxclever/p/6840878.html
Copyright © 2011-2022 走看看