社区导航

 

搜索
查看: 409|回复: 1

[分享] 基于F103与X-NUCLEO-IKS01A3的计步手环之温度湿度气压检测功能

[复制链接]

57

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-11 21:16 | 显示全部楼层 |阅读模式
本帖最后由 sylar^z 于 2019-8-12 00:21 编辑

  本次计步手环设计基于F103核心板与X-NUCLEO-IKS01A3传感器开发板。温度湿度检测功能通过X-NUCLEO-IKS01A3上的HTS221传感器来实现。气压检测通过X-NUCLEO-IKS01A3上的LPS22HH传感器来实现。

    HTS221是一种超紧凑型传感器,用于相对湿度和温度检测。HTS221供电电压1.7-3.6V,采样频率1Hz-12.5Hz,湿度精度:±3.5%rh,20至+80%rh,温度精度:±0.5°C,15至+40°C。可以通过常用的SPI与I2C进行通讯。

      LPS22HH是一种超小型压阻式绝对压力传感器,可作为数字输出气压计使用。LPS22HH供电电压1.7-3.6V,绝对压力检测范围260至1260 hpa,绝对压力精度0.5 hpa。可以通过常用的SPI与I2C进行通讯。

    计步手环使用HTS221实现温湿度检测功能及LPS22HH实现气压检测功能。在之前添加计步功能的程序(参看《 基于F103与X-NUCLEO-IKS01A3的计步手环之唤醒功能》)基础上进行功能添加。

 

    首先对之前的程序作了一些改动,开启HTS221传感器与LPS22HH传感器,并通过SysTick产生一个1S的事件标志。每1S采集一次温度数据、湿度数据及气压数据,并用最近的三个数据进行均值滤波,来产生一个相对稳定的温度、湿度及气压数值。同时,还增加了按键事件检测及应用,包括单击、双击及长按事件。目前使用单击来切换显示页面。循环显示 计步——温度——湿度——气压界面。

 


  //环境传感器数据采集

  if(currData.env_data_get_flag)

  {

    currData.env_data_get_flag = 0;

   

    if(0 == HTS221_Get_HUM(&currData.humidity[currData.humidityPos]))

    {

      currData.oledShowData.humidity = 0;

      for(uint16_t i = 0; i < DATA_MEAN_NUM; i++)

      {

        currData.oledShowData.humidity += currData.humidity;

      }

      currData.oledShowData.humidity /= DATA_MEAN_NUM;

    }

   

    if(0 == HTS221_Get_TEMP(&currData.temperature[currData.temperaturePos]))

    {

      currData.oledShowData.temperature = 0;

      for(uint16_t i = 0; i < DATA_MEAN_NUM; i++)

      {

        currData.oledShowData.temperature += currData.temperature;

      }

      currData.oledShowData.temperature /= DATA_MEAN_NUM;

    }

   

    if(0 == LPS22HH_Get_PRESS(&currData.pressure[currData.pressurePos]))

    {

      currData.oledShowData.pressure = 0;

      for(uint16_t i = 0; i < DATA_MEAN_NUM; i++)

      {

        currData.oledShowData.pressure += currData.pressure;

      }

      currData.oledShowData.pressure /= DATA_MEAN_NUM;

    }

  }


  //按键事件检测

  if(KeyEventDetected)

  {

    KeyEventDetected = 0;

    if(0 == KeyPressed)

    {

      if(KEY_PRESSED_GRADE_UNKNOW == keyPressedGrade)

      {

        if((HAL_GetTick() - keyPressedTick) > KEY_PRESSED_DELAY)

        {

          keyPressedGrade = KEY_PRESSED_GRADE_TAP;

        }

      }

      else

      {

        keyPressedGrade = KEY_PRESSED_GRADE_UNKNOW;

      }

    }

   

  }

  else if(KeyPressed)

  {

    if(HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin) == (uint32_t)GPIO_PIN_RESET)

    {

      if(KEY_PRESSED_GRADE_UNKNOW == keyPressedGrade)

      {

        if(keyPressedTick < (keyPressedTickLast + KEY_PRESSED_D_TAP_DELAY))

        {

          keyPressedGrade = KEY_PRESSED_GRADE_D_TAP;

        }

        else if((HAL_GetTick() - keyPressedTick) > KEY_PRESSED_L_TAP_DELAY)

        {

          keyPressedGrade = KEY_PRESSED_GRADE_L_TAP;

          keyPressedTickLast = 0;

        }

      }

    }

  }


//按键处理函数

void key_process(uint8_t currGrade)

{

  static emKeyPressedGrade keyPressedGradeOld = KEY_PRESSED_GRADE_UNKNOW;

 

  if(keyPressedGradeOld == currGrade)

  {

    return;

  }

 

  keyPressedGradeOld = currGrade;

  switch(currGrade)

  {

    case KEY_PRESSED_GRADE_TAP:

      currData.oledShowData.currPage++;

      if(currData.oledShowData.currPage >= HMI_PAGE_UNKNOW)

      {

        currData.oledShowData.currPage = HMI_PAGE_TEMPERATURE;

      }

      keyPressedGrade = KEY_PRESSED_GRADE_UNKNOW;

      break;

    case KEY_PRESSED_GRADE_D_TAP:

      break;

    case KEY_PRESSED_GRADE_L_TAP:

      break;

    default:

      break;

  }

}

 

第一张是按键位置图。平时屏幕是关闭显示的,程序设计了6秒无动作自动关闭显示,节能。只要轻轻敲击一下,即可唤醒屏幕。

5.jpg

 

计步界面显示效果:

1.jpg

 

温度显示界面

2.jpg

 

湿度显示界面

3.jpg

 

气压显示界面

4.jpg

 

附源代码: CORE-STM32F103C8_FOR_X-NUCLEO_IKS01A3-ENV_SENSOR.rar (13.3 MB, 下载次数: 14)



回复

使用道具 举报

923

TA的帖子

3

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-8-12 15:00 | 显示全部楼层

多谢分享



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-8-22 23:20 , Processed in 0.097591 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表