1.项目的需求
• 使用板卡上的触摸按键,实现点按和左右滑动,实现传感器选择和切换,并将数据发送到上位机,功能选择的可视化也在上位机完成
如:能够选择加速度传感器,开启X轴数据发送,然后关闭加速度显示,选择温度
处理思路
**(1)板卡上的触摸按键:板卡上的触摸按键是使用板卡自带的QVAR的滑动电极,我们通过在GitHub配置的程序移植一下到我们的STM32Demo历程中移植调用。
**** (2)通过OLED屏幕显示我们当前按键的状态,通过按键单击或者滑动,来控制我们的上位机的显示我们的数据。
**** **(3)通过QT制作上位机,添加按键功能实现我们对数据采集的显示,通过滑动按键控制我们的上位机,对于我们的QT上位机的数据进行开启或者关闭。
2.STM32程序移植的配置
本次的历程是基于STM32自带的历程修改的,首先我们先将应用设置到我们DataLOG窗口。**

根据实例程序需要什么端口,我们手动配置一下需要的串口,来实现我们的操作。**

之后我们就开始移植我们的程序,我们先将程序下载之后,通过我们串口助手查看是否能发送数据。**
**我们可以看到串口助手有数据发送过来,我们的实例程序就已经配置好了

移植QVAR
在实例程序中,我们的QVAR没有代码进行配置,但是底层程序还是存在的,我们从GitHub上找到stm32对QVAR的配置,根据其中的代码来移植我们的程序。**

这里我将QVAR的程序移植到一个.c文件上,之后可以方便我们模块化移植。整体框架就是这样,之后是我们细节问题。
程序流程图

QVAR的手势判断
QVAR的手势判断我们就是要通过判断电压值的变化,通过电压值的变化,来判断我门的滑动状态。**
**这里我们需要我们设置我们的阈值,到达我们的阈值来获取我们的操作的判断。
void QVAR_Proc(void)
{
static uint8_t QVAR_Val,QVAR_Down,QVAR_Up,QVAR_Old;
QVAR_Val = QVAR_Read(QVAR_Value());
QVAR_Down = QVAR_Val & (QVAR_Val ^ QVAR_Old);
QVAR_Up = ~QVAR_Val & (QVAR_Val ^ QVAR_Old);
QVAR_Old = QVAR_Val;
OLED_ShowNum(0,16,QVAR_Val,1,8);
if(QVAR_Down>0)//说明有按键按下
{
QVAR_Down_click_count++;
QVAR_Flag = 1;
time_200ms = 0;
}
//这里我们要判断的是down不等于old
if(time_200ms >= 200)
{
switch(QVAR_Down_click_count)
{
case 1:
//执行单击
OLED_ShowString(0,0,"One ",8);
printf("command:One\r\n");
break;
case 2:
//执行双击
OLED_ShowString(0,0,"Two ",8);
printf("command:Two\r\n");
QVAR_Flag = 0;
break;
}
QVAR_Down_click_count=0;
QVAR_Flag = 0;
time_200ms = 0;
}else if(QVAR_Flag==1&&QVAR_Down!=QVAR_Old&&time_200ms < 200) //按键按下的时候判断
{
QVAR_Flag = 0;
QVAR_Down_click_count = 0;
if(QVAR_Old==2)
{
OLED_ShowString(0,0,"LEFT ",8);
printf("command:Left\r\n");
}
else if(QVAR_Old==1)
{
OLED_ShowString(0,0,"RIGHT ",8);
printf("command:Right\r\n");
}
}
}
这里我们通过在滴答定时器定时我们的短按时间,来判断我们的触摸操作。
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
if(++time_1000ms>=2000)
{
Start = 1;
time_1000ms = 0;
}
if(QVAR_Flag == 1)
{
if(++time_200ms ==200)
{
time_200ms = 201;
}
}else{
time_200ms = 0;
}
if(++time_100s==100)
{
QVAR_Proc();
time_100s = 0;
}
/* USER CODE END SysTick_IRQn 1 */
}
这里我们添加 了 start的标志位,因为这样处理的话,不会让我们的串口发的太快,影响我们的触摸的判断,这里我们我们添加1s的标志位。