Arduino с датчиком APDS9960: приближение, освещенность, RGB и жесты

Узнайте, как подключить плату Arduino к датчику APDS9960, который объединяет распознавание жестов, измерение приближения и измерение окружающего RGB-освещения через интерфейс I2C. В этом руководстве мы покажем, как подключить датчик и написать код для использования каждой из его функций.

Arduino с датчиком APDS9960 — приближение, освещенность, RGB и жесты

В этом руководстве мы рассмотрим следующие темы:

Знакомство с датчиком APDS9960

APDS9960 — это датчик «4 в 1», который объединяет распознавание жестов, измерение приближения, измерение окружающего освещения и определение RGB-цвета в одном компактном модуле. Он поставляется в миниатюрном корпусе со встроенным ИК-светодиодом и откалиброванным на заводе драйвером светодиода. Этот датчик используется в смартфоне Samsung Galaxy S5.

Для наших проектов на Arduino удобно использовать модуль-плату расширения (breakout board) с этим датчиком. У меня модуль, показанный на фотографии ниже.

Датчик APDS9960 — приближение, освещенность, RGB, жесты

Вы можете приобрести разные модули с одним и тем же датчиком, но от разных производителей. Они могут выглядеть по-разному, но работать будут одинаково.

Модуль использует протокол связи I2C, что делает его достаточно простым для интеграции в проекты на Arduino или ESP32/ESP8266.

Для получения более подробной информации о принципе работы датчика рекомендуем ознакомиться с даташитом APDS9960.

Где купить?

Вы можете проверить страницу Maker Advisor Tools, чтобы сравнить цены на модуль APDS9960 в разных магазинах:

Основные характеристики APDS9960

Вот краткое описание основных характеристик датчика APDS9960:

  • Распознавание жестов: определяет жесты вверх, вниз, влево, вправо и другие с помощью ИК-датчика приближения.

  • Измерение приближения: измеряет расстояние до объектов, обычно до 20 см > аналоговый выход: диапазон 0–255.

  • Измерение окружающего освещения: измеряет интенсивность окружающего света, полезно для управления яркостью дисплеев.

  • Определение RGB-цвета: определяет уровни красного, зелёного, синего и общего (clear) света.

  • Интерфейс I2C: простая интеграция с микроконтроллерами Arduino, ESP32, ESP8266 и т.д.

  • Рабочее напряжение: от 2,4 В до 3,6 В.

Распиновка и подключение модуля APDS9960

Давайте кратко рассмотрим распиновку модуля датчика APDS9960. Если у вас другой модуль, распиновка должна быть аналогичной.

Вывод

Функция

Подключение к Arduino Uno

VCC

Питание (2,4 В — 3,6 В)

3.3V

GND

Земля

GND

SDA

Линия данных I2C

A4

SCL

Линия тактового сигнала I2C

A5

INT

Выход прерывания для датчика приближения (активный LOW)

Любой цифровой пин

VL

Дополнительное питание для ИК-светодиода

Обычно подключать не нужно

Перемычки APDS9960

Модуль датчика APDS9960 имеет две перемычки, которые обычно лучше оставить как есть:

Перемычки APDS9960
  • Перемычка PS: перемычка PS соединяет питание датчика и его ИК-светодиода. По умолчанию она замкнута (имеется капля припоя), что означает, что ИК-светодиод получает питание от вывода VCC. Вывод VL можно оставить неподключённым.

  • Перемычка I2C PU: подключает подтягивающие резисторы 10 кОм к линиям SDA/SCL (вам не нужно добавлять резисторы для линий SDA и SCL в вашу схему).

Подключение модуля APDS9960 к Arduino

Arduino с датчиком APDS9960 — подключение на макетной плате

Вот список компонентов, необходимых для этого руководства:

Вы можете воспользоваться ссылками выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключите датчик APDS9960 к Arduino, как показано в следующей таблице/схеме.

Схема подключения APDS9960 к Arduino (Fritzing)

Вывод

Подключение к Arduino Uno

VCC

3.3V

GND

GND

SDA

A4

SCL

A5

INT

Пин 3 (или любой цифровой пин)

VL

не подключать * (проверьте перемычки)

Установка библиотек для датчика APDS9960

Существует несколько библиотек, упрощающих работу с датчиком APDS9960. Мы будем использовать библиотеку APDS9960 от Adafruit. Установите её в Arduino IDE.

Перейдите в Sketch > Include Library > Manage Libraries. Найдите APDS9960 Adafruit и установите соответствующую библиотеку, а также все необходимые зависимости.

Установка библиотеки APDS9960 в Arduino IDE

Получение I2C-адреса и идентификатора чипа

Датчик APDS9960 обычно использует I2C-адрес 0x39 и имеет идентификатор чипа 0xAB.

Однако некоторые клонированные или поддельные модули могут использовать другой I2C-адрес или возвращать другой идентификатор чипа. Чтобы избежать проблем, рекомендуется запустить приведённый ниже код для подтверждения фактического адреса и идентификатора вашего датчика.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/arduino-apds9960-gesture-sensor/
  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() {
}

Посмотреть исходный код

После загрузки кода откройте Serial Monitor на скорости 115200 бод. Вы должны увидеть I2C-адрес и идентификатор чипа вашего датчика.

APDS9960 — получение I2C-адреса и идентификатора чипа

В моём случае I2C-адрес — 0x39, что является ожидаемым адресом, а идентификатор чипа — 0xA8, что не соответствует ожидаемому (ожидался бы 0xAB). Это означает, что у меня поддельный модуль.

Если у вас тоже поддельный модуль — не переживайте. Вы всё равно можете его использовать и следовать руководству. Вам просто нужно внести небольшое изменение в один из файлов библиотеки.

Библиотека Adafruit_APDS9960 содержит жёстко заданный идентификатор чипа и проверяет его при инициализации модуля. Если у вас поддельный модуль, инициализация не пройдёт корректно.

Чтобы исправить это, выполните следующие шаги:

  1. Откройте папку установки Arduino IDE и перейдите в каталог библиотек.

  2. Найдите папку Adafruit_APDS9960_Library.

  3. Внутри неё откройте файл Adafruit_APDS9960.cpp.

  4. Закомментируйте следующие строки, чтобы игнорировать несовпадение идентификатора чипа (строки 100–104). Или замените на ваш идентификатор чипа.

/* Make sure we're actually connected */
/*uint8_t x = read8(APDS9960_ID);
if (x != 0xAB) {
  return false;
}*/

Сохраните файл Adafruit_APDS9960.cpp.

Теперь, когда у вас есть адрес датчика, идентификатор чипа и все необходимые библиотеки установлены, давайте протестируем несколько примеров, чтобы понять, как работает датчик.

1) Arduino с APDS9960 – Распознавание жестов

Датчик 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/arduino-apds9960-gesture-sensor/

#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 Monitor.

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();

Затем проверьте обнаруженный жест и выведите его в Serial Monitor.

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");
}

Тестирование распознавания жестов

После загрузки кода откройте Serial Monitor на скорости 115200 бод.

Проведите рукой рядом с датчиком: вверх, вниз, влево и вправо.

Arduino с APDS9960 — тестирование распознавания жестов

Соответствующий жест будет выведен в Serial Monitor.

APDS9960 — распознавание жестов Arduino IDE — Serial Monitor

2) Arduino с APDS9960 – Распознавание жестов с выводом на OLED

Вы можете развить предыдущий пример, добавив OLED-дисплей в вашу схему для отображения обнаруженных жестов. Этот пример легко модифицировать, чтобы отображать любой экран в зависимости от жеста.

Для этого проекта выполните следующие шаги:

1) Подключите OLED-дисплей к Arduino. Ваша схема будет выглядеть следующим образом:

Arduino с APDS9960 — распознавание жестов с OLED-дисплеем

2) Установите библиотеку Adafruit_SSD1306 и соответствующие зависимости в Arduino IDE.

3) Загрузите следующий код на вашу плату.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/arduino-apds9960-gesture-sensor/
  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 к Arduino IDE, прочитайте следующее руководство: Руководство по I2C OLED-дисплею с Arduino.

Демонстрация

Проведите рукой в разных направлениях перед датчиком. Жест будет отображён на OLED-экране.

APDS9960 с Arduino — обнаружение жеста «Вверх»

Обнаружение жеста «Вверх» (Moving UP)

APDS9960 с Arduino — обнаружение жеста «Вправо»

Обнаружение жеста «Вправо» (Moving RIGHT)

3) Arduino с APDS9960 – Обнаружение приближения

Датчик APDS9960 может обнаруживать приближение в диапазоне примерно от 10 до 20 см. Когда объект приближается к датчику, он активирует вывод INT (прерывание). Это прерывание с активным LOW, то есть состояние вывода меняется с HIGH на LOW при обнаружении приближения.

Датчик APDS9960 позволяет установить порог приближения, который определяет, насколько близко должен находиться объект, чтобы считаться «обнаруженным».

Для этого примера выполните следующие шаги:

1) Подключите светодиод к вашей схеме. Мы подключаем его к пину 7, но вы можете использовать любой другой пин.

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/arduino-apds9960-gesture-sensor/

#include "Adafruit_APDS9960.h"

//the pin that the interrupt is attached to
#define INT_PIN 3

// LED for visual output
#define LED_PIN 7

//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 3.

//the pin that the interrupt is attached to
#define INT_PIN 3

Затем определите пин, к которому подключён светодиод.

// LED for visual output
#define LED_PIN 7

setup()

В функции setup() инициализируйте Serial Monitor.

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);

Демонстрация

Загрузите предыдущий код на вашу плату.

Поднесите что-нибудь ближе к датчику. Вы увидите, что при достижении определённого порога приближения светодиод загорается.

APDS9960 Arduino — тестирование датчика приближения

Одновременно значения приближения выводятся в Serial Monitor.

Arduino с APDS9960 — Serial Monitor

4) Arduino с APDS9960 – Измерение RGB-освещения

Датчик APDS9960 может измерять красный, зелёный, синий и общий (clear) свет. Канал clear измеряет общую яркость, а каналы красного, зелёного и синего показывают, сколько каждого цвета присутствует.

Значения, получаемые от датчика, являются относительными. Более высокие значения означают больше света определённого цвета. Вы можете сравнивать значения, чтобы попытаться определить доминирующий цвет объекта или окружения.

Следующий код считывает красный, зелёный, синий и общий свет и отображает результаты в Serial Monitor. Этот код основан на примере, предоставленном библиотекой.

/* 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/arduino-apds9960-gesture-sensor/

#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 Monitor.

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();

Демонстрация

Загрузите предыдущий код на вашу плату. Затем откройте Serial Monitor на скорости 115200 бод.

Попробуйте направить фонарик смартфона на датчик — вы заметите, что значения интенсивности света начнут увеличиваться.

APDS9960 — измерение цвета, Arduino IDE, Serial Monitor

Вы также можете поэкспериментировать с цветным светом или направить фонарик на цветной объект. Отражённый свет попадёт на датчик, позволяя ему определить цвет объекта.

Arduino APDS9960 — тестирование датчика освещения

Заключение

В этом руководстве вы узнали, как использовать модуль датчика APDS9960 с Arduino. Он может распознавать базовые жесты, приближение, измерять окружающее освещение и интенсивность RGB-света.

Мы показали вам несколько базовых примеров для тестирования датчика и изучения основных методов использования его функций.

Надеемся, это руководство было для вас полезным. У нас есть больше руководств по датчикам и модулям для Arduino:

Чтобы узнать больше об Arduino, ознакомьтесь с нашими ресурсами:

Спасибо за чтение.