2557|1

171

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

  本帖最后由 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秒无动作自动关闭显示,节能。只要轻轻敲击一下,即可唤醒屏幕。

 

计步界面显示效果:

 

温度显示界面

 

湿度显示界面

 

气压显示界面

 

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

HTS221手册: hts221.pdf (741.71 KB, 下载次数: 3)

LPS22HH手册: lps22hh.pdf (1.21 MB, 下载次数: 4)

 

 

 

 

最新回复

多谢分享   详情 回复 发表于 2019-8-12 15:00
点赞 关注(1)
 

回复
举报

994

帖子

3

TA的资源

一粒金砂(高级)

沙发
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表