ESP32 с датчиком APDS9960: приближение, освещенность, RGB и жесты (Arduino IDE)
Узнайте, как использовать датчик APDS9960 с ESP32 в Arduino IDE. Этот датчик объединяет распознавание жестов, измерение приближения и измерение окружающего RGB-освещения через интерфейс I2C. В этом руководстве мы покажем, как подключить датчик к ESP32 и написать код для использования каждой из его функций.
В этом руководстве мы рассмотрим следующие темы:
Примеры:
Предварительные требования
Этот урок посвящен программированию ESP32 с использованием ядра Arduino. Перед началом работы у вас должно быть установлено ядро ESP32 Arduino в вашей Arduino IDE. Следуйте приведенному ниже руководству для установки ESP32 в Arduino IDE, если вы этого еще не сделали.
Знакомство с датчиком APDS9960
APDS9960 – это датчик 4-в-1, который объединяет распознавание жестов, измерение приближения, измерение окружающего освещения и измерение цвета RGB в одном компактном модуле. Он поставляется в небольшом корпусе со встроенным ИК-светодиодом и откалиброванным на заводе драйвером светодиода. Этот датчик используется в смартфоне Samsung Galaxy S5.
Для наших проектов на ESP32 удобно использовать плату расширения (breakout board) с датчиком. Я использую плату расширения, показанную на фотографии ниже.
Вы можете найти различные модули с одним и тем же датчиком, но от разных производителей. Они могут выглядеть по-разному, но работать будут одинаково.
Модуль использует протокол связи I2C, что делает его довольно простым для интеграции в ваши проекты на ESP32, ESP8266, Arduino или Raspberry Pi Pico.
Для получения более подробной информации о работе датчика рекомендуем ознакомиться с даташитом APDS9960.
Основные характеристики APDS9960
Вот краткое описание основных характеристик датчика APDS9960:
Распознавание жестов: обнаруживает жесты вверх, вниз, влево, вправо и другие с помощью ИК-датчика приближения.
Измерение приближения: измеряет расстояние до объектов, обычно до 20 см > аналоговый выход: диапазон 0–255.
Измерение окружающего освещения: измеряет интенсивность окружающего света, полезно для управления яркостью дисплеев.
Измерение цвета RGB: определяет уровни красного, зеленого, синего и общего (clear) освещения.
Интерфейс I2C: простая интеграция с микроконтроллерами, такими как Arduino, ESP32, ESP8266 и др.
Рабочее напряжение: от 2,4 В до 3,6 В.
Где купить?
Вы можете посетить страницу Maker Advisor Tools для сравнения цен на модуль APDS9960 в различных магазинах:
Распиновка и подключение модуля APDS9960
Давайте кратко рассмотрим распиновку модуля датчика APDS9960. Если у вас другой модуль, распиновка должна быть аналогичной.
Вывод |
Функция |
Подключение к ESP32 |
|---|---|---|
VCC |
Питание (2,4 В – 3,6 В) |
3.3V |
GND |
Земля |
GND |
SDA |
Линия данных I2C |
GPIO 21 |
SCL |
Линия тактового сигнала I2C |
GPIO 22 |
INT |
Выход прерывания для датчика приближения (активный LOW) |
Любой цифровой пин |
VL |
Дополнительное питание для ИК-светодиода |
Обычно подключать не нужно |
Рекомендуемая статья: ESP32 I2C Communication: Set Pins, Multiple Bus Interfaces and Peripherals (Arduino IDE)
Перемычки APDS9960
Модуль датчика APDS9960 имеет две перемычки, которые обычно лучше оставить как есть:
Перемычка PS: перемычка PS соединяет питание датчика и его ИК-светодиода. По умолчанию она замкнута (имеется капля припоя), что означает, что ИК-светодиод получает питание от вывода VCC. Вывод VL можно оставить неподключенным.
Перемычка I2C PU: подключает подтягивающие резисторы 10 кОм к линиям SDA/SCL (вам не нужно добавлять резисторы для линий SDA и SCL в вашу схему).
Подключение модуля APDS9960 к ESP32
Вот список компонентов, необходимых для этого урока:
Плата ESP32 – прочитайте ESP32 Development Boards Review and Comparison
OLED-дисплей SSD1306 (опционально)
Подключите датчик APDS9960 к ESP32 согласно следующей таблице/схеме.
Вывод |
Подключение к ESP32 |
|---|---|
VCC |
3.3V |
GND |
GND |
SDA |
GPIO 21 |
SCL |
GPIO 22 |
INT |
GPIO 4 (или любой цифровой пин) |
VL |
не подключать * (проверьте ваши перемычки) |
Рекомендуемая статья: ESP32 Pinout Reference: Which GPIO pins should you use?
Установка библиотек для датчика APDS9960
Существует несколько библиотек, упрощающих работу с датчиком APDS9960. Мы будем использовать библиотеку APDS9960 от Adafruit. Установите ее в вашей Arduino IDE.
Перейдите в Sketch > Include Library > Manage Libraries. Найдите APDS9960 Adafruit и установите соответствующую библиотеку и все необходимые зависимости.
Получение I2C-адреса и идентификатора чипа
Датчик APDS9960 обычно использует I2C-адрес 0x39 и имеет идентификатор чипа 0xAB.
Однако некоторые клоны или поддельные модули могут использовать другой I2C-адрес или возвращать другой идентификатор чипа. Чтобы избежать проблем, рекомендуется запустить приведенный ниже код для проверки фактического адреса и идентификатора вашего датчика.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-apds9960-sensor-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <Wire.h>
// Define APDS9960 chip ID register
#define APDS9960_ID_REG 0x92 // Chip ID register address
// Function to read chip ID from a given I2C address
uint8_t readChipID(uint8_t i2cAddress) {
Wire.beginTransmission(i2cAddress);
Wire.write(APDS9960_ID_REG); // Request chip ID register
Wire.endTransmission(false);
Wire.requestFrom(i2cAddress, (uint8_t)1);
if (Wire.available()) {
return Wire.read(); // Read chip ID
}
return 0; // Return 0 if no data (invalid or no response)
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting I2C Scanner and Chip ID Reader");
// Initialize I2C
Wire.begin();
Wire.setClock(100000);
// Scan I2C bus for devices
Serial.println("\nScanning I2C bus...");
bool deviceFound = false;
for (uint8_t address = 0x08; address <= 0x7F; address++) {
Wire.beginTransmission(address);
uint8_t error = Wire.endTransmission();
if (error == 0) {
deviceFound = true;
Serial.print("I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
// Read and print chip ID
uint8_t chipID = readChipID(address);
Serial.print(" - Chip ID: 0x");
if (chipID < 16) Serial.print("0");
Serial.println(chipID, HEX);
}
}
if (!deviceFound) {
Serial.println("No I2C devices found. Check wiring or try again.");
} else {
Serial.println("\nScan complete.");
}
}
void loop() {
}
После загрузки кода откройте Монитор порта на скорости 115200 бод. Вы должны увидеть I2C-адрес и идентификатор чипа вашего датчика.
В моем случае I2C-адрес – 0x39, что является ожидаемым адресом, а идентификатор чипа – 0xA8, что не является ожидаемым (ожидался 0xAB). Это означает, что у меня поддельный модуль.
Если у вас тоже поддельный модуль, не волнуйтесь. Вы все равно можете его использовать и следовать этому руководству. Вам просто нужно внести небольшое изменение в один из файлов библиотеки.
APDS9960 – Неожиданный идентификатор чипа
Библиотека Adafruit_APDS9960 имеет жестко заданный идентификатор чипа и проверяет его при инициализации модуля. Если у вас поддельный модуль, инициализация не пройдет корректно.
Чтобы исправить это, выполните следующие шаги:
Откройте папку установки Arduino IDE и перейдите в каталог библиотек.
Найдите папку Adafruit_APDS9960_Library.
Внутри нее откройте файл Adafruit_APDS9960.cpp.
Закомментируйте следующие строки, чтобы игнорировать отличающийся идентификатор чипа (строки 100–104). Или замените на идентификатор вашего чипа.
/* Make sure we're actually connected */
/*uint8_t x = read8(APDS9960_ID);
if (x != 0xAB) {
return false;
}*/
Сохраните файл Adafruit_APDS9960.cpp.
Теперь, когда у вас есть адрес датчика, идентификатор чипа и все необходимые библиотеки, давайте протестируем несколько примеров, чтобы понять, как работает датчик.
1) ESP32 с APDS9960 – Распознавание жестов
APDS9960 может распознавать базовые жесты – вверх, вниз, вправо и влево – когда вы проводите рукой перед датчиком. С правильным кодом вы также можете распознавать более сложные жесты.
На следующей фотографии показана ориентация датчика для распознавания жестов.
Следующий код показывает основные команды для распознавания четырех различных жестов. Он основан на примере, предоставленном библиотекой.
/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
This sketch puts the sensor in gesture mode and decodes gestures. To use this, first put your hand close to the sensor to enable gesture mode. Then move your hand about 6" from the sensor in the up -> down, down -> up, left -> right, or right -> left direction.
Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39
Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */
// Complete project details at https://RandomNerdTutorials.com/esp32-apds9960-sensor-arduino/
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(115200);
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");
//gesture mode will be entered once proximity mode senses something close
apds.enableProximity(true);
apds.enableGesture(true);
}
// the loop function runs over and over again forever
void loop() {
uint8_t gesture = apds.readGesture();
if (gesture == APDS9960_DOWN) {
Serial.println("v Moving DOWN");
}
if (gesture == APDS9960_UP) {
Serial.println("^ Moving UP");
}
if (gesture == APDS9960_LEFT) {
Serial.println("< Moving LEFT");
}
if (gesture == APDS9960_RIGHT) {
Serial.println("> Moving RIGHT");
}
}
Как работает код
Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу демонстрации.
Подключение библиотеки
Сначала подключите библиотеку Adafruit_APDS9960 следующим образом.
#include "Adafruit_APDS9960.h"
Создайте объект с именем apds для взаимодействия с датчиком.
Adafruit_APDS9960 apds;
setup()
В функции setup() инициализируйте Монитор порта.
Serial.begin(115200);
Затем инициализируйте датчик с помощью метода begin() следующим образом.
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");
Следующие строки включают режим измерения приближения и режим распознавания жестов. Распознавание жестов работает только тогда, когда датчик обнаруживает приближение объекта.
apds.enableProximity(true);
apds.enableGesture(true);
loop()
В функции loop() проверяем, был ли обнаружен жест, с помощью функции readGesture(). Если жест обнаружен, сохраняем его в переменной gesture.
uint8_t gesture = apds.readGesture();
Затем проверяем, какой жест был обнаружен, и выводим его в Монитор порта.
if (gesture == APDS9960_DOWN) {
Serial.println("v Moving DOWN");
}
if (gesture == APDS9960_UP) {
Serial.println("^ Moving UP");
}
if (gesture == APDS9960_LEFT) {
Serial.println("< Moving LEFT");
}
if (gesture == APDS9960_RIGHT) {
Serial.println("> Moving RIGHT");
}
Тестирование распознавания жестов
После загрузки кода откройте Монитор порта на скорости 115200 бод.
Проведите рукой вблизи датчика: вверх, вниз, влево и вправо.
Соответствующий жест будет выведен в Мониторе порта.
2) ESP32 с APDS9960 – Распознавание жестов с выводом на OLED
Вы можете усовершенствовать предыдущий пример, добавив OLED-дисплей в вашу схему для отображения распознанных жестов. Этот пример можно легко модифицировать для отображения любого экрана в зависимости от жеста.
Для этого проекта выполните следующие шаги:
1) Добавьте OLED-дисплей в вашу предыдущую схему:
OLED |
Подключение к ESP32 |
|---|---|
VCC |
3.3V |
GND |
GND |
SDA |
GPIO 21 |
SCL |
GPIO 22 |
2) Установите библиотеку Adafruit_SSD1306 и соответствующие зависимости в вашей Arduino IDE.
3) Загрузите следующий код на вашу плату.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-apds9960-sensor-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include "Adafruit_APDS9960.h"
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// APDS9960 sensor
Adafruit_APDS9960 apds;
// Function to center text horizontally
void centerText(const char* text, int y) {
int charCount = strlen(text);
int textWidth = charCount * 6;
int x = (SCREEN_WIDTH - textWidth) / 2;
display.setCursor(x, y);
display.println(text);
}
// Function to display UP gesture
void displayScreenUp() {
display.clearDisplay();
centerText("^", 10);
centerText("Moving UP", 30);
display.display();
Serial.println("^ Moving UP");
}
// Function to display DOWN gesture
void displayScreenDown() {
display.clearDisplay();
centerText("v", 10);
centerText("Moving DOWN", 30);
display.display();
Serial.println("v Moving DOWN");
}
// Function to display LEFT gesture
void displayScreenLeft() {
display.clearDisplay();
centerText("<", 10);
centerText("Moving LEFT", 30);
display.display();
Serial.println("< Moving LEFT");
}
// Function to display RIGHT gesture
void displayScreenRight() {
display.clearDisplay();
centerText(">", 10);
centerText("Moving RIGHT", 30);
display.display();
Serial.println("> Moving RIGHT");
}
void setup() {
Serial.begin(115200);
// Initialize OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Clear the display
display.clearDisplay();
display.display();
delay(500);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(F("Gesture Sensor"));
display.display();
delay(100);
// Initialize APDS9960
if(!apds.begin()){
Serial.println("Failed to initialize APDS9960! Check wiring.");
display.clearDisplay();
display.setCursor(0,0);
display.println(F("APDS9960 Failed"));
display.display();
} else {
Serial.println("APDS9960 initialized!");
apds.enableProximity(true);
apds.enableGesture(true);
}
}
void loop() {
uint8_t gesture = apds.readGesture();
if (gesture == APDS9960_DOWN) {
displayScreenDown();
}
if (gesture == APDS9960_UP) {
displayScreenUp();
}
if (gesture == APDS9960_LEFT) {
displayScreenLeft();
}
if (gesture == APDS9960_RIGHT) {
displayScreenRight();
}
}
Мы не будем объяснять, как работает этот код. Чтобы узнать, как взаимодействовать с OLED SSD1306 и ESP32, прочитайте следующее руководство: ESP32 OLED Display with Arduino IDE.
Демонстрация
Проведите рукой в разных направлениях перед датчиком. Жест будет отображен на OLED-экране.
Обнаружение жеста «Движение ВНИЗ»
Обнаружение жеста «Движение ВПРАВО»
3) ESP32 с APDS9960 – Обнаружение приближения
Датчик APDS9960 может обнаруживать приближение в диапазоне приблизительно от 10 до 20 см. Когда объект приближается к датчику, активируется вывод INT (прерывание). Это прерывание с активным LOW уровнем, что означает, что состояние вывода изменяется с HIGH на LOW при обнаружении приближения.
Датчик APDS9960 позволяет задать порог приближения, который определяет, насколько близко должен быть объект, чтобы считаться «обнаруженным».
Для этого примера выполните следующие шаги:
1) Подключите светодиод к вашей схеме. Мы подключаем его к GPIO 23, но вы можете использовать любой другой цифровой выход.
2) Загрузите следующий код на вашу плату. Этот код основан на примере, предоставленном библиотекой Adafruit.
/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
This sketch puts the sensor in proximity mode and enables the interrupt to fire when proximity goes over a set value
Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39
Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */
// Complete project details at https://RandomNerdTutorials.com/esp32-apds9960-sensor-arduino/
#include "Adafruit_APDS9960.h"
//the pin that the interrupt is attached to
#define INT_PIN 4
// LED for visual output
#define LED_PIN 23
//create the APDS9960 object
Adafruit_APDS9960 apds;
void setup() {
Serial.begin(115200);
pinMode(INT_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");
//enable proximity mode
apds.enableProximity(true);
//set the interrupt threshold to fire when proximity reading goes above 175
apds.setProximityInterruptThreshold(0, 175);
//enable the proximity interrupt
apds.enableProximityInterrupt();
}
void loop() {
//print the proximity reading when the interrupt pin goes low
if(!digitalRead(INT_PIN)){
Serial.println(apds.readProximity());
digitalWrite(LED_PIN, HIGH);
//clear the interrupt
apds.clearInterrupt();
}
digitalWrite(LED_PIN, LOW);
}
Как работает код
Продолжайте чтение, чтобы узнать, как работает код.
Подключение библиотеки
Сначала подключите библиотеку Adafruit_APDS9960 следующим образом.
#include "Adafruit_APDS9960.h"
Создайте объект с именем apds для взаимодействия с датчиком.
Adafruit_APDS9960 apds;
Определение выводов
Определите вывод, к которому подключен пин INT. В нашем случае он подключен к GPIO 4.
//the pin that the interrupt is attached to
#define INT_PIN 4
Затем определите вывод, к которому подключен светодиод.
// LED for visual output
#define LED_PIN 23
setup()
В функции setup() инициализируйте Монитор порта.
Serial.begin(115200);
Настройте вывод прерывания как вход с внутренним подтягивающим резистором, а светодиод – как выход.
pinMode(INT_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Затем инициализируйте датчик с помощью метода begin() следующим образом.
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");
Включите обнаружение приближения с помощью функции enableProximity() объекта apds.
apds.enableProximity(true);
Теперь установите диапазон порога прерывания приближения с помощью функции setProximityInterruptThreshold(). Датчик будет генерировать прерывание только если обнаружит объект достаточно близко для получения значения выше 175 (максимальное значение – 255; чем ближе объект, тем выше значение).
apds.setProximityInterruptThreshold(0, 175);
Затем активируйте прерывание по приближению.
apds.enableProximityInterrupt();
После этого, когда порог будет превышен, датчик переведет вывод INT в состояние LOW.
//set the interrupt threshold to fire when proximity reading goes above 175
apds.setProximityInterruptThreshold(0, 175);
Вы можете использовать это прерывание для срабатывания оповещения или выполнения задачи только когда что-то находится вблизи датчика.
loop()
В функции loop() проверяем состояние вывода INT. Если он в состоянии LOW, это означает, что объект находится вблизи датчика. В этом случае мы считываем значение приближения с помощью apds.readProximity() и включаем светодиод.
//print the proximity reading when the interrupt pin goes low
if(!digitalRead(INT_PIN)){
Serial.println(apds.readProximity());
digitalWrite(LED_PIN, HIGH);
//clear the interrupt
apds.clearInterrupt();
}
После этого мы вызываем функцию clearInterrupt(). Она сбрасывает флаг прерывания на датчике APDS9960. Когда датчик обнаруживает событие приближения выше порога, он переводит вывод INT в состояние LOW для сигнализации о событии.
//clear the interrupt
apds.clearInterrupt();
Это состояние LOW будет сохраняться до тех пор, пока прерывание не будет сброшено вызовом функции clearInterrupt(). После этого вывод INT вернется в исходное состояние HIGH.
Когда вывод не активирован, выключаем светодиод.
digitalWrite(LED_PIN, LOW);
Демонстрация
Загрузите приведенный выше код на вашу плату.
Поднесите что-нибудь ближе к датчику. Вы увидите, что при достижении определенного порога приближения светодиод включается.
Одновременно значения приближения выводятся в Мониторе порта.
4) ESP32 с APDS9960 – Измерение RGB-освещения
Датчик APDS9960 может измерять красный, зеленый, синий и общий (clear) свет. Канал clear измеряет общую яркость, а каналы красного, зеленого и синего показывают, сколько каждого цвета присутствует.
Значения, получаемые от датчика, являются относительными. Более высокие значения соответствуют большему количеству света данного цвета. Вы можете сравнивать значения, чтобы попытаться определить доминирующий цвет объекта или окружающей среды.
Следующий код считывает красный, зеленый, синий и общий свет и выводит результаты в Монитор порта. Этот код основан на примере, предоставленном библиотекой.
/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
This sketch puts the sensor in color mode and reads the RGB and clear values.
Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39
Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */
// Complete project details at https://RandomNerdTutorials.com/esp32-apds9960-sensor-arduino/
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;
void setup() {
Serial.begin(115200);
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");
//enable color sensing mode
apds.enableColor(true);
// Set ADC gain to high (16x) for better color sensitivity
apds.setADCGain(APDS9960_AGAIN_16X);
}
void loop() {
//create some variables to store the color data in
uint16_t r, g, b, c;
//wait for color data to be ready
while(!apds.colorDataReady()){
delay(5);
}
//get the data and print the different channels
apds.getColorData(&r, &g, &b, &c);
Serial.print("Red Light: ");
Serial.print(r);
Serial.print(" || Green Light: ");
Serial.print(g);
Serial.print(" || Blue Light: ");
Serial.print(b);
Serial.print(" || Ambient Light: ");
Serial.println(c);
Serial.println();
delay(500);
}
Как работает код?
Включаем режим измерения цвета.
//enable color sensing mode
apds.enableColor(true);
Затем устанавливаем усиление 16x для лучшей чувствительности. Эта строка необязательна.
// Set ADC gain to high (16x) for better color sensitivity
apds.setADCGain(APDS9960_AGAIN_16X);
Вот все варианты усиления:
APDS9960_AGAIN_1X
APDS9960_AGAIN_4X
APDS9960_AGAIN_16X
APDS9960_AGAIN_64X
В функции loop() создаем четыре переменные для сохранения данных о цвете.
r = красный (red)
g = зеленый (green)
b = синий (blue)
c = общий свет (clear, окружающее освещение)
Ожидаем, пока новые данные о цвете станут доступны от датчика.
while(!apds.colorDataReady()){
delay(5);
}
Как только данные готовы, получаем различные значения в наши переменные следующим образом:
apds.getColorData(&r, &g, &b, &c);
Затем выводим результаты в Монитор порта.
Serial.print("Red Light: ");
Serial.print(r);
Serial.print(" || Green Light: ");
Serial.print(g);
Serial.print(" || Blue Light: ");
Serial.print(b);
Serial.print(" || Ambient Light: ");
Serial.println(c);
Serial.println();
Демонстрация
Загрузите приведенный выше код на вашу плату. Затем откройте Монитор порта на скорости 115200 бод.
Попробуйте направить фонарик вашего смартфона на датчик – вы заметите, что значения интенсивности света начнут увеличиваться.
Вы также можете поэкспериментировать с цветным освещением или посветить фонариком на цветной объект. Отраженный свет попадет на датчик, позволяя ему определить цвет объекта.
Заключение
В этом уроке вы узнали, как использовать модуль датчика APDS9960 с ESP32. Он может распознавать базовые жесты, измерять приближение, окружающее освещение и интенсивность RGB-света.
Мы показали вам несколько базовых примеров для тестирования датчика и изучения основных методов использования его функций.
Надеемся, что это руководство было для вас полезным. У нас есть больше руководств по датчикам и модулям для ESP32:
Чтобы узнать больше об ESP32, ознакомьтесь с нашими ресурсами:
Learn ESP32 with Arduino IDE (eBook)
Источник: ESP32 with APDS9960 Proximity, Light, RGB, and Gesture Sensor (Arduino IDE)