【雕爷学编程】Arduino动手做(95)---GY9960手势传感器模块5

news2024/11/24 19:51:29

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块

在这里插入图片描述
这是一个 RGB和手势传感器模块,小接口板具有内置APDS-9960芯片,提供环境光与颜色测量,接近检测和非接触手势检测。有了这个RGB和手势感应器,你就可以控制一台计算机,单片机,机器人,它比你的手一个简单的刷卡功能强大的多!实际上,该手势传感器APDS-9960在三星Galaxy S5中使用。该APDS-9960是一个极小的传感器,内置紫外线和红外线阻隔滤镜,四个单独的二极管不同方向的敏感,以及一个I2C兼容接口。为了使用方便,设计出了以下引脚:VL(可选功率IR LED),GND(地),VCC(电源,APDS-9960传感器),SDA(I2C数据),SCL(时钟I2C)和INT(中断)。每个APDS-9960还具有4至8英寸(10至20cm)的检测范围。
在这里插入图片描述
APDS-9960 中文资料 (P39)

https://wenku.baidu.com/view/2b2 … 4ae45c3b35c27b.html

https://max.book118.com/html/2017/0905/131913559.shtm

模块电原理图

在这里插入图片描述
在这里插入图片描述

APDS-9960手势检测模块参数与特点:
工作电压:3.3V
环境光及RGB色彩感应
接近检测
手势检测
测量范围:4-8in(10-20CM)
I2C接口(I2C地址:0x39)

对于APDS
SDA = A4
SCL = A5
GND = GND
VCC = 3.3V

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块
程序六:计算滑动方向(上、下、左、右)并显示在串口上
(1)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序六:计算滑动方向(上、下、左、右)并显示在串口上
  注:设备的 I2C 地址为 0x39
*/

#include <Wire.h>

#include <SparkFun_APDS9960.h>//导入9960驱动库

// 引脚
#define APDS9960_INT    2 // 中断引脚为D2

// 常量

// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

  // 设置中断引脚为输入
  pinMode(APDS9960_INT, INPUT);

  //初始化串口
  Serial.begin(9600);

  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("     APDS-9960 - 手势测试"));
  Serial.println(F("--------------------------------"));

 //初始化中断服务程序
  attachInterrupt(0, interruptRoutine, FALLING);

  // 初始化 APDS-9960(配置 I2C 和初始值)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 初始化完成"));
  } else {
    Serial.println(F("APDS-9960 初始化期间出现问题!"));
  }

  // 开始运行 APDS-9960 手势传感器引擎
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("手势传感器正在运行"));
  } else {
    Serial.println(F("手势传感器初始化过程中出现问题!"));
  }
}

void loop() {
  if ( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {

      case DIR_UP:
        Serial.println("向上");
        break;
      case DIR_DOWN:
        Serial.println("向下");
        break;
      case DIR_LEFT:
        Serial.println("向左");
        break;
      case DIR_RIGHT:
        Serial.println("向右");
        break;
      case DIR_NEAR:
        Serial.println("靠近");
        break;
      case DIR_FAR:
        Serial.println("远离");
        break;
      default:
        Serial.println("无动作");
    }
  }
}

(2)实验串口返回情况

(3)实验说明
a重要提示:APDS-9960 只能接受 3.3V!
b要执行 “靠近” 手势,请握住您的手远高于传感器并将其移近传感器(在 2
英寸)。握住你的手至少 1 秒钟然后移动它离开。
c要执行 “远离” 手势,请将您的手握在距离目标 2 英寸的范围内传感器至少 1 秒钟,然后将其移到上方(从范围)的传感器。

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块
程序七:轮询传感器环境光和颜色级别,并显示在串口上
(1)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序七:轮询传感器环境光和颜色级别,并显示在串口上
  注:设备的 I2C 地址为 0x39
*/

#include <Wire.h>
#include <SparkFun_APDS9960.h>//导入9960驱动库

// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;

void setup() {
  //初始化串口
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("      APDS-9960 - 颜色传感器"));
  Serial.println(F("--------------------------------"));

  // 初始化 APDS-9960(配置 I2C 和初始值)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 初始化完成"));
  } else {
    Serial.println(F("APDS-9960 初始化期间出现问题!"));
  }

  // 开始运行 APDS-9960 光传感器(无中断)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("光传感器正在运行"));
  } else {
    Serial.println(F("光传感器初始化过程中出现问题!"));
  }

  // 等待初始化和校准完成
  delay(500);
}

void loop() {
  // 读取光照水平(环境、红色、绿色、蓝色)
  if (  !apds.readAmbientLight(ambient_light) ||
        !apds.readRedLight(red_light) ||
        !apds.readGreenLight(green_light) ||
        !apds.readBlueLight(blue_light) ) {
    Serial.println("读取光值错误");
  } else {
    Serial.print("环境:");
    Serial.print(ambient_light);
    Serial.print(" 红色:");
    Serial.print(red_light);
    Serial.print(" 绿色:");
    Serial.print(green_light);
    Serial.print(" 蓝色: ");
    Serial.println(blue_light);
  }

  // 在下一次读取前等待 1 秒
  delay(1000);
}

(2)实验串口返回情况

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块
程序八:测试 APDS-9960 的环境光中断能力
(1)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序八:测试 APDS-9960 的环境光中断能力
  注:设备的 I2C 地址为 0x39
*/

#include <Wire.h>
#include <SparkFun_APDS9960.h>//导入9960驱动库

// 引脚
#define APDS9960_INT    2  //中断引脚为D2
#define LED_PIN         13 //显示中断的 LED 接D13

// 常量
#define LIGHT_INT_HIGH  1000 // 中断的高亮度
#define LIGHT_INT_LOW   10   // 低亮度中断

// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;
int isr_flag = 0;
uint16_t threshold = 0;

void setup() {
  //设置 LED 为输出
  pinMode(LED_PIN, OUTPUT);
  pinMode(APDS9960_INT, INPUT);

  //初始化串口
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("-------------------------------------"));
  Serial.println(F("         APDS-9960 - 光中断 "));
  Serial.println(F("-------------------------------------"));

  //初始化中断服务程序
  attachInterrupt(0, interruptRoutine, FALLING);

  //初始化 APDS-9960(配置 I2C 和初始值)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 初始化完成"));
  } else {
    Serial.println(F("APDS-9960 初始化期间出现问题!"));
  }

  //设置高低中断阈值
  if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {
    Serial.println(F("写入低阈值错误"));
  }
  if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {
    Serial.println(F("写入高阈值错误"));
  }

  // 开始运行 APDS-9960 光传感器(无中断)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("光传感器正在运行"));
  } else {
    Serial.println(F("光传感器初始化过程中出现问题!"));
  }

  /// 读取高低中断阈值
  if ( !apds.getLightIntLowThreshold(threshold) ) {
    Serial.println(F("读取低阈值错误"));
  } else {
    Serial.print(F("低阈值:"));
    Serial.println(threshold);
  }
  if ( !apds.getLightIntHighThreshold(threshold) ) {
    Serial.println(F("读取高阈值错误"));
  } else {
    Serial.print(F("高阈值:"));
    Serial.println(threshold);
  }

  /// 启用中断
  if ( !apds.setAmbientLightIntEnable(1) ) {
    Serial.println(F("错误启用中断"));
  }

  /// 等待初始化和校准完成
  delay(500);
}

void loop() {
  // 如果发生中断,打印出光照水平
  if ( isr_flag == 1 ) {

    // 读取光照水平(环境、红色、绿色、蓝色)并打印
    if (  !apds.readAmbientLight(ambient_light) ||
          !apds.readRedLight(red_light) ||
          !apds.readGreenLight(green_light) ||
          !apds.readBlueLight(blue_light) ) {
      Serial.println("读取光值错误");
    } else {
      Serial.print("中断!环境光: ");
      Serial.print(ambient_light);
      Serial.print(" R: ");
      Serial.print(red_light);
      Serial.print(" G: ");
      Serial.print(green_light);
      Serial.print(" B: ");
      Serial.println(blue_light);
    }

    // 点亮 LED 半秒
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);

    // 重置标志并清除 APDS-9960 中断(重要!)
    isr_flag = 0;
    if ( !apds.clearAmbientLightInt() ) {
      Serial.println("错误清除中断");
    }

  }
}

void interruptRoutine() {
  isr_flag = 1;
}

(2)实验说明:测试 APDS-9960 的环境光中断能力。通过 I2C 配置 APDS-9960 并等待外部根据高光或低光条件中断。尝试覆盖用手或将传感器靠近明亮的光源。您可能需要调整 LIGHT_INT_HIGH和 LIGHT_INT_LOW 值以使中断正常工作。

(3)实验串口返回情况

在这里插入图片描述
(4)实验场景图(高亮度中断)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

年出货2亿台,只赚“辛苦钱”!又一家代工巨头押宝汽车电子

7月20日&#xff0c;作为国内ODM龙头之一的华勤技术正式启动招股&#xff0c;拟在上交所主板上市。此前&#xff0c;因技术先进性、科创属性不足等问题&#xff0c;该公司终止科创板IPO。 华勤技术成立于2005年&#xff0c;几年后赶上了全球智能手机的黄金时代&#xff0c;招股…

Moonbeam操作指南:使用区块链索引

索引是指组织数据库以快速查找特定数据。在区块链的背景下&#xff0c;如何储存数据至关重要 — — 通过重要状态变化期间发生的事件。 例如&#xff0c;假设您正在构建一个DApp&#xff0c;其中列出了特定NFT集合的全部所有者。您可以仔细查看该NFT系列销售中发出的所有转让事…

ubuntu安装pycharm No JRE found错误

参考资料&#xff1a; 《UBUNTU14.04 PYCHARM安装及NO JDK FOUND解决方法》 问题&#xff1a; 解决办法&#xff1a; 1.去java官网&#xff0c;下载相应的jdk文件&#xff1a; 2.下载完成后在 jdk-8u151-linux-x64.tar.gz 的运行以下命令&#xff1a; sudo mkdir /usr/lib/jv…

平台化设计产品存在的问题

产品&#xff1a;在将业务抽象成产品或组件时&#xff0c;需要考虑多个因素&#xff0c;包括闭环条款、持久性、可重用性等。只有当业务具备这些关键特征时&#xff0c;才能适合抽象成产品。否则&#xff0c;应该考虑将其作为组件的形式存在&#xff0c;或者使用规则引擎来可视…

谈谈你对Synchronized关键字的理解及使用

synchronized关键字最主要的三种使用方式的总结 修饰实例方法&#xff0c;作用于当前对象实例加锁&#xff0c;进入同步代码前要获得当前对象实例的锁修饰静态方法&#xff0c;作用于当前类对象加锁&#xff0c;进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁&…

13 硬链接和软链接

13.1 硬链接和软链接的区别 硬链接&#xff1a;A---B&#xff0c;假设B是A的硬链接&#xff0c;那么只要存在一个&#xff0c;无论删除哪一个&#xff0c;文件都能访问得到。 软链接&#xff1a;类似于快捷方式&#xff0c;删除源文件&#xff0c;快捷方式就访问不了。 13.2 创…

流星特效案例代码

实际效果&#xff0c;代码下载即可使用 流星图片 <!-- 描述: 流星特效 作者: Jack GUO 日期: 20230727 --> <template> <div class"wrap-container sn-container"> <div class"pd-main-left"> <div class"yun-container&…

计算机组成原理问答6

总线 总线是一组能为多个部件分时共享的公共数据信息传送线路。 基本概念 特性:机械特性(尺寸、形状)、电气特性(传输方向、电平有效范围)、功能特性(数据、地址、控制信号)、时间特性(信号和时序的关系) 分类: 按数据传输格式:串行(一个比特一个比特的传输)…

30.文字自动出现

文字自动出现 html部分 <h1 id"text"></h1><div><label for"speed">速度</label><input type"number" name"speed" id"speed" min"1" max"10" value"1" …

力扣热门100题之字母异位词分组【中等】

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“na…

TimescaleDB压缩功能

注&#xff1a;本文翻译自https://legacy-docs.timescale.com/v1.7/using-timescaledb/compression 从1.5版本开始&#xff0c;TimescaleDB支持本地压缩数据的能力。此功能不需要使用任何特定的文件系统或外部软件&#xff0c;并且正如您将看到的&#xff0c;用户可以很容易地…

RDIFramework.NET 快速开发框架 WebEasyUI版本 V6.0发布

1、RDIFramework.NET EasyUI快速开发框架介绍 RDIFramework.NET&#xff0c;基于.NET的快速信息化系统开发、整合框架&#xff0c;为企业或个人快速开发系统提供了强大的支持&#xff0c;开发人员不需要开发系统的基础功能和公共模块&#xff0c;框架自身提供了强大的函数库和…

文心一言大数据模型-文心千帆大模型平台

官网&#xff1a; 文心千帆大模型平台 (baidu.com) 文心千帆大模型 (baidu.com) 模型优势 1、模型效果优&#xff1a;所需标注数据少&#xff0c;在各场景上的效果处于业界领先水平 2、生成能力强&#xff1a;拥有丰富的AI内容生成&#xff08;AIGC&#xff09;能力 3、应用…

【框架篇】Spring Boot 日志

Spring Boot 日志 一&#xff0c;日志用途 尽管一个项目在没有日志记录的情况下可能能够正常运行&#xff0c;但是日志记录对于我们来说却是至关重要的&#xff0c;它存在以下功能&#xff1a; 1&#xff0c;故障排查和调试&#xff1a;当项目出现异常或者故障时&#xff0c;…

14.python设计模式【模板方法模式】

内容&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色&#xff1a; 抽象类&#xff08;AbstractClass&#xff09;&#xff1a;定义抽象的原子操作&#xff08;钩子…

甘特图 Dhtmlx Gantt

介绍 在一些任务计划、日程进度等场景中我们会使用到甘特图&#xff0c;Dhtmlx Gantt 对于甘特图的实现支持很友好&#xff0c;文档API介绍全面&#xff0c;虽然增强版的收费&#xff0c;但免费版的足以够用。 官网&#xff1a;https://docs.dhtmlx.com/gantt/ 安装dhtml gannt…

ORCLE 导入dmp文件方式记录

一、数据库准备 查询数据库表空间存储位置 sql执行 select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id; 结果示例 创建空间及用户 例如上方查询结果&#xff0c;得到存储位置&#xff1a;/home/oracle/app/oracle/oradata/…

NISP含金量?NISP真的有必要考么?NISP好考吗?NISP二级为什么那么贵?

NISP证书简述 NISP证书三个级别&#xff0c;分别是&#xff1a;一级、二级、三级&#xff08;专项&#xff09; 证书。其每一项资格证书都有不同的优点&#xff0c;但是优点各有 相同&#xff0c;而且拥有NISP二级证书可以免考更换CISP资格证书&#xff0c;那么证书含金量如何下…

Python(Web时代)——初识flask

flask简介 介绍 Flask是一个用Python编写的Web 微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务。它是BSD授权的&#xff0c;一个有少量限制的免费软件许可。它使用了 Werkzeug 工具箱和 Jinja2 模板引擎。 Flask 的设计理念是简单、灵活、易于扩展&a…

C++STL序列式容器——list容器及其常用操作(详解)

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.list容器基本概念二.list容器的常用操作list构造函数list迭代器获取list特性操作list元素操作list赋值操作list的交换、反转、排序、归并操作…