Корзина

Товар/услуга Стоимость (Руб.) Количество (Штук) Сумма(Руб.)
Оформить заказ
Закрыть корзину

8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"
Магазин
Личный кабинет
Ресурсы
Указывайте в ваших постах тэг #iarduino
Видео уроки

Вверх

Купить Датчик жестов, освещенности, цвета и приближения APDS-9960 для Arduino

Датчик жестов, освещенности, цвета и приближения APDS-9960  для Arduino
 Датчик жестов, освещенности, цвета и приближения APDS-9960 для Arduino ардуино Датчик жестов, освещенности, цвета и приближения APDS-9960 для Arduino ардуино
ID товара: 808
Наличие: 23 Шт.
Возможен безналичный расчёт для юридических лиц при оформлении заказа

Доставка

По Москве
  • -Самовывоз
  • -Курьерская доставка
  • -Пункты выдачи Boxberry
По России
  • -Почта России 1 классом
  • -Пункты выдачи Boxberry
  • -EMS
  • -СДЭК

Похожие товары

Датчик тока 30А. для ардуиныТермопринтер TTL для ардуиныДатчик линии, аналоговый (Trema-модуль) для ардуиныИнфракрасный датчик препятствий E18-D80NK для ардуиныТермистор 100k для ардуиныЦифровой датчик температуры и влажности (Trema-модуль) для ардуиныDHT11 цифровой датчик температуры и влажности для ардуиныДатчик Холла (Trema-модуль) для ардуиныДатчик тока 5А.  для ардуиныДатчик температуры DS18B20+ для ардуиныДатчик газа MQ-6 (Trema-модуль v2.0) для ардуиныДатчик газа MQ-135 (Trema-модуль v2.0) для ардуины

Теги

Описание
Файлы и библиотеки (0)
Уроки (0)

Описание: Датчик жестов, освещенности, цвета и приближения APDS-9960

Датчик APDS9960 - способен определять уровень освещённости в Lux (как общий, так и по трём каналам спектра - красный, зелёный, синий), приближение объектов (препятствий) и жесты (движение объектов влево, вправо, вверх, вниз, к датчику и от него). У более ранней модели APDS9930 имеются только функции определения приближения и уровня общей освещённости.

Общие сведения:

Модуль построен на базе одноимённого датчика APDS9960, в состав которого входят: ИК-светодиод с программируемым драйвером, 4 фотодиода для обнаружения жестов, 3 фотодиода реагирующих на разные спектры для определения цвета, 1 фотодиод общей освещённости, Уф и ИК-фильтры, усилители с программируемым коэффициентом усиления, МК, АЛУ, АЦП, ОЗУ, контроллер шины I2C с адресом ведомого 0x39 и множество дополнительных блоков. Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.

Жесты:

    Датчик APDS9960 способен реагировать на следующие жесты:
  • UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
  • DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
  • LEFT - Движение руки перед датчиком ВЛЕВО.
  • RIGHT - Движение руки перед датчиком ВПРАВО.
  • NEAR - Приближение руки К датчику.
    Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
  • FAR Удаление руки ОТ датчика.
    Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
  • NONE Датчик зафиксировал движение, но не смог его распознать.

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

У датчика APDS-9960 логика и питание только 3,3 В!

Выводы SDA и SCL модуля подключаются к аппаратной шине I2C Arduino. Если Ваша Arduino имеет 5 В логику, то выводы SDA и SCL подключаются через двунаправленный преобразователь уровней 3.3 - 5 В.

Выводы GND, VCC и VL являются выводами питания (вывод VCC - питание модуля +3.3 В, а вывод VL - питание встроенного ИК-светодиода +3.0 ... +4.5 В). В модуле вывод VL соединён с VCC через перемычку PS, следовательно, напряжение питания +3.3 В, подаётся только на вывод VCC. Если Вам потребуется запитать ИК-светодиод от вывода VL а не от питания модуля VCC, то уберите припой с перемычки PS модуля.

Вывод INT модуля является выходом прерывания (активный уровень - логический «0») который в зависимости от выбранного режима работы может реагировать на яркость, обнаружение объектов, действия и т.д. Данный вывод можно не использовать (постоянно опрашивая модуль), можно использовать по прямому назначению (подключить к выводу Arduino поддерживающему внешнее прерывание) и опрашивать модуль только по внешнему прерыванию, а можно подключить к нему обычный светодиод который будет сигнализировать о том, что модуль отреагировал на какое то действие или событие.

Ниже представлены 2 варианта работы с датчиком APDS9960, с использованием вывода INT (с прерываниями) и без использования вывода INT (без прерываний).

1) Подключение без использования прерывания:

    Таблица подключения выводов датчика:
  • SDA - линия данных шины I2C. Подключается к выводу A4 Arduino UNO через двунаправленный преобразователь.
  • SCL - линия тактирования шины I2C. Подключается к выводу A5 Arduino UNO через двунаправленный преобразователь.
  • GND - общий вывод питания. Подключается к выводу GND Arduino UNO.
  • VCC - вывод питания модуля. Подключается к выводу 3.3V Arduino UNO.
  • VL - вывод питания драйвера ИК-светодиода. Не используется.
  • INT - выход прерывания модуля. Не используется.

К выводу INT датчика можно подключить светодиод (катод к выводу INT, а анод к выводу 3.3V). Если Вы будите его использовать, то функции: enableLightSensor(), enableGestureSensor() или enableProximitySensor() скетчей требуется вызывать с параметром true, а не false, как это указано в скетчах. Светодиод будет фиксировать прерывания (указывать на то, что модуль отреагировал на какое то действие или событие), но сами прерывания не будут участвовать в алгоритме обработки данных, так как вывод INT датчика не подключён к Arduino.

Определение жестов (без прерываний):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
void setup(){                                                   //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение оо ошибке инициализации датчика
                                                                //
//  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (GGAIN_1X, GGAIN_2X, GGAIN_4X, GGAIN_8X). Чем выше коэффициент тем выше чувствительность
    if(apds.setGestureGain(GGAIN_2X)){                          // Если установлен коэффициент усиления приёмника в режиме обнаружения жестов, то ... 
          Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
    }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getGestureGain(); // в переменную i сохранится значение: GGAIN_1X, или GGAIN_2X, или GGAIN_4X, или GGAIN_8X
//  Устанавливаем силу тока драйвера ИК-светодиода:             // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность.
    if(apds.setGestureLEDDrive(LED_DRIVE_100MA)){               // Если устанавлена сила тока драйвера (яркость) ИК-светодиода для обнаружения жестов, то ...
          Serial.println("Set LED drive OK!");                  // Выводим сообщение об успешной установке силы тока драйвера
    }else{Serial.println("Set LED drive ERROR!");}              // Иначе, выводим сообщение об ошибке при установке силы тока драйвера
                                                                // Прочитать установленную силу тока можно так: uint8_t i = apds.getGestureLEDDrive(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA
//  Разрешаем режим обнаружение жестов:                         //
    if(apds.enableGestureSensor(false)){                        // Если механизм обнаружения жестов (false - без прерываний на выходе INT) запущен, то ...
          Serial.println("Start gesture sensor OK!");           // Выводим сообщение об успешном запуске механизма обнаружения жестов
    }else{Serial.println("Start gesture sensor ERROR!");}       // Иначе, выводим сообщение об ошибке запуска механизма обнаружения жестов
                                                                // Запретить работу механизма обнаружения жестов можно так: bool j = apds.disableGestureSensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
                                                                //
void loop(){                                                    //
//  Выводим название зафиксированного жеста:                    //
    if(apds.isGestureAvailable()){                              // Если зафиксировано движение, то ...
        switch(apds.readGesture()){                             // Сверяем значение соответствующее жесту ...
            case DIR_UP:    Serial.println("UP"   ); break;     // Зафиксировано движение вперёд или вверх (зависит от положения датчика)
            case DIR_DOWN:  Serial.println("DOWN" ); break;     // Зафиксировано движение назад или вниз (зависит от положения датчика)
            case DIR_LEFT:  Serial.println("LEFT" ); break;     // Зафиксировано движение влево
            case DIR_RIGHT: Serial.println("RIGHT"); break;     // Зафиксировано движение вправо
            case DIR_NEAR:  Serial.println("NEAR" ); break;     // Зафиксировано движение к датчику
            case DIR_FAR:   Serial.println("FAR"  ); break;     // Зафиксировано движение от датчика
            default:        Serial.println("NONE" ); break;     // Зафиксировано движение, но жест не опознан
        }                                                       //
    }                                                           //
                                                                //
//  Приостанавливаем выполнение скетча на 0,1 секунду:          // 
    delay(100);                                                 // Чтоб не перегружать шину I2C постоянными запросами
}                                                               //
Определение освещённости и цвета (без прерываний):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
// Объявляем переменные:                                        //
uint16_t lightAmbient = 0;                                      // Определяем переменную для хранения освещённости общей            в люксах
uint16_t lightRed     = 0;                                      // Определяем переменную для хранения освещённости красного спектра в люксах
uint16_t lightGreen   = 0;                                      // Определяем переменную для хранения освещённости зелёного спектра в люксах
uint16_t lightBlue    = 0;                                      // Определяем переменную для хранения освещённости синего   спектра в люксах
                                                                //
void setup(){                                                   //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение об ошибке инициализации датчика
                                                                //
//  Разрешаем режим определения освещённости:                   //
    if(apds.enableLightSensor(false)){                          // Если режим определения освещённости запущен (false - без прерываний на выходе INT), то ...
          Serial.println("Start light sensor OK!");             // Выводим сообщение об успешном запуске режима определения освещённости
    }else{Serial.println("Start light sensor ERROR!");}         // Иначе, выводим сообщение об ошибке запуска режима определения освещённости
                                                                // Запретить режим определения освещённости можно так: bool j = apds.disableLightSensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
                                                                //
void loop(){                                                    //
//  Читаем значения освещённости в переменные:                  //
    if(apds.readAmbientLight (lightAmbient)                     // Если прочитано значение общей освещённости
    && apds.readRedLight     (lightRed)                         // И    прочитано значение освещённости красного спектра, и
    && apds.readGreenLight   (lightGreen)                       // И    прочитано значение освещённости зелёного спектра, и
    && apds.readBlueLight    (lightBlue)   ){                   // И    прочитано значение освещённости синего   спектра, то ...
          Serial.println((String) "Ambient=" + lightAmbient + ", Red=" + lightRed + ", Green=" + lightGreen + ", Blue=" + lightBlue + " lx"); // Выводим все прочитанные значения
    }else{Serial.println("Read light ERROR!");}                 // Иначе, выводим сообщение об ошибке чтения освещённости
                                                                //
//  Приостанавливаем выполнение скетча на 1 секунду:            //
    delay(1000);                                                // Чтоб не перегружать шину I2C постоянными запросами
}                                                               //
Определение приближения (без прерываний):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
// Объявляем переменные:                                        //
uint8_t proximityData = 0;                                      // Определяем переменную для хранения значения приближения
                                                                //
void setup(){                                                   //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение оо ошибке инициализации датчика
                                                                //
//  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (PGAIN_1X, PGAIN_2X, PGAIN_4X, PGAIN_8X). Чем выше коэффициент тем выше чувствительность
    if(apds.setProximityGain(PGAIN_2X)){                        // Если установлен коэффициент усиления приёмника в режиме определения расстояния, то ... 
          Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
    }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getProximityGain(); // в переменную i сохранится значение: PGAIN_1X, или PGAIN_2X, или PGAIN_4X, или PGAIN_8X
//  Разрешаем режим определения приближения:                    //
    if(apds.enableProximitySensor(false)){                      // Если механизм определения приближения (false - без прерываний на выходе INT) запущен, то ...
          Serial.println("Start proximity sensor OK!");         // Выводим сообщение об успешном запуске механизма определения приближения
    }else{Serial.println("Start proximity sensor ERROR!");}     // Иначе, выводим сообщение об ошибке запуска механизма определения приближения
                                                                // Запретить работу механизма определения приближения можно так: bool j = apds.disableProximitySensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
                                                                //
void loop(){                                                    //
//  Читаем определённое датчиком значение приближения:          //
    if(apds.readProximity(proximityData)){                      // Если значение приближения корректно прочитано в переменную proximityData, то ..
          Serial.println((String) "Proximity="+proximityData);  // Выводим значение приближения
    }else{Serial.println("Reading proximity value ERROR!");}    // Иначе, выводим сообщение об ошибке чтения приближения
                                                                //
//  Приостанавливаем выполнение скетча на 1 секунду:            //
    delay(1000);                                                // Чтоб не перегружать шину I2C постоянными запросами
}                                                               //

2) Подключение с использованием прерывания:

    Таблица подключения выводов датчика:
  • SDA - линия данных шины I2C. Подключается к выводу A4 Arduino UNO через двунаправленный преобразователь.
  • SCL - линия тактирования шины I2C. Подключается к выводу A5 Arduino UNO через двунаправленный преобразователь.
  • GND - общий вывод питания. Подключается к выводу GND Arduino UNO.
  • VCC - вывод питания модуля. Подключается к выводу 3.3V Arduino UNO.
  • VL - вывод питания драйвера ИК-светодиода. Не используется.
  • INT - выход прерывания модуля. Подключается к тем выводам Arduino, которые могут обрабатывать внешние прерывания, у Arduino UNO это выводы D2 и D3. В приведённых ниже скетчах используется вывод D2, если Вы захотите использовать вывод D3 - укажите это в скетче (см. комментарии).

В схеме с использованием прерываний, так же можно подключить светодиод к выводу INT (катод к выводу INT, а анод к выводу 3.3V), без внесения изменений в скетчи.

Определение жестов (по прерыванию):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
// Объявляем выводы, флаги и функции для прерываний:            //
uint8_t pinINT = 2;                                             // Определяем № вывода Arduino к которому подключен вывод INT датчика
uint8_t numINT;                                                 // Объявляем переменную для хранения № внешнего прерывания для вывода pinINT
bool    flgINT;                                                 // Объявляем флаг указывающий на то, что сработало прерывание
void    funINT(void){flgINT=1;}                                 // Определяем функцию, которая будет устанавливать флаг flgINT при каждом её вызове
                                                                //
void setup(){                                                   //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Подготавливаем переменные и функции для прерываний:         //
    pinMode(pinINT, INPUT);                                     // Переводим вывод pinINT в режим входа
    numINT = digitalPinToInterrupt(pinINT);                     // Определяем № внешнего прерывания для вывода pinINT
    attachInterrupt(numINT, funINT, FALLING);                   // Задаём функцию funINT для обработки прерывания numINT. FALLING значит, что функция funINT будет вызываться при каждом спаде уровня сигнала на выводе pinINT с «1» в «0».
    if(numINT>=0){                                              // Если у вывода pinINT есть внешнее прерывание, то ...
          Serial.println("Pin interrupt OK!");                  // Выводим сообщение об успешном выборе вывода прерывания
    }else{Serial.println("Pin interrupt ERROR!");}              // Иначе, выводим сообщение об ошибке выбранного вывода прерывания
                                                                //
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение об ошибке инициализации датчика
                                                                //
//  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (GGAIN_1X, GGAIN_2X, GGAIN_4X, GGAIN_8X). Чем выше коэффициент тем выше чувствительность
    if(apds.setGestureGain(GGAIN_2X)){                          // Если установлен коэффициент усиления приёмника в режиме обнаружения жестов, то ... 
          Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
    }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getGestureGain(); // в переменную i сохранится значение: GGAIN_1X, или GGAIN_2X, или GGAIN_4X, или GGAIN_8X
//  Устанавливаем силу тока драйвера ИК-светодиода:             // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность.
    if(apds.setGestureLEDDrive(LED_DRIVE_100MA)){               // Если устанавлена сила тока драйвера (яркость) ИК-светодиода для обнаружения жестов, то ...
          Serial.println("Set LED drive OK!");                  // Выводим сообщение об успешной установке силы тока драйвера
    }else{Serial.println("Set LED drive ERROR!");}              // Иначе, выводим сообщение об ошибке при установке силы тока драйвера
                                                                // Прочитать установленную силу тока можно так: uint8_t i = apds.getGestureLEDDrive(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA
//  Разрешаем режим обнаружение жестов:                         //
    if(apds.enableGestureSensor(true)){                         // Если механизм обнаружения жестов (true - с прерыванием на выходе INT) запущен, то ...
          Serial.println("Start gesture sensor OK!");           // Выводим сообщение об успешном запуске механизма обнаружения жестов
    }else{Serial.println("Start gesture sensor ERROR!");}       // Иначе, выводим сообщение об ошибке запуска механизма обнаружения жестов
                                                                // Запретить работу механизма обнаружения жестов можно так: bool j = apds.disableGestureSensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Запрет или разрешение прерываний при обнаружении жестов:    //
//              apds.setGestureIntEnable(false);                // Запрет     разрешённых ранее прерываний от механизма обнаружения жестов. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//              apds.setGestureIntEnable(true);                 // Разрешение запрещённых ранее прерываний от механизма обнаружения жестов. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//  uint8_t i = apds.getGestureIntEnable();                     // Чтение     разрешены ли прерывания от механизма обнаружения жестов. В переменную i запишется значение 0 или 1
                                                                //
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
                                                                //
void loop(){                                                    //
//  Выводим название зафиксированного жеста:                    //
    if(flgINT){ flgINT=0;                                       // Если установлен флаг flgINT (указывающий о том, что сработало прерывание), то сбрасываем его и ...
        if(apds.isGestureAvailable()){                          // Если зафиксировано движение, то ...
            switch(apds.readGesture()){                         // Сверяем значение соответствующее жесту ...
                case DIR_UP:    Serial.println("UP"   ); break; // Зафиксировано движение вперёд или вверх (зависит от положения датчика)
                case DIR_DOWN:  Serial.println("DOWN" ); break; // Зафиксировано движение назад или вниз (зависит от положения датчика)
                case DIR_LEFT:  Serial.println("LEFT" ); break; // Зафиксировано движение влево
                case DIR_RIGHT: Serial.println("RIGHT"); break; // Зафиксировано движение вправо
                case DIR_NEAR:  Serial.println("NEAR" ); break; // Зафиксировано движение к датчику
                case DIR_FAR:   Serial.println("FAR"  ); break; // Зафиксировано движение от датчика
                default:        Serial.println("NONE" ); break; // Зафиксировано движение, но жест не опознан
            }                                                   //
        }                                                       //
    }                                                           //
}                                                               //
Определение освещённости и цвета (по прерыванию):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
// Объявляем выводы, флаги и функции для прерываний:            //
uint8_t  pinINT = 2;                                            // Определяем № вывода Arduino к которому подключен вывод INT датчика
uint8_t  numINT;                                                // Объявляем переменную для хранения № внешнего прерывания для вывода pinINT
bool     flgINT;                                                // Объявляем флаг указывающий на то, что сработало прерывание
void     funINT(void){flgINT=1;}                                // Определяем функцию, которая будет устанавливать флаг flgINT при каждом её вызове
                                                                //
// Объявляем переменные:                                        //
uint16_t lightAmbient = 0;                                      // Определяем переменную для хранения освещённости общей            в люксах
uint16_t lightRed     = 0;                                      // Определяем переменную для хранения освещённости красного спектра в люксах
uint16_t lightGreen   = 0;                                      // Определяем переменную для хранения освещённости зелёного спектра в люксах
uint16_t lightBlue    = 0;                                      // Определяем переменную для хранения освещённости синего   спектра в люксах
uint16_t lightIntHigh = 1000;                                   // Определяем переменную для хранения верхнего порога освещённости, ниже которого прерывания выводиться не будут
uint16_t lightIntLow  = 50;                                     // Определяем переменную для хранения нижнего  порога освещённости, выше которого прерывания выводиться не будут
                                                                //
void setup() {                                                  //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Подготавливаем переменные и функции для прерываний:         //
    pinMode(pinINT, INPUT);                                     // Переводим вывод pinINT в режим входа
    numINT = digitalPinToInterrupt(pinINT);                     // Определяем № внешнего прерывания для вывода pinINT
    attachInterrupt(numINT, funINT, FALLING);                   // Задаём функцию funINT для обработки прерывания numINT. FALLING значит, что функция funINT будет вызываться при каждом спаде уровня сигнала на выводе pinINT с «1» в «0».
    if(numINT>=0){                                              // Если у вывода pinINT есть внешнее прерывание, то ...
          Serial.println("Pin interrupt OK!");                  // Выводим сообщение об успешном выборе вывода прерывания
    }else{Serial.println("Pin interrupt ERROR!");}              // Иначе, выводим сообщение об ошибке выбранного вывода прерывания
                                                                //
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение об ошибке инициализации датчика
                                                                //
//  Устанавливаем нижний порог срабатывания прерываний:         // Значения освещённости выше данного порога не будут приводить к возникновению прерываний на выводе INT
    if(apds.setLightIntLowThreshold(lightIntLow)){              // Если установлен нижний порог прерываний, то ...
          Serial.println("Set threshold low OK!");              // Выводим сообщение об успешной установке нижнего порога
    }else{Serial.println("Set threshold low ERROR!");}          // Иначе, выводим сообщение об ошибке при установке нижнего порога
                                                                // Прочитать нижний установленный порог можно так: int i; bool j = apds.getLightIntLowThreshold(i); // в переменную i запишется порог, а в переменную j результат выполнения чтения (true/false)
//  Устанавливаем верхний порог срабатывания прерываний:        // Значения освещённости ниже данного порога не будут приводить к возникновению прерываний на выводе INT
    if(apds.setLightIntHighThreshold(lightIntHigh)){            // Если установлен верхний порог прерываний, то ...
          Serial.println("Set threshold high OK!");             // Выводим сообщение об успешной установке верхнего порога
    }else{Serial.println("Set threshold high ERROR!");}         // Иначе, выводим сообщение об ошибке при установке верхнего порога
                                                                // Прочитать верхний установленный порог можно так: int i; bool j = apds.getLightIntHighThreshold(i); // в переменную i запишется порог, а в переменную j результат выполнения чтения (true/false)
//  Разрешаем режим определения освещённости:                   //
    if(apds.enableLightSensor(true)){                           // Если режим определения освещённости запущен (true - c прерываниями на выходе INT), то ...
          Serial.println("Start light sensor OK!");             // Выводим сообщение об успешном запуске режима определения освещённости
    }else{Serial.println("Start light sensor ERROR!");}         // Иначе, выводим сообщение об ошибке запуска режима определения освещённости
                                                                // Запретить режим определения освещённости можно так: bool j = apds.disableLightSensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Запрет или разрешение прерываний от датчика освещённости:   //
//              apds.setAmbientLightIntEnable(false);           // Запрет     разрешённых ранее прерываний от датчика освещённости. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//              apds.setAmbientLightIntEnable(true);            // Разрешение запрещённых ранее прерываний от датчика освещённости. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//  uint8_t i = apds.getAmbientLightIntEnable();                // Чтение     разрешены ли прерывания от датчика освещённости. В переменную i запишется значение 0 или 1
                                                                //
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
                                                                //
void loop(){                                                    //
    if(flgINT){ flgINT=0;                                       // Если установлен флаг flgINT (указывающий о том, что сработало прерывание), то сбрасываем его и ...
//  Читаем значения освещённости в переменные:                  //
        if(apds.readAmbientLight (lightAmbient)                 // Если прочитано значение общей освещённости
        && apds.readRedLight     (lightRed)                     // И    прочитано значение освещённости красного спектра, и
        && apds.readGreenLight   (lightGreen)                   // И    прочитано значение освещённости зелёного спектра, и
        && apds.readBlueLight    (lightBlue)   ){               // И    прочитано значение освещённости синего   спектра, то ...
              Serial.println((String) "Ambient=" + lightAmbient + ", Red=" + lightRed + ", Green=" + lightGreen + ", Blue=" + lightBlue + " lx"); // Выводим все прочитанные значения
        }else{Serial.println("Read light ERROR!");}             // Иначе, выводим сообщение об ошибке чтения освещённости
//      Сообщаем модулю, сбросить прерывание с выхода INT:      //
        if(!apds.clearAmbientLightInt()){                       // Если модуль НЕ сбросил прерывание с выхода INT после его установки как реакцию на освещённость, то ...
              Serial.println("Сlearing interrupt ERROR!");      // Выводим сообщение о том, что прерывание не сброшено
        }                                                       //
    }                                                           //
}                                                               //
Определение приближения (по прерыванию):
// Подключаем библиотеки:                                       //
#include <Wire.h>                                               // Для работы с шиной I2C
#include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                //
// Объявляем выводы, флаги и функции для прерываний:            //
uint8_t  pinINT = 2;                                            // Определяем № вывода Arduino к которому подключен вывод INT датчика
uint8_t  numINT;                                                // Объявляем переменную для хранения № внешнего прерывания для вывода pinINT
bool     flgINT;                                                // Объявляем флаг указывающий на то, что сработало прерывание
void     funINT(void){flgINT=1;}                                // Определяем функцию, которая будет устанавливать флаг flgINT при каждом её вызове
                                                                //
// Объявляем переменные:                                        //
uint16_t proximityIntHigh = 50;                                 // Определяем переменную для хранения верхнего порога приближения, ниже которого прерывания выводиться не будут
uint16_t proximityIntLow  = 0;                                  // Определяем переменную для хранения нижнего  порога приближения, выше которого прерывания выводиться не будут
uint8_t  proximityData    = 0;                                  // Определяем переменную для хранения значения приближения
                                                                //
void setup() {                                                  //
    Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
//  Подготавливаем переменные и функции для прерываний:         //
    pinMode(pinINT, INPUT);                                     // Переводим вывод pinINT в режим входа
    numINT = digitalPinToInterrupt(pinINT);                     // Определяем № внешнего прерывания для вывода pinINT
    attachInterrupt(numINT, funINT, FALLING);                   // Задаём функцию funINT для обработки прерывания numINT. FALLING значит, что функция funINT будет вызываться при каждом спаде уровня сигнала на выводе pinINT с «1» в «0».
    if(numINT>=0){                                              // Если у вывода pinINT есть внешнее прерывание, то ...
          Serial.println("Pin interrupt OK!");                  // Выводим сообщение об успешном выборе вывода прерывания
    }else{Serial.println("Pin interrupt ERROR!");}              // Иначе, выводим сообщение об ошибке выбранного вывода прерывания
                                                                //
//  Инициируем работу датчика:                                  // 
    if(apds.init()){                                            // Если инициализация прошла успешно, то ...
          Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
    }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение об ошибке инициализации датчика
                                                                //
//  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (PGAIN_1X, PGAIN_2X, PGAIN_4X, PGAIN_8X). Чем выше коэффициент тем выше чувствительность
    if(apds.setProximityGain(PGAIN_2X)){                        // Если установлен коэффициент усиления приёмника в режиме определения расстояния, то ... 
          Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
    }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getProximityGain(); // в переменную i сохранится значение: PGAIN_1X, или PGAIN_2X, или PGAIN_4X, или PGAIN_8X
//  Устанавливаем нижний порог определения приближения:         // Значения приближения выше данного порога не будут приводить к возникновению прерываний на выводе INT
    if(apds.setProximityIntLowThreshold(proximityIntLow)){      // Если установлен нижний порог прерываний, то ...
          Serial.println("Set proximity low OK!");              // Выводим сообщение об успешной установке нижнего порога
    }else{Serial.println("Set proximity low ERROR!");}          // Иначе, выводим сообщение об ошибке при установке нижнего порога
                                                                // Прочитать нижний установленный порог можно так: int i; bool j = apds.getProximityIntLowThreshold(i); // в переменную i запишется порог, а в переменную j результат выполнения чтения (true/false)
//  Устанавливаем верхний порог определения приближения:        // Значения приближения ниже данного порога не будут приводить к возникновению прерываний на выводе INT
    if(apds.setProximityIntHighThreshold(proximityIntHigh)){    // Если установлен верхний порог прерываний, то ...
          Serial.println("Set proximity high OK!");             // Выводим сообщение об успешной установке верхнего порога
    }else{Serial.println("Set proximity high ERROR!");}         // Иначе, выводим сообщение об ошибке при установке верхнего порога
                                                                // Прочитать верхний установленный порог можно так: int i; bool j = apds.getProximityIntHighThreshold(i); // в переменную i запишется порог, а в переменную j результат выполнения чтения (true/false)
//  Разрешаем режим определения приближения:                    //
    if(apds.enableProximitySensor(true)){                       // Если механизм определения приближения (true - c прерыванием на выходе INT) запущен, то ...
          Serial.println("Start proximity sensor OK!");         // Выводим сообщение об успешном запуске механизма определения приближения
    }else{Serial.println("Start proximity sensor ERROR!");}     // Иначе, выводим сообщение об ошибке запуска механизма определения приближения
                                                                // Запретить работу механизма определения приближения можно так: bool j = apds.disableProximitySensor(); // в переменную j сохранится результат выполнения функции (true/false)
//  Запрет или разрешение прерываний при определения приближения//
//              apds.setProximityIntEnable(false);              // Запрет     разрешённых ранее прерываний от механизма определения приближения. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//              apds.setProximityIntEnable(true);               // Разрешение запрещённых ранее прерываний от механизма определения приближения. Данная функция, как и представленные выше, так же возвращает true при успехе и false при неудаче
//  uint8_t i = apds.getProximityIntEnable();                   // Чтение     разрешены ли прерывания от механизма определения приближения. В переменную i запишется значение 0 или 1
                                                                //
//  Ждём завершение инициализации и калибровки:                 //
    delay(500);                                                 //
}                                                               //
void loop(){                                                    //
    if(flgINT){ flgINT=0;                                       // Если установлен флаг flgINT (указывающий о том, что сработало прерывание), то сбрасываем его и ...
//  Читаем определённое датчиком значение приближения:          //
        if(apds.readProximity(proximityData)){                  // Если значение приближения корректно прочитано в переменную proximityData, то ..
              Serial.println((String) "Proximity="+proximityData); // Выводим значение приближения
        }else{Serial.println("Reading proximity value ERROR!");}// Иначе, выводим сообщение об ошибке чтения приближения
//      Сообщаем модулю, сбросить прерывание с выхода INT:      //
        if(!apds.clearProximityInt()){                          // Если модуль НЕ сбросил прерывание с выхода INT после его установки как реакцию на приближение, то ...
              Serial.println("Сlearing interrupt ERROR!");      // Выводим сообщение о том, что прерывание не сброшено
        }                                                       //
    }                                                           //
}                                                               //

Питание:

Напряжение питания модуля от 2,4 до 3,6 В (номинально 3,3 В) постоянного тока, подаётся на выводы «VCC» и «GND» модуля.

Вывод VL предназначенный для питания драйвера ИК-светодиода от 3,0 до 4,5 В постоянного тока не используется, так как он электрически соединён с выводом VCC через перемычку PS на плате модуля.

Спецификация:

  • Входное напряжение питания (VCC): 2,4 ... 3,6 В постоянного тока (номинально 3,3 В).
  • Ток потребляемый ИК-светодиодом через драйвер: 100 / 50 / 25 / 12.5 мА (устанавливается программно).
  • Ток потребляемый модулем без учёта ИК-светодиода:
    • В режиме измерений уровня освещённости: до 250 мкА.
    • В режиме определения приближений: до 790 мкА.
    • В режиме обнаружения жестов: до 790 мкА.
    • В режиме ожидания: до 38 мкА.
    • В спящем режима: до 10 мкА.
  • Частота тактирования шины I2C: до 400 кГц.
  • Адрес модуля на шине I2C: 0x39.
  • Рабочая температура: -30 ... +85 °С.
  • Температура хранения: -40 ... +85 °С.
  • Габариты: 15х20 мм
  • Вес: 3 гр.

Комплектация:

  • 1× Датчик APDS9960

Ссылки:

Файлы и Библиотеки для Датчик жестов, освещенности, цвета и приближения APDS-9960

Уроки с товаром: Датчик жестов, освещенности, цвета и приближения APDS-9960


Гарантии и возврат
Яндекс.Метрика