Общие сведения
Датчик освещённости и приближения APDS9930 — способен определять близость объектов (препятствий) и уровень освещённости в Lux. У старшей модели APDS9960 более расширенный функционал, помимо определения близости и освещённости, они способны определять цвет и жесты.
Характеристики
- Входное напряжение питания (VCC): 2,2 ... 3,6 В постоянного тока (номинально 3,3 В).
- Напряжение питания драйвера ИК-светодиода (VL): от 2,5 до 4,5 В постоянного тока.
- Ток потребляемый ИК-светодиодом через драйвер: 100 / 50 / 25 / 12.5 мА (устанавливается программно).
- Ток потребляемый модулем без учёта ИК-светодиода:
- В режиме измерений: до 200 мкА.
- В режиме ожидания: до 90 мкА.
- В спящем режима: до 2,2 мкА.
- Частота тактирования шины I2C: до 400 кГц.
- Адрес модуля на шине I2C: 0x39.
- Рабочая температура: -30 ... +85 °С.
- Температура хранения: -40 ... +85 °С.
- Габариты: 15х18 мм
- Вес: 3 гр.
Подключение
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
У датчика APDS-9930 логика и питание только 3,3 В!
Выводы SDA и SCL модуля подключаются к аппаратной шине I2C Arduino. Если Ваша Arduino имеет 5 В логику, то выводы SDA и SCL подключаются через двунаправленный преобразователь уровней 3.3 - 5 В.
Выводы GND, VCC и VL являются выводами питания (вывод VCC - питание модуля +3.3 В, а вывод VL - питание встроенного ИК-светодиода +2.5 ... +4.5 В). Если подать питание только на вывод VCC (а вывод VL оставить не подключённым), то модуль будет определять уровень освещённости, но не сможет определять близость, т.к. оно определяется по интенсивности отражённого света от ИК-светодиода, питание на который не подано. На обратной стороне модуля имеется одна SMD площадка, если установить на неё перемычку, то вывод VCC будет электрически соединён с выводом VL и можно будет подавать питание 3,3 В только на вывод VCC, при этом модуль будет определять и освещённость и близость.
Вывод INT модуля является выходом прерывания (активный уровень - логический «0») который может реагировать на яркость или приближение (зависит от выбранного режима работы модуля). Данный вывод можно не использовать (постоянно опрашивая модуль), а можно использовать по прямому назначению (подключить к выводу Arduino поддерживающему внешнее прерывание) и опрашивать модуль только по внешнему прерыванию.
Ниже представлены 2 варианта работы с датчиком APDS9930:
- Без использования вывода INT (без прерываний);
- С использованием вывода INT (с прерываниями);
1) Подключение без использования прерывания
- Таблица подключения выводов датчика:
- SDA - линия данных шины I2C. Подключается к выводу A4 Arduino UNO через двунаправленный преобразователь.
- SCL - линия тактирования шины I2C. Подключается к выводу A5 Arduino UNO через двунаправленный преобразователь.
- GND - общий вывод питания. Подключается к выводу GND Arduino UNO.
- VCC - вывод питания модуля. Подключается к выводу 3.3V Arduino UNO.
- VL - вывод питания драйвера ИК-светодиода. Подключается к выводу 3.3V Arduino UNO (если на обратной стороне модуля установлена перемычка, то питание на данный вывод можно не подавать).
- INT - выход прерывания модуля. Не используется.
Определение уровня освещённости (без прерываний)
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <APDS9930.h> // Для работы с датчиком APDS-9930 APDS9930 apds = APDS9930(); // Определяем объект apds, экземпляр класса APDS9930 // // Объявляем переменные: // float lightAmbient = 0; // Определяем переменную для хранения освещённости общей в люксах uint16_t lightCh0 = 0; // Определяем переменную для хранения освещённости видимого и ИК спектра в люксах uint16_t lightCh1 = 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.readAmbientLightLux (lightAmbient) // Если прочитано значение общей освещённости в люксах && apds.readCh0Light (lightCh0) // И прочитано значение освещённости видимого и ИК спектра в люксах && apds.readCh1Light (lightCh1) ){ // И прочитано значение освещённости инфракрасного спектра в люксах, то ... Serial.println((String) "Ambient=" + lightAmbient + " lx,\t( IR/R/G/B=" + lightCh0 + ", IR=" + lightCh1 + " val )"); // Выводим все прочитанные значения }else{Serial.println("Read light ERROR!");} // Иначе, выводим сообщение об ошибке чтения освещённости // // Приостанавливаем выполнение скетча на 1 секунду: // delay(1000); // Чтоб не перегружать шину I2C постоянными запросами } //
Определение приближения (без прерываний)
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <APDS9930.h> // Для работы с датчиком APDS-9930 APDS9930 apds = APDS9930(); // Определяем объект apds, экземпляр класса APDS9930 // // Объявляем переменные: // uint16_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 // Устанавливаем силу тока драйвера ИК-светодиода: // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность. if(apds.setProximityDiode(LED_DRIVE_25MA)){ // Если установлена сила тока драйвера (яркость) ИК-светодиода для обнаружения приближения, то ... Serial.println("Set LED drive OK!"); // Выводим сообщение об успешной установке силы тока драйвера }else{Serial.println("Set LED drive ERROR!");} // Иначе, выводим сообщение об ошибке при установке силы тока драйвера // Прочитать установленную силу тока можно так: uint8_t i = apds.getProximityDiode(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA // Разрешаем режим определения приближения: // 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 - вывод питания драйвера ИК-светодиода. Подключается к выводу 3.3V Arduino UNO (если на обратной стороне модуля установлена перемычка, то питание на данный вывод можно не подавать).
- INT - выход прерывания модуля. Подключается к тем выводам Arduino, которые могут обрабатывать внешние прерывания, у Arduino UNO это выводы D2 и D3. В приведённых ниже скетчах используется вывод D2, если Вы захотите использовать вывод D3 - укажите это в скетче (см. комментарии).
В схеме с использованием прерываний, так же можно подключить светодиод к выводу INT (катод к выводу INT, а анод к выводу 3.3V), без внесения изменений в скетчи. Светодиод будет указывать о том, что модуль регистрирует данные.
Определение уровня освещённости (по прерыванию)
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <APDS9930.h> // Для работы с датчиком APDS-9930 APDS9930 apds = APDS9930(); // Определяем объект apds, экземпляр класса APDS9930 // // Объявляем выводы, флаги и функции для прерываний: // uint8_t pinINT = 2; // Определяем № вывода Arduino к которому подключен вывод INT датчика uint8_t numINT; // Объявляем переменную для хранения № внешнего прерывания для вывода pinINT bool flgINT; // Объявляем флаг указывающий на то, что сработало прерывание void funINT(void){flgINT=1;} // Определяем функцию, которая будет устанавливать флаг flgINT при каждом её вызове // // Объявляем переменные: // float lightAmbient = 0; // Определяем переменную для хранения освещённости общей в люксах uint16_t lightCh0 = 0; // Определяем переменную для хранения освещённости видимого и ИК спектра в люксах uint16_t lightCh1 = 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.readAmbientLightLux (lightAmbient) // Если прочитано значение общей освещённости в люксах && apds.readCh0Light (lightCh0) // И прочитано значение освещённости видимого и ИК спектра в люксах && apds.readCh1Light (lightCh1) ){ // И прочитано значение освещённости инфракрасного спектра в люксах, то ... Serial.println((String) "Ambient=" + lightAmbient + " lx,\t( IR/R/G/B=" + lightCh0 + ", IR=" + lightCh1 + " val )"); // Выводим все прочитанные значения }else{Serial.println("Read light ERROR!");} // Иначе, выводим сообщение об ошибке чтения освещённости // Сообщаем модулю, сбросить прерывание с выхода INT: // if(!apds.clearAmbientLightInt()){ // Если модуль НЕ сбросил прерывание с выхода INT после его установки как реакцию на освещённость, то ... Serial.println("Сlearing interrupt ERROR!"); // Выводим сообщение о том, что прерывание не сброшено } // } // } //
Определение приближения (по прерыванию)
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <APDS9930.h> // Для работы с датчиком APDS-9930 APDS9930 apds = APDS9930(); // Определяем объект apds, экземпляр класса APDS9930 // // Объявляем выводы, флаги и функции для прерываний: // 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; // Определяем переменную для хранения нижнего порога приближения, выше которого прерывания выводиться не будут uint16_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 // Устанавливаем силу тока драйвера ИК-светодиода: // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность. if(apds.setProximityDiode(LED_DRIVE_25MA)){ // Если установлена сила тока драйвера (яркость) ИК-светодиода для обнаружения приближения, то ... Serial.println("Set LED drive OK!"); // Выводим сообщение об успешной установке силы тока драйвера }else{Serial.println("Set LED drive ERROR!");} // Иначе, выводим сообщение об ошибке при установке силы тока драйвера // Прочитать установленную силу тока можно так: uint8_t i = apds.getProximityDiode(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA // Устанавливаем нижний порог определения приближения: // Значения приближения выше данного порога не будут приводить к возникновению прерываний на выводе 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,2 до 3,6 В (номинально 3,3 В) постоянного тока, подаётся на выводы «VCC» и «GND» модуля.
Напряжение питания драйвера ИК-светодиода от 2,5 до 4,5 В постоянного тока подаётся на выводы «VL» и «GND» модуля. Если на обратной стороне модуля установлена перемычка, то питание на данный вывод можно не подавать.
Подробнее о датчике
Модуль построен на базе одноимённого датчика APDS9930, в состав которого входят: ИК-светодиод с программируемым драйвером, два фотодиода для определения общей освещённости (Ch0) и освещённости в ИК-диапазоне (Ch1), усилители с программируемым коэффициентом усиления, МК, АЛУ, АЦП, ОЗУ, контроллер шины I2C с адресом ведомого 0x39 и множество дополнительных блоков. Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
Комплектация
- 1x Датчик APDS9930;
Ссылки
- DataSheet;
- Библиотека APDS9930;
- Датчик APDS9960 (более старшая модель);