基于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)
|