本设计以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)
|