ESP32实战:驱动APDS-9930实现环境光与接近感知

14 阅读3分钟

@TOC


一、传感器简介

APDS-9930 是一款集成式数字环境光传感器和接近检测传感器,采用 I²C 通信接口,内部集成红外 LED 驱动、光电二极管阵列和信号处理电路,可同时检测环境光强度(Lux)和物体接近距离。 在这里插入图片描述

二、引脚功能

引脚功能
VL红外供电引脚,使用接近功能需给该引脚供电3.3V
GND电源地
VCC3.3V供电引脚
SCL时钟线
SDA数据线
INT中断输出

三、主要寄存器介绍

使能寄存器 0x00

在这里插入图片描述

Bit字段功能
7Reserved保留,写0
6SAI中断后自动休眠
5PIEN接近中断使能
4AIEN环境光中断使能
3WEN等待定时器使能
2PEN接近检测使能
1AEN环境光检测使能
0PON电源开启

环境光积分时间寄存器 0x01

在这里插入图片描述

积分时间 = 2.73ms × (256 - ATIME), ATIME 越大积分时间越短响应速度越快最大测量范围越小 ATIME 越小积分时间越长灵敏度越高暗光检测能力更强

ATIME值ADC周期积分时间最大计数特点
0xFF1 cycle2.73ms1023最快响应
0xF610 cycles27.3ms10239快速模式
0xDB37 cycles101ms37887默认推荐
0xC064 cycles175ms65535高灵敏
0x00256 cycles699ms65535最高灵敏

控制寄存器 0x0F

在这里插入图片描述

Bit字段功能可选值说明
7:6PDRIVE红外LED驱动电流00100mA(最大距离)
0150mA(推荐)
1025mA(低功耗)
1112.5mA(最低功耗)
5:4PDIODE接近检测光电二极管选择00保留
01保留
10使用 CH1 光电二极管
11保留
3:2PGAIN接近检测增益001× 增益
012× 增益
104× 增益
118× 增益
1:0AGAIN环境光 ALS 增益001× 增益
018× 增益
1016× 增益
11120× 增益

数据寄存器 0x14-19

在这里插入图片描述

四、实验现象

驱动程序,需安装iarduino_APDS9930库,库地址

#include <Wire.h>
#include <iarduino_APDS9930.h>

iarduino_APDS9930 apds;

// LED 低有效
#define LED_PIN 23
// 接近检测阈值
#define HAND_THRESHOLD 200
// 消抖时间
#define DEBOUNCE_TIME 800

bool ledState = false;
bool lastHand = false;
unsigned long lastTrigger = 0;


void setup()
{
  Serial.begin(115200);
  Wire.begin(21,22);
  ledcAttach(
    LED_PIN,
    5000,
    8
  );

  ledcWrite(
    LED_PIN,
    255
  );

  delay(500);

  if(!apds.begin())
  {
    Serial.println("APDS-9930 not found!");
    while(1);
  }

  Serial.println("APDS-9930 OK");
}


void loop()
{
  float lux;
  uint16_t proximity;

  lux = apds.getLight();
  proximity = apds.getProximity();
  Serial.print("Ambient Light: ");
  Serial.print(lux);
  Serial.println(" lux");
  Serial.print("Proximity Raw: ");
  Serial.println(proximity);
  bool hand = false;

  if(proximity > HAND_THRESHOLD)
  {
    hand = true;
  }

  if(hand && !lastHand)
  {
    if(millis() - lastTrigger > DEBOUNCE_TIME)
    {
      ledState = !ledState;
      lastTrigger = millis();
      Serial.print("LED:");
      if(ledState)
      {
        Serial.println("ON");
      }
      else
      {
        Serial.println("OFF");
      }
    }
  }
  lastHand = hand;

  if(ledState)
  {
    int brightness;
    brightness = map(
      proximity,
      HAND_THRESHOLD,
      1024,
      80,
      5
    );

    brightness = constrain(
      brightness,
      5,
      80
    );

    int pwmValue;
    pwmValue = map(
      brightness,
      0,
      100,
      0,
      255
    );

    pwmValue = 255 - pwmValue;
    ledcWrite(
      LED_PIN,
      pwmValue
    );

    Serial.print("Brightness: ");
    Serial.print(brightness);
    Serial.println("%");

  }
  else
  {
    ledcWrite(
      LED_PIN,
      255
    );
  }
  Serial.println("----------------");
  delay(200);
}
APDS-9930ESP32
VL3.3V
VCC3.3V
GNDGND
SDAIO 21
SCLIO 22

开关: 在这里插入图片描述 调节亮度: 在这里插入图片描述

在这里插入图片描述

以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱