基于51单片机的APDS9960 驱动

发布于:2022-10-31 ⋅ 阅读:(625) ⋅ 点赞:(0)

传感器简介

APDS-9960传感器具有先进的手势检测、接近检测、数字环境光感(ALS)和色感(RGBC)。

针脚名称 描述
VL IR LED供电选项(PS跳线断开) 必须是3.0 - 4.5V 
GND 接地
VCC 给模块供电  范围 2.4-3.6V
SDA I2C数据线
SCL I2C时钟线
INT 中断事件引脚(需要配置模块)

注意:

模块上有 PS 以及 IIC PU的焊点 其中PS是两个焊点    IIC PU是三个焊点

PS----> 如果两个焊点没有通过焊锡连接在一起,那么就需要给VL引脚供电。因为这个的功能就是给IR LED供电的,如果你没有连接在一起也没有给VL供电,那么模块就不能正常检测,我就被这个坑了很久,因为买模块的时候厂家不一定会给你焊上,注意!!!

IIC PU----> 将三个焊点用锡全焊起来意味着给IIC SDA SCL加上上拉电阻,尽量还是焊起来

手势识别距离说明: 上下左右手势检测距离最好在3cm以内,远离及靠近在10cm内有效

此代码只用到 IIC两个引脚 INT及VL都悬空不接

实物图:

 这里我只实现了上下左右 远离 靠近 的手势检测,数字环境光感(ALS)和色感(RGBC)我则没有去实现,我粗略的写了RGBC的数据读取,发现读取出来的数据不够严谨, RGB的数值会根据光照的强度来变换,实际上的运用只能说比较三个值的大小来判断检测到的颜色是偏向红蓝绿哪种。并不是真的检测出RGB数值来,所以意义不是非常大

主要代码展示:

//实际获取以及初始化手势模块
uchar ad9s9960_GestureParse(void)
{
    uchar State = 0;
    if(Flag_SystemInit == 0)
    {
        Flag_SystemInit = APDS9960_Init();
        if (Flag_SystemInit == 1)
        {
            APDS9960_Gesture_EN(1);
        }
    }
    if (Flag_SystemInit == 1)
    {
        State = APDS9960_Gesture_Get_State();
    }
    return State;
}


//显示以及调用手势获取函数
//获取数据
void Get_Dat()
{
    uchar Get_Dat;
    //获取手势值
    Get_Dat = ad9s9960_GestureParse();
    //将有效手势显示出来
    if(Get_Dat != 0)
        Dat_Apds = Get_Dat;
    Dis_Dat();
}

//显示 数据
void Dis_Dat()
{
    static uchar Fd;
    if(menu == 0)
    {
        //显示手势值
        LCD_Write_Number(4, 0, Dat_Apds, 1);
        Fd++;
        LCD_Write_Number(4, 1, Fd, 3);
        //手势值对应手势
        switch(Dat_Apds)
        {
            case 0:
                LCD_Write_String(11, 1, "NONE ");
                break;

            case 1:
                LCD_Write_String(11, 1, "LEFT ");
                Led1 = 0;
                break;

            case 2:
                LCD_Write_String(11, 1, "RIGHT");
                Led1 = 1;
                break;

            case 3:
                LCD_Write_String(11, 1, " UP  ");
                Led2 = 0;
                break;

            case 4:
                LCD_Write_String(11, 1, "DOWN ");
                Led2 = 1;
                break;

            case 5:
                LCD_Write_String(11, 1, "NEAR ");
                Led3 = 0;
                break;

            case 6:
                LCD_Write_String(11, 1, " FAR ");
                Led3 = 1;
                break;

            default:
                break;
        }
    }
}

提供资料图示:

 说明:

1.编号1的库除了不能检测到远近外,是最好用的,因为不会卡住在手势获取函数中
   也能解析几秒前执行完的动作

2.编号2的库,如果你的代码中,主要功能就是手势控制开关,那么可以考虑使用这个库
   因为你能将多数的资源时间给手势获取的函数。但是如果你无法保证调用函数的间隔时间
   那么还是不要用这个库,因为用不好可能会导致什么手势都获取不到

3.编号3的库,也能解析几秒前执行完的动作,并且能解析出远离和靠近 ,
   但是模块前方如果有遮挡物的话,会导致程序一直在手势获取函数里,这个需要特别注意!!
   在当模块检测到物体时,会一直在手势获取函数里面解析数据,直到解析出手势来

获取手势间隔越短,使用体验越好

视频展示:

手势检测功能演示

更详细代码视频讲解及代码下载请看:

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到