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

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

ESP8266 с датчиком APDS9960 для приближения, освещенности, RGB и жестов

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

Необходимые условия

Данное руководство ориентировано на программирование ESP8266 с использованием ядра Arduino. Прежде чем продолжить, убедитесь, что ядро ESP8266 Arduino установлено в вашей Arduino IDE. Следуйте следующему руководству для установки плат ESP8266 в Arduino IDE, если вы этого еще не сделали.

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

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

Для проектов с ESP8266 удобно использовать плату расширения (breakout board) с этим датчиком. Мы используем плату расширения, показанную на изображении ниже.

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

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

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

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

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

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

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

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

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

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

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

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

Где купить?

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

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

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

Пин

Функция

Подключение к ESP8266

VCC

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

3.3V

GND

Земля

GND

SDA

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

GPIO 4 (D2)

SCL

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

GPIO 5 (D1)

INT

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

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

VL

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

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

Перемычки APDS9960

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

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

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

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

ESP8266 с датчиком APDS9960 -- подключение

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

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

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

Схема подключения датчика APDS9960 к ESP8266

Пин

Подключение к ESP8266

VCC

3.3V

GND

GND

SDA

GPIO 4 (D2)

SCL

GPIO 5 (D1)

INT

GPIO 14 (D5) (или любой цифровой пин)

VL

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

Рекомендуемая литература: Справочник по распиновке ESP8266: какие GPIO пины следует использовать?

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

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

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

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

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

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

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

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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-адрес и Chip ID вашего датчика.

APDS9960 -- получение I2C-адреса и Chip ID

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

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

APDS9960 – неожиданный Chip ID

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

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

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

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

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

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

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

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

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

1) ESP8266 с 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/esp8266-nodemcu-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 бод.

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

ESP8266 с APDS9960 -- тестирование распознавания жестов

Соответствующий жест будет выведен в мониторе порта.

ESP8266 с APDS9960 -- распознавание жестов в Arduino IDE -- монитор порта

2) ESP8266 с APDS9960 – распознавание жестов с отображением на OLED

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

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

1) Добавьте OLED-дисплей к вашей предыдущей схеме:

OLED

Подключение к ESP8266

VCC

3.3V

GND

GND

SDA

GPIO 4 (D2)

SCL

GPIO 5 (D1)

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

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

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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 к ESP8266, прочитайте следующее руководство: ESP8266 с OLED-дисплеем 0,96 дюйма в Arduino IDE.

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

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

APDS9960 с ESP8266 -- обнаружение жеста вверх

Обнаружение жеста Moving UP

APDS9960 с ESP8266 -- обнаружение жеста влево

Обнаружение жеста Moving LEFT

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

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

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

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

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

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

#include "Adafruit_APDS9960.h"

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

// LED for visual output
#define LED_PIN 12

//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 14 (D5).

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

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

// LED for visual output
#define LED_PIN 12

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

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

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

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

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

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

ESP8266 APDS9960 -- тестирование датчика приближения -- монитор порта

4) ESP8266 с APDS9960 – обнаружение RGB-освещенности

Датчик APDS9960 может измерять уровни красного, зелёного, синего и общего освещения. Канал 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/esp8266-nodemcu-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 = красный

  • g = зелёный

  • b = синий

  • c = общий (окружающая освещенность)

Ожидайте, пока новые данные о цвете не будут доступны от датчика.

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 обнаружение цвета Arduino IDE -- тестирование с ESP8266

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

ESP8266 APDS9960 -- тестирование датчика освещенности

Заключение

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

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

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

Для более глубокого изучения ESP8266 ознакомьтесь с нашими ресурсами: