@TOC
一、传感器简介
APDS-9930 是一款集成式数字环境光传感器和接近检测传感器,采用 I²C 通信接口,内部集成红外 LED 驱动、光电二极管阵列和信号处理电路,可同时检测环境光强度(Lux)和物体接近距离。
二、引脚功能
| 引脚 | 功能 |
|---|---|
| VL | 红外供电引脚,使用接近功能需给该引脚供电3.3V |
| GND | 电源地 |
| VCC | 3.3V供电引脚 |
| SCL | 时钟线 |
| SDA | 数据线 |
| INT | 中断输出 |
三、主要寄存器介绍
使能寄存器 0x00
| Bit | 字段 | 功能 |
|---|---|---|
| 7 | Reserved | 保留,写0 |
| 6 | SAI | 中断后自动休眠 |
| 5 | PIEN | 接近中断使能 |
| 4 | AIEN | 环境光中断使能 |
| 3 | WEN | 等待定时器使能 |
| 2 | PEN | 接近检测使能 |
| 1 | AEN | 环境光检测使能 |
| 0 | PON | 电源开启 |
环境光积分时间寄存器 0x01
积分时间 = 2.73ms × (256 - ATIME), ATIME 越大积分时间越短响应速度越快最大测量范围越小 ATIME 越小积分时间越长灵敏度越高暗光检测能力更强
| ATIME值 | ADC周期 | 积分时间 | 最大计数 | 特点 |
|---|---|---|---|---|
| 0xFF | 1 cycle | 2.73ms | 1023 | 最快响应 |
| 0xF6 | 10 cycles | 27.3ms | 10239 | 快速模式 |
| 0xDB | 37 cycles | 101ms | 37887 | 默认推荐 |
| 0xC0 | 64 cycles | 175ms | 65535 | 高灵敏 |
| 0x00 | 256 cycles | 699ms | 65535 | 最高灵敏 |
控制寄存器 0x0F
| Bit | 字段 | 功能 | 可选值 | 说明 |
|---|---|---|---|---|
| 7:6 | PDRIVE | 红外LED驱动电流 | 00 | 100mA(最大距离) |
| 01 | 50mA(推荐) | |||
| 10 | 25mA(低功耗) | |||
| 11 | 12.5mA(最低功耗) | |||
| 5:4 | PDIODE | 接近检测光电二极管选择 | 00 | 保留 |
| 01 | 保留 | |||
| 10 | 使用 CH1 光电二极管 | |||
| 11 | 保留 | |||
| 3:2 | PGAIN | 接近检测增益 | 00 | 1× 增益 |
| 01 | 2× 增益 | |||
| 10 | 4× 增益 | |||
| 11 | 8× 增益 | |||
| 1:0 | AGAIN | 环境光 ALS 增益 | 00 | 1× 增益 |
| 01 | 8× 增益 | |||
| 10 | 16× 增益 | |||
| 11 | 120× 增益 |
数据寄存器 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-9930 | ESP32 |
|---|---|
| VL | 3.3V |
| VCC | 3.3V |
| GND | GND |
| SDA | IO 21 |
| SCL | IO 22 |
开关:
调节亮度:
以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱