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)实验场景图(高亮度中断)



















