Датчик освещенности и приближения APDS-9930 (Trema-модуль v2.0)

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

Trema-модуль датчик освещённости и приближения APDS-9930 - это цифровой модуль на базе чипа APDS-9933, подключаемый по шине I2C (адрес 0x39), позволяющий получить текущие значения освещённости (лк) и приближения к препятствию. Еще одним применением данного модуля является определение пульсаций источников света.

Видео:

Редактируется

Характеристики:

  • Напряжение питания модуля: 3,3 или 5 В постоянного тока (поддерживаются оба уровня).
  • Потребляемый ток: настраивается до 100 мА во время измерений приближения.
  • Ток потребляемый ИК-светодиодом: 100 / 50 / 25 / 12.5 мА (устанавливается программно).
  • Ток потребляемый модулем (без учёта ИК-светодиода): до 3 мА.
  • Измеряемый диапазон освещённости: от 0 до 8191 лк.
  • Рабочая частота шины I2C: до 400 кГц.
  • Адрес модуля на шине I2C: 0x39.
  • Уровень логической «1» на шине I2C: до 3,3 В.
  • Рабочая температура: -30 … +85 °C
  • Габариты: 30x30 мм.

Все модули линейки "Trema" выполнены в одном формате

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

Модуль подключается к аппаратной или программной шине I2C Arduino. Логические уровни шины I2C не должны превышать напряжение питания.

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO.

Способ - 2 :  Используя Trema Set Shield

Модуль можно подключить к любому из I2C входов Trema Set Shield.

Способ - 3 :  Используя проводной шлейф и Shield

Используя 4-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

При подключении Trema датчика освещённости и приближения APDS-9930 к другим платам, например, WEMOS D1 mini или WEMOS D1 mini Pro на базе микроконтроллера ESP8266, и т.д. То перед подключением библиотеки iarduino_APDS9930, нужно подключить библиотеку Wire, как это описано в разделе Wiki - расширенные возможности библиотек iarduino для шины I2C.

Питание:

Входное напряжение питания от 3,3 до 5,5 В постоянного тока, подаётся на выводы VIN и GND модуля.

Подробнее о модуле:

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

Для работы с модулем предлагаем воспользоваться разработанной нами библиотекой iarduino_APDS9930, позволяющей получать освещённость, коэффициент пульсаций источника света и близость препятствий.

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Вывод освещённости в люксах:

#include <Wire.h>                           //  Подключаем библиотеку Wire для работы с аппаратной шиной I2C. Примечание: эту библиотеку можно не подключать.
#include <iarduino_APDS9930.h>              //  Подключаем библиотеку  для работы с датчиком APDS-9930.
iarduino_APDS9930 apds;                     //  Определяем объект apds для работы с датчиком APDS-9930.
                                            //  Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF);
void setup(){                               //
    Serial.begin(9600);                     //  Инициируем передачу данных в монитор на скорости 9600 бит/сек.
    apds.begin();                           //  Инициируем работу датчика. Функция возвращает значение true/false по которому можно судить об успехе инициализации.
}                                           //
                                            //
void loop(){                                //
    Serial.print( "Light=" );               //  Выводим текст.
    Serial.print( apds.getLight() );        //  Выводим освещённость.
    Serial.print( " lx. \r\n" );            //  Выводим единицу измерения, а так же символы конца и перевода строки.
    delay(100);                             //
}                                           //

Вывод коэффициента пульсаций в %:

#include <Wire.h>                           //  Подключаем библиотеку Wire для работы с аппаратной шиной I2C. Примечание: эту библиотеку можно не подключать.
#include <iarduino_APDS9930.h>              //  Подключаем библиотеку  для работы с датчиком APDS-9930.
iarduino_APDS9930 apds;                     //  Определяем объект apds для работы с датчиком APDS-9930.
                                            //  Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF);
void setup(){                               //
    Serial.begin(9600);                     //  Инициируем передачу данных в монитор на скорости 9600 бит/сек.
    apds.begin();                           //  Инициируем работу датчика. Функция возвращает значение true/false по которому можно судить об успехе инициализации.
}                                           //
                                            //
void loop(){                                //
    Serial.print( "Pulsation=" );           //  Выводим текст.
    Serial.print( apds.getPulsation() );    //  Выводим коэффициент пульсаций.
    Serial.print( " lx. \r\n" );            //  Выводим единицу измерения, а так же символы конца и перевода строки.
    delay(100);                             //
}                                           //

Вывод близости препятствия:

#include <Wire.h>                           //  Подключаем библиотеку Wire для работы с аппаратной шиной I2C. Примечание: эту библиотеку можно не подключать.
#include <iarduino_APDS9930.h>              //  Подключаем библиотеку  для работы с датчиком APDS-9930.
iarduino_APDS9930 apds;                     //  Определяем объект apds для работы с датчиком APDS-9930.
                                            //  Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF);
void setup(){                               //
    Serial.begin(9600);                     //  Инициируем передачу данных в монитор на скорости 9600 бит/сек.
    apds.begin();                           //  Инициируем работу датчика. Функция возвращает значение true/false по которому можно судить об успехе инициализации.
}                                           //
                                            //
void loop(){                                //
    Serial.print( "Proximity=" );           //  Выводим текст.
    Serial.println( apds.getProximity() );  //  Выводим близость препятствий от 0 (нет препятствий), до 1023 (минимальное расстояние до препятствия).
    delay(100);                             //
}                                           //

Описание функций библиотеки:

Библиотека iarduino_APDS9930 может использовать как аппаратную, так и программную реализацию шины I2C.
О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.

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

#include <Wire.h>                           //  Подключаем библиотеку Wire для плат отличных от Arduino UNO, Mini, Nano.
#include <iarduino_APDS9930.h>              //  Подключаем библиотеку для работы с датчиком APDS-9930.
iarduino_APDS9930 apds;                     //  Создаём объект apds.

Функция begin();

  • Назначение: Инициализация работы с датчиком.
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемые значения: bool - результат инициализации (true или false).
  • Примечание: Функцию достаточно вызвать один раз в коде setup().
  • Пример:
apds.begin();                               //  Инициируем работу датчика без проверки.
if(apds.begin()){Serial.println("OK!" );}   //  Инициируем работу датчика и выводим сообщение «OK!» при успехе.
else            {Serial.println("ERR!");}   //  Если инициализация провалилась, то выводим сообщение «ERR!».

Функция reset();

  • Назначение: Перезагрузка модуля.
  • Синтаксис: reset();
  • Параметры: Нет
  • Возвращаемые значения: bool - результат перезагрузки (true или false).
  • Примечание: Результат перезагрузки идентичен результату инициализации.
  • Пример:
apds.reset();                               //  Перезагружаем датчик без проверки.
if(apds.reset()){Serial.println("OK!" );}   //  Перезагружаем датчик и выводим сообщение «OK!» при успехе.
else            {Serial.println("ERR!");}   //  Если перезагрузка не выполнена, то выводим сообщение «ERR!».

Функция getLight();

  • Назначение: Чтение освещённости в люксах.
  • Синтаксис: getLight();
  • Параметры: Нет.
  • Возвращаемые значения: uint16_t - уровень освещённости от 0 лк до 8191 лк.
  • Примечание: Чем выше коэффициент пульсаций источника света, тем выше будет разброс значений возвращаемых данной функцией.
  • Пример:
uint16_t i;                                 //  Объявляем переменную i.
i = apds.getLight();                        //  Читаем освещённость в переменную i.

Функция getPulsation();

  • Назначение: Чтение коэффициента пульсаций источника света в %.
  • Синтаксис: getPulsation();
  • Параметры: Нет.
  • Возвращаемые значения: uint8_t - коэффициент пульсаций от 0% до 100%.
  • Примечание: Выполнение функции занимает около 100 мс.
  • Пример:
uint8_t i;                                  //  Объявляем переменную i.
apds.getPulsation();                        //  Читаем коэффициент пульсаций в переменную i.

Функция getProximity();

  • Назначение: Чтение близости к препятствию.
  • Синтаксис: getProximity();
  • Параметры: Нет.
  • Возвращаемые значения: uint16_t - уровень близости к препятствию, от 0 (нет препятствий), до 1023 (минимальное расстояние до препятствия).
  • Примечание: Уровень близости нелинеен по отношению к расстоянию и зависит от цвета препятствия.
  • Пример:
uint16_t i;                                 //  Объявляем переменную i.
apds.getProximity();                        //  Читаем уровень близости препятствий в переменную i.

Функция setCurrentDiode();

  • Назначение: Функция задаёт ток протекающий через светодиод датчика. Светодиод используется в импульсном режиме для определения близости препятствий.
  • Синтаксис: setCurrentDiode( [ ТОК СВЕТОДИОДА ] );
  • Параметры: ТОК СВЕТОДИОДА - задаётся одной из констант:
    • APDS9930_DIODE_100 - установить ток через светодиод в 100 мА.
    • APDS9930_DIODE_50 - установить ток через светодиод в 50 мА
    • APDS9930_DIODE_25 - установить ток через светодиод в 25 мА
    • APDS9930_DIODE_12 - установить ток через светодиод в 12,5 мА
  • Возвращаемые значения: bool - результат применения новых настроек (true или false).
  • Примечание:
    • По умолчанию задан ток в 25 мА.
  • Пример:
apds.setCurrentDiode(APDS9930_DIODE_50);    //  Установить ток через светодиод в 50 мА.

Применение:

  • Получение данных для метеостанций.
  • Проверка осветительных приборов на наличие пульсаций.
  • Проверка уровня освещённости в помещениях.
  • Используя чтение близости, модуль можно превратить в:
    • Бесконтактный тахометр.
    • Счетчик объектов прошедших по конвейеру.
    • Датчик препятствий.
    • Датчик линии.

Ссылки:

Обсуждение