找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5230|回复: 10
收起左侧

STM32+PAJ7620手势识别的智能家居控制系统识别系统程序设计

  [复制链接]
ID:327295 发表于 2021-9-2 22:13 | 显示全部楼层 |阅读模式
项目描述:模块采用ATK-PAJ7620_V1.2,自带九种手势识别,支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,STM32与模块之间采用IIC进行通信,识别不同的手势通过IIC读取模块寄存器的值是不相同的,根据识别不同手势的值控制对应的器件。4个灯的亮灭分别代表4种手势的识别,STM32通过IO口控制灯亮灭,例如判别为第一种手势,灯1亮,第二个手势灯1灭灯2亮,识别不了按照前面的方式亮。风扇控制方面采用PWM波控制,三个PWM波分别为低中高,然后满占空比对应全开,0占空比对应关,以此对应5种手势状态。

项目分为以下几个部分:
1.基于正点原子的ATK-PAJ7620红外手势识别模块IIC通信与手势判别
2.基于L298N的PWM电机控制
3.LED灯的控制

硬件部分:
1.STM32最小系统
2.L298N电机驱动模块及电机和扇叶
3.LED灯模块
4.ATK-PAJ7620手势识别模块
最小系统的原理图如下所示:

STM32最小系统

STM32最小系统



硬件连接为:
1.ATK-PAJ7620 IIC PB10:SCL PB11:SDA
2.L298N PWM控制口:PB5
3.LED接口:PB6 PB7 PB8 PB9

首先是ATK-PAJ7620模块的IIC初始化
单片机源程序如下:
  1. #include "paj7620u2_iic.h"
  2. #include "paj7620u2.h"
  3. #include "delay.h"

  4. //PAJ2670 I2C初始化
  5. void GS_i2c_init(void)
  6. {
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
  9.          
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;  //端口配置
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;       //推挽输出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50Mhz速度
  13.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  14.         GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//PB10,PB11 输出高        
  15.         
  16. }

  17. //产生IIC起始信号
  18. static void GS_IIC_Start(void)
  19. {
  20.         GS_SDA_OUT();//sda线输出
  21.         GS_IIC_SDA=1;                    
  22.         GS_IIC_SCL=1;
  23.         delay_us(4);
  24.          GS_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  25.         delay_us(4);
  26.         GS_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  27. }

  28. //产生IIC停止信号
  29. static void GS_IIC_Stop(void)
  30. {
  31.         GS_SDA_OUT();//sda线输出
  32.         GS_IIC_SCL=0;
  33.         GS_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  34.          delay_us(4);
  35.         GS_IIC_SCL=1;
  36.         GS_IIC_SDA=1;//发送I2C总线结束信号
  37.         delay_us(4);                                                                  
  38. }

  39. //等待应答信号到来
  40. //返回值:1,接收应答失败
  41. //        0,接收应答成功
  42. static u8 GS_IIC_Wait_Ack(void)
  43. {
  44.         u8 ucErrTime=0;
  45.         GS_SDA_IN();  //SDA设置为输入  
  46.         GS_IIC_SDA=1;delay_us(3);           
  47.         GS_IIC_SCL=1;delay_us(3);         
  48.         while(GS_READ_SDA)
  49.         {
  50.                 ucErrTime++;
  51.                 if(ucErrTime>250)
  52.                 {
  53.                         GS_IIC_Stop();
  54.                         return 1;
  55.                 }
  56.         }
  57.         GS_IIC_SCL=0;//时钟输出0            
  58.         return 0;  
  59. }

  60. //产生ACK应答
  61. static void GS_IIC_Ack(void)
  62. {
  63.         GS_IIC_SCL=0;
  64.         GS_SDA_OUT();
  65.         GS_IIC_SDA=0;
  66.         delay_us(3);
  67.         GS_IIC_SCL=1;
  68.         delay_us(3);
  69.         GS_IIC_SCL=0;
  70. }

  71. //不产生ACK应答                    
  72. static void GS_IIC_NAck(void)
  73. {
  74.         GS_IIC_SCL=0;
  75.         GS_SDA_OUT();
  76.         GS_IIC_SDA=1;
  77.         delay_us(2);
  78.         GS_IIC_SCL=1;
  79.         delay_us(2);
  80.         GS_IIC_SCL=0;
  81. }

  82. //IIC发送一个字节
  83. //返回从机有无应答
  84. //1,有应答
  85. //0,无应答                          
  86. static void GS_IIC_Send_Byte(u8 txd)
  87. {                        
  88.     u8 t;   
  89.         GS_SDA_OUT();            
  90.     GS_IIC_SCL=0;//拉低时钟开始数据传输
  91.     for(t=0;t<8;t++)
  92.     {              
  93.                 if((txd&0x80)>>7)
  94.                         GS_IIC_SDA=1;
  95.                 else
  96.                         GS_IIC_SDA=0;
  97.                 txd<<=1;           
  98.                 delay_us(5);  
  99.                 GS_IIC_SCL=1;
  100.                 delay_us(5);
  101.                 GS_IIC_SCL=0;        
  102.                 delay_us(5);
  103.     }         
  104. }

  105. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  106. static u8 GS_IIC_Read_Byte(u8 ack)
  107. {
  108.         u8 i,receive=0;
  109.         GS_SDA_IN();//SDA设置为输入
  110.         for(i=0;i<8;i++ )
  111.         {
  112.                 GS_IIC_SCL=0;
  113.                 delay_us(4);
  114.           GS_IIC_SCL=1;
  115.                 receive<<=1;
  116.                 if(GS_READ_SDA)receive++;   
  117.           delay_us(4);
  118.         }                                         
  119.         if (!ack)
  120.                 GS_IIC_NAck();//发送nACK
  121.         else
  122.                 GS_IIC_Ack(); //发送ACK   
  123.         return receive;
  124. }

  125. //PAJ7620U2写一个字节数据
  126. u8 GS_Write_Byte(u8 REG_Address,u8 REG_data)
  127. {
  128.         GS_IIC_Start();
  129.         GS_IIC_Send_Byte(PAJ7620_ID);
  130.         if(GS_IIC_Wait_Ack())
  131.         {
  132.                 GS_IIC_Stop();//释放总线
  133.                 return 1;//没应答则退出

  134.         }
  135.         GS_IIC_Send_Byte(REG_Address);
  136.         GS_IIC_Wait_Ack();        
  137.         GS_IIC_Send_Byte(REG_data);
  138.         GS_IIC_Wait_Ack();        
  139.         GS_IIC_Stop();

  140.         return 0;
  141. }

  142. //PAJ7620U2读一个字节数据
  143. u8 GS_Read_Byte(u8 REG_Address)
  144. {
  145.         u8 REG_data;
  146.         
  147.         GS_IIC_Start();
  148.         GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
  149.         if(GS_IIC_Wait_Ack())
  150.         {
  151.                  GS_IIC_Stop();//释放总线
  152.                  return 0;//没应答则退出
  153.         }               
  154.         GS_IIC_Send_Byte(REG_Address);
  155.         GS_IIC_Wait_Ack();
  156.         GS_IIC_Start();
  157.         GS_IIC_Send_Byte(PAJ7620_ID|0x01);//发读命令
  158.         GS_IIC_Wait_Ack();
  159.         REG_data = GS_IIC_Read_Byte(0);
  160.         GS_IIC_Stop();

  161.         return REG_data;
  162. }
  163. //PAJ7620U2读n个字节数据
  164. u8 GS_Read_nByte(u8 REG_Address,u16 len,u8 *buf)
  165. {
  166.         GS_IIC_Start();
  167.         GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
  168.         if(GS_IIC_Wait_Ack())
  169.         {
  170.                 GS_IIC_Stop();//释放总线
  171.                 return 1;//没应答则退出
  172.         }
  173.         GS_IIC_Send_Byte(REG_Address);
  174.         GS_IIC_Wait_Ack();

  175.         GS_IIC_Start();
  176.         GS_IIC_Send_Byte(PAJ7620_ID|0x01);//发读命令
  177.         GS_IIC_Wait_Ack();
  178.         while(len)
  179.         {
  180.                 if(len==1)
  181.                 {
  182.                         *buf = GS_IIC_Read_Byte(0);
  183.                 }
  184.                 else
  185.                 {
  186.                         *buf = GS_IIC_Read_Byte(1);
  187.                 }
  188.                 buf++;
  189.                 len--;
  190.         }
  191.         GS_IIC_Stop();//释放总线

  192.         return 0;
  193.         
  194. }
  195. //PAJ7620U2唤醒
  196. void GS_WakeUp(void)
  197. {
  198.         GS_IIC_Start();
  199.         GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
  200.         GS_IIC_Stop();//释放总线
  201. }
复制代码

PWM初始化:配置TIM3定时器产生PWM频率为80KHZ
  1. #include "timer.h"
  2. #include "led.h"
  3. #include "usart.h"
  4.             
  5. //通用定时器3中断初始化
  6. //这里时钟选择为APB1的2倍,而APB1为36M
  7. //arr:自动重装值。
  8. //psc:时钟预分频数
  9. //这里使用的是定时器3!
  10. void TIM3_Int_Init(u16 arr,u16 psc)
  11. {
  12.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  13.         NVIC_InitTypeDef NVIC_InitStructure;

  14.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

  15.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
  16.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
  17.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  18.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  19.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  20.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

  21.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  22.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  23.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  24.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  25.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  26.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
  27.                                                          
  28. }
  29. //定时器3中断服务程序
  30. void TIM3_IRQHandler(void)   //TIM3中断
  31. {
  32.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  33.                 {
  34.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
  35.                 //LED1=!LED1;
  36.                 }
  37. }




  38. //TIM3 PWM部分初始化
  39. //PWM输出初始化
  40. //arr:自动重装值
  41. //psc:时钟预分频数
  42. void TIM3_PWM_Init(u16 arr,u16 psc)
  43. {  
  44.         GPIO_InitTypeDef GPIO_InitStructure;
  45.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  46.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  47.         

  48.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  49.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  50.         
  51.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  52.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
  53.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  54.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  55.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  57.    //初始化TIM3
  58.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  59.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  60.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  61.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  62.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  63.         
  64.         //初始化TIM3 Channel2 PWM模式         
  65.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  66.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  67.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  68.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

  69.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  70.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  71.         

  72. }
复制代码

LED灯初始化不再赘述,ATK-PAJ7620功能函数如下,主要通过IIC通信返回的数据再结合手册可做判断模块识别到为什么手势进而进行相应的控制
  1. #include "paj7620u2.h"
  2. #include "paj7620u2_cfg.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "led.h"
  6. #include "lcd.h"
  7. #include "key.h"

  8. //选择PAJ7620U2 BANK区域
  9. void paj7620u2_selectBank(bank_e bank)
  10. {
  11.         switch(bank)
  12.         {
  13.                 case BANK0: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);break;//BANK0寄存器区域
  14.                 case BANK1: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK1);break;//BANK1寄存器区域
  15.         }
  16.                         
  17. }

  18. //PAJ7620U2唤醒
  19. u8 paj7620u2_wakeup(void)
  20. {
  21.         u8 data=0x0a;
  22.         GS_WakeUp();//唤醒PAJ7620U2
  23.         delay_ms(5);//唤醒时间>700us
  24.         GS_WakeUp();//唤醒PAJ7620U2
  25.         delay_ms(5);//唤醒时间>700us
  26.         paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域
  27.         data = GS_Read_Byte(0x00);//读取状态
  28.         if(data!=0x20) return 0; //唤醒失败
  29.         
  30.         return 1;
  31. }

  32. //PAJ7620U2初始化
  33. //返回值:0:失败 1:成功
  34. u8 paj7620u2_init(void)
  35. {
  36.         u8 i;
  37.         u8 status;
  38.         
  39.         GS_i2c_init();//IIC初始化
  40.         status = paj7620u2_wakeup();//唤醒PAJ7620U2
  41.         if(!status) return 0;
  42.     paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域
  43.         for(i=0;i<INIT_SIZE;i++)
  44.         {
  45.                 GS_Write_Byte(init_Array[i][0],init_Array[i][1]);//初始化PAJ7620U2
  46.         }
  47.     paj7620u2_selectBank(BANK0);//切换回BANK0寄存器区域
  48.         
  49.         return 1;
  50. }

  51. //主菜单
  52. void paj7620u2_test_ui(void)
  53. {
  54.         POINT_COLOR=BLUE;//设置字体为蓝色
  55.         LCD_Fill(30,170,300,300,WHITE);
  56.         LCD_ShowString(30,170,200,16,16,"KEY1:   Gesrure test");//手势识别测试
  57.         LCD_ShowString(30,190,200,16,16,"KEY0:   Ps test     ");//接近距离测试
  58.         
  59. }

  60. //手势识别测试
  61. void Gesrure_test(void)
  62. {
  63.         u8 i;
  64.     u8 status;
  65.         u8 key;
  66.         u8 data[2]={0x00};
  67.         u16 gesture_data;
  68.         u8 ledflash=0;
  69.         
  70.         paj7620u2_selectBank(BANK0);//进入BANK0
  71.         for(i=0;i<GESTURE_SIZE;i++)
  72.         {
  73.                 GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手势识别模式初始化
  74.         }
  75.         paj7620u2_selectBank(BANK0);//切换回BANK0
  76.         i=0;
  77.         POINT_COLOR=BLUE;//设置字体为蓝色
  78. //        LCD_Fill(30,170,300,300,WHITE);
  79. //        LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");
  80. //        LCD_ShowString(30,210,200,16,16,"Gesrure test");
  81. //        POINT_COLOR=RED;//设置字体为蓝色
  82.         while(1)
  83.         {
  84.         key = KEY_Scan(0);
  85.                 if(key==WKUP_PRES)
  86.                 {
  87.                         GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//关闭手势识别中断输出
  88.                         GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);
  89.                         break;
  90.                 }                        
  91.         status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态                        
  92.                 if(!status)
  93.                 {   
  94.                         gesture_data =(u16)data[1]<<8 | data[0];
  95.                         if(gesture_data)
  96.                         {
  97.                                 switch(gesture_data)
  98.                                 {
  99.                                         case GES_UP:               GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  100.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);
  101.                                                                    printf("Up\r\n");            ledflash=1;      break; //向上
  102.                                         case GES_DOWM:             GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_ResetBits(GPIOB,GPIO_Pin_6);
  103.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);     
  104.                                                                           printf("Dowm\r\n");          ledflash=1;      break; //向下
  105.                                         case GES_LEFT:             GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  106.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);         
  107.                                                                          printf("Left\r\n");          ledflash=1;      break; //向左
  108.                                         case GES_RIGHT:            GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  109.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_6);TIM_SetCompare2(TIM3,1000);      
  110.                                                                        printf("Right\r\n");         ledflash=1;      break; //向右
  111.                                         case GES_FORWARD:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  112.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);        
  113.                                                                        printf("Forward\r\n");       ledflash=1;      break; //向前
  114.                                         case GES_BACKWARD:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  115.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,0);   
  116.                                                                        printf("Backward\r\n");      ledflash=1;      break; //向后
  117.                                         case GES_CLOCKWISE:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  118.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,50);     
  119.                                                                        printf("Clockwise\r\n");     ledflash=1;      break; //顺时针
  120.                                         case GES_COUNT_CLOCKWISE:  GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  121.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,200);  
  122.                                                                           printf("AntiClockwise\r\n"); ledflash=1;      break; //逆时针
  123.                                         case GES_WAVE:             GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  124.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,550);   
  125.                                                                        printf("Wave\r\n");          ledflash=1;      break; //挥动
  126.                                         default:  ledflash=0; break;
  127.                                        
  128.                                 }        
  129.                 if(ledflash)//DS1闪烁
  130.                                 {   
  131. //                                        LED1=0;delay_ms(80);LED1=1;delay_ms(80);
  132. //                                        LED1=0;delay_ms(80);LED1=1;delay_ms(80);
  133.                                         delay_ms(300);
  134.                                         //LCD_ShowString(40,250,200,16,24,"                        ");
  135.                                         ledflash=0;
  136.                                 }                                                
  137.                         }
  138.                         
  139.                 }
  140.                 delay_ms(50);
  141. //                i++;
  142. //                if(i==5)
  143. //                {
  144. //                        LED0=!LED0;//提示系统正在运行        
  145. //                        i=0;
  146. //                }                  
  147.         }
  148. }

  149. //接近检测测试
  150. void Ps_test(void)
  151. {
  152.         u8 i;
  153.         u8 key;
  154.         u8 data[2]={0x00};
  155.         u8 obj_brightness=0;
  156.         u16 obj_size=0;
  157.         
  158.         paj7620u2_selectBank(BANK0);//进入BANK0
  159.         for(i=0;i<PROXIM_SIZE;i++)
  160.         {
  161.                 GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);//接近检测模式初始化
  162.         }
  163.         paj7620u2_selectBank(BANK0);//切换回BANK0
  164.         i=0;
  165.         POINT_COLOR=BLUE;//设置字体为蓝色
  166.         LCD_Fill(30,170,300,300,WHITE);
  167.         LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");
  168.         LCD_ShowString(30,210,200,16,16,"Ps test");
  169.         LCD_ShowString(30,240,200,16,16,"Brightness");
  170.         LCD_ShowString(160,240,200,16,16,"Size");
  171.         POINT_COLOR=RED;//设置字体为蓝色        
  172.         
  173.         while(1)
  174.         {        
  175.                 key = KEY_Scan(0);
  176.                 if(key==WKUP_PRES) break;
  177.                
  178.                 obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//读取物体亮度
  179.                 data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//读取物体大小
  180.                 data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);
  181.                 obj_size = ((u16)data[1] & 0x0f)<<8 | data[0];
  182.                 LCD_ShowxNum(50,270,obj_brightness,3,24,0);
  183.                 LCD_ShowxNum(152,270,obj_size,3,24,0);
  184.                 printf("obj_brightness: %d\r\n",obj_brightness);
  185.         printf("obj_size: %d\r\n",obj_size);
  186.                
  187.                 delay_ms(100);
  188. //                i++;
  189. //                if(i==5)
  190. //                {
  191. //                    LED0=!LED0;//提示系统正在运行        
  192. //                        i=0;
  193. //                }
  194.         }
  195.         
  196. }
  197. //PAJ7620U2传感器测试
  198. void paj7620u2_sensor_test(void)
  199. {   
  200.          u8 i=0;
  201.          u8 key;
  202.         
  203.    paj7620u2_test_ui();//主菜单显示
  204.          while(1)
  205.          {
  206.                  key = KEY_Scan(0);//按键扫描
  207.                  if(key)
  208.                  {
  209.                          switch(key)
  210.                          {
  211.                                  case KEY1_PRES:  Gesrure_test();   break;//手势检测模式
  212.                                  case KEY0_PRES:  Ps_test();        break;//接近检测模式  
  213.                          }
  214.                          paj7620u2_test_ui();
  215.                  }
  216.                 delay_ms(50);
  217.                 i++;
  218.                 if(i==5)
  219.                 {
  220.                     //LED0=!LED0;//提示系统正在运行        
  221.                         i=0;
  222.                 }
  223.                  
  224.          }
  225. }
复制代码
代码工程与pdf资料51hei附件下载:
手势识别.7z (252.15 KB, 下载次数: 181)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:116773 发表于 2021-9-3 08:41 | 显示全部楼层
不错的应用,那天也买一个模块来实验。
回复

使用道具 举报

ID:1004236 发表于 2022-2-7 02:03 | 显示全部楼层
值得一试
回复

使用道具 举报

ID:310441 发表于 2022-2-7 17:34 来自手机 | 显示全部楼层
这个手势识别模块属于图像识别范畴么?
回复

使用道具 举报

ID:327295 发表于 2022-3-31 23:09 | 显示全部楼层
DoneDone 发表于 2022-2-7 17:34
这个手势识别模块属于图像识别范畴么?

不属于,只是红外感知
回复

使用道具 举报

ID:842688 发表于 2022-4-2 00:50 来自手机 | 显示全部楼层
写的很详细,很有参考价值
回复

使用道具 举报

ID:310441 发表于 2022-4-2 20:48 来自手机 | 显示全部楼层
感觉这个手势识别错误率有点高哦!
回复

使用道具 举报

ID:77589 发表于 2022-10-26 17:32 | 显示全部楼层
空了来试试,谢谢分享!
回复

使用道具 举报

ID:900479 发表于 2023-2-13 21:47 | 显示全部楼层
谢谢分享,先移植看看
回复

使用道具 举报

ID:756400 发表于 2023-3-5 17:45 | 显示全部楼层
反手给你个赞,实测,程序可用。
回复

使用道具 举报

ID:77589 发表于 2023-4-26 15:27 | 显示全部楼层
写的可以,支持!!!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表