标题:
基于STM32+FDC2214的手势识别程序,OLED显示,音乐播放
[打印本页]
作者:
qjm
时间:
2019-1-16 19:31
标题:
基于STM32+FDC2214的手势识别程序,OLED显示,音乐播放
本设计以STM32F103ZET6为主控芯片,TI公司的FDC2214芯片传感模块为手势识别传感器模块,0.96寸OLED为识别结果显示模块,XY-V17B为语音播报模块,设计了一种手势识别装置。利用覆铜板感应手势,感应信号送入FDC2214芯片,单片机读取FDC2214采集的信息数据,对读取的数据进行软件滤波,滤波算法包含算数平均滤波、中位值滤波法等。测试结果表明:该作品实现了学习、猜拳、划拳手势的准确判别,并扩展了语音播报结果和特定手势播放特定音乐等相关功能。
STM32单片机源程序如下:
#include "bsp.h"
#include "stmflash.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "oled.h"
#include "usart.h"
#include "XYV17B.h"
int ChValue[4] = {0};
const u8 TEXT_Buffer[]={"STM32 FLASH TEST"};
int xuexi_value[8];//学习值保存
int xuexi_read_value[8];//学习值读取
#define FLASH_SAVE_ADDR 0X08070000 //设置FLASH 保存地址(必须为偶数)
#define SIZE1 sizeof(xuexi_value)
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
int main()
{
int x1=100,x2=100,y1=30,y2=30,y3=30,y4=30;
delay_init();
uart_init(9600);
IIC_Init();
OLED_Init(); //初始化oled
delay_ms(100);
KEY_Init(); //初始化KEY
//InitSingleFDC2214();//初始化单通道
InitMultiFDC2214();
OLED_Clear();
XYV17B_init();
//////////////////////////////学习
if(xuexi==0)
{
delay_ms(100);
if(xuexi==0)
{
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)xuexi_value,SIZE1);
SC_black_Init();
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)xuexi_value,SIZE1);
while(1)
{
OLED_Clear();//清屏
OLED_ShowString(0,0,"OK!");
while(1)
{
printf("石头=%d\n",xuexi_value[0]);
printf("剪刀=%d\n",xuexi_value[1]);
printf("布=%d\n",xuexi_value[2]);
printf("1=%d\n",xuexi_value[3]);
printf("2=%d\n",xuexi_value[4]);
printf("3=%d\n",xuexi_value[5]);
printf("4=%d\n",xuexi_value[6]);
printf("5=%d\n",xuexi_value[7]);
delay_ms(5000);
}
}
}
}
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)xuexi_read_value,SIZE1);//读取flash的值
////////////////////////定义范围////////////////////////////////
x1=(xuexi_read_value[1]-xuexi_read_value[0])/2;
x2=(xuexi_read_value[0]-xuexi_read_value[2])/2;
y1=(xuexi_read_value[3]-xuexi_read_value[4])/2;
y2=(xuexi_read_value[4]-xuexi_read_value[5])/2;
y3=(xuexi_read_value[5]-xuexi_read_value[6])/2;
y4=(xuexi_read_value[6]-xuexi_read_value[7])/2;
////////////////////////读取flash的值////////////////////////////////////////
while(0)
{
printf("石头=%d\n",xuexi_value[0]);
printf("剪刀=%d\n",xuexi_value[1]);
printf("布=%d\n",xuexi_value[2]);
printf("1=%d\n",xuexi_value[3]);
printf("2=%d\n",xuexi_value[4]);
printf("3=%d\n",xuexi_value[5]);
printf("4=%d\n",xuexi_value[6]);
printf("5=%d\n",xuexi_value[7]);
delay_ms(5000);
}
qumu(1);//曲目 1-20
//void STOP_music();
/////////////////////主程序//////////////////////////////////////////////////
while(1)
{
OLED_Clear();
// KEY_value();
// ChValue[0] = FDC2X14ReadCH(1);
// ChValue[1] = FDC2X14ReadCH(2);
// ChValue[2] = FDC2X14ReadCH(3);
// ChValue[3] = Filter4();
OLED_ShowNum(0,6,ChValue[3],10,16);
ChValue[3] = FDC2X14ReadCH(4)/1000;
// OLED_ShowNum(30,3,ChValue[3],7,16);
if(moshiqiehuan==0)//猜拳
{
//清屏
//if(ChValue[3]>=8700000&&ChValue[3]<=8900000)
if(ChValue[3]>=(xuexi_read_value[0]-x2)&&ChValue[3]<=(xuexi_read_value[0]+x1))
{
OLED_ShowCHinese(30,3,1);
OLED_ShowCHinese(50,3,2);//石头
printf("石头=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[1]-x1)&&ChValue[3]<=(xuexi_read_value[1]+500))
{
OLED_ShowCHinese(45,3,3);
OLED_ShowCHinese(65,3,4);//剪刀
printf("剪刀=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[2]-500)&&ChValue[3]<=(xuexi_read_value[2]+x2))
{
OLED_ShowCHinese(60,3,5);//布
printf("布=%d\n",ChValue[3]);
}
else
{
OLED_ShowString(0,0,"Error!");
printf("Error=%d\n",ChValue[3]);
}
}
if(moshiqiehuan==1)//划拳
{
if(ChValue[3]>=(xuexi_read_value[3]-y1)&&ChValue[3]<=(xuexi_read_value[3]+200))
{
OLED_ShowNum(0,3,1,1,16);
printf("1=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[4]-y2)&&ChValue[3]<(xuexi_read_value[4]+y1))
{
OLED_ShowNum(15,3,2,1,16);
printf("2=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[5]-y3)&&ChValue[3]<=(xuexi_read_value[5]+y2))
{
OLED_ShowNum(30,3,3,1,16);
printf("3=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[6]-y4)&&ChValue[3]<=(xuexi_read_value[6]+y3))
{
OLED_ShowNum(45,3,4,1,16);
printf("4=%d\n",ChValue[3]);
}
else
if(ChValue[3]>=(xuexi_read_value[7]-500)&&ChValue[3]<=(xuexi_read_value[7]+y4))
{
OLED_ShowNum(60,3,5,1,16);
printf("5=%d\n",ChValue[3]);
}
else
{
OLED_ShowString(0,0,"Error!");
printf("Error=%d\n",ChValue[3]);
}
}
//delay_ms(10);
}
}
复制代码
所有资料51hei提供下载:
7.22 - 副本.7z
(206.42 KB, 下载次数: 108)
2019-1-17 04:09 上传
点击文件名下载附件
基于FDC2214手势识别,OLED显示,音乐播放
下载积分: 黑币 -5
作者:
nb44444
时间:
2019-3-4 00:00
厉害了,来学习学习
作者:
lihui2558
时间:
2019-3-5 14:37
下载学习一下
作者:
lihui2558
时间:
2019-3-6 13:16
这个手势传感模块应该不便宜吧
作者:
13574103468
时间:
2019-6-3 14:57
下载了,先学一波
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1