Датчик жестов: различия между версиями

Материал из me-robotics wiki
 
(не показано 12 промежуточных версий 2 участников)
Строка 17: Строка 17:
  
 
Все модули линейки "Trema" выполнены в одном формате
 
Все модули линейки "Trema" выполнены в одном формате
[[Файл:Спецификация.png|слева|437x437пкс|альт=]]
 
 
 
 
 
  
 +
[[Файл:Спецификация.png|альт=|437x437пкс]]
  
 
== Подключение: ==
 
== Подключение: ==
Строка 31: Строка 27:
 
Модуль удобно подключать 4 способами, в зависимости от ситуации:
 
Модуль удобно подключать 4 способами, в зависимости от ситуации:
  
=== '''Способ - 1 :'''  Используя проводной шлейф и Piranha UNO ===
+
=== Способ - 1 :  Используя проводной шлейф и Piranha UNO ===
Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO.
+
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
[[Файл:Используя проводной шлейф и Piranha UNO.png|слева|безрамки|536x536пкс]]
 
  
 +
[[Файл:Используя_проводной_шлейф_и_Piranha_UNO.png|альт=|безрамки|567x567px]]
  
 
+
===Способ - 2 :  Используя Trema Set Shield===
 
 
 
 
 
 
 
 
=== '''Способ - 2 :  Используя Trema Set Shield''' ===
 
 
Модуль можно подключить к любому из I2C входов Trema Set Shield.
 
Модуль можно подключить к любому из I2C входов Trema Set Shield.
[[Файл:Используя Trema Set Shield.png|слева|безрамки|476x476пкс]]
 
  
 +
[[Файл:Используя_Trema_Set_Shield.png|альт=|безрамки|534x534px]]
  
 +
===Способ - 3 :  Используя проводной шлейф и Shield===
 +
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
 +
[[Файл:Используя_проводной_шлейф_и_Shield.png|альт=|безрамки|555x555px]]
  
 
+
==Питание:==
 
 
 
 
 
 
=== '''Способ - 3 :  Используя проводной шлейф и Shield''' ===
 
Используя 4-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
 
[[Файл:Используя проводной шлейф и Shield.png|слева|безрамки|497x497пкс]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
== Питание: ==
 
 
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля.
 
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля.
  
== Подробнее о модуле: ==
+
==Подробнее о модуле:==
 
Модуль построен на базе датчика APDS9960, в состав которого входят:
 
Модуль построен на базе датчика APDS9960, в состав которого входят:
  
* ИК-светодиод с программируемым драйвером;
+
*ИК-светодиод с программируемым драйвером;
* 4 фотодиода для обнаружения жестов;
+
*4 фотодиода для обнаружения жестов;
* 3 фотодиода, реагирующих на разные спектры для определения цвета;
+
*3 фотодиода, реагирующих на разные спектры для определения цвета;
* 1 фотодиод общей освещённости;
+
*1 фотодиод общей освещённости;
* Уф- и ИК-фильтры;
+
*Уф- и ИК-фильтры;
* Усилители с программируемым коэффициентом усиления;
+
*Усилители с программируемым коэффициентом усиления;
* МК;
+
*МК;
* АЛУ;
+
*АЛУ;
* АЦП;
+
*АЦП;
* ОЗУ;
+
*ОЗУ;
* и множество дополнительных блоков.
+
*и множество дополнительных блоков.
  
 
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
 
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
  
== Примеры: ==
+
==Примеры:==
 
 
=== 1. Определение жестов ===
 
[[Файл:Определение жестов.png|слева|1083x1083пкс]]
 
  
 +
===1. Определение жестов===
 +
<syntaxhighlight lang="c">
 +
//библиотеки
 +
#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!");      //Иначе, выводим ошибку инициализации
  
  
 +
  //Устанавливаем коэффициент усиления приёмника      //Доступные значения: 1x, 2x, 4x, 8x (GGAIN_1X, и т.д.)
 +
  //Чем выше коэффициент, тем выше чувствительность
 +
  if (apds.setGestureGain(GGAIN_2X)){                //Если коэффициент в режиме обнаружения жестов
 +
    Serial.println("Set gain OK!");                  //выводим сообщение об успешной установке коэффициента
 +
    }
 +
  else Serial.println("Set gain ERROR!");            //Иначе сообщение об ошибке при установке коэффициента
 +
  //В переменную i сохранится значение GGAIN_1X, GGAIN_2X, GGAIN_4X или GGAIN_8X.
  
  
 +
  //Устанавливаем силу тока драйвера ИК-светодиода    //Доступны значения: 100, 50, 25, 12.5 мА
 +
                                                      //(LED_DRIVE_12_5MA, LED_DRIVE_100MA и т.д.)
 +
  //Чем выше сила тока, тем выше чувствительность
 +
  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_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; //Зафиксировано движение, но жест не опознан
 +
      }
 +
    }
 +
  delay(1000);                                        //Чтобы не перегружать шину I2C постоянными запросами
 +
}
 +
</syntaxhighlight>
  
 +
===2. Определение освещённости и цвета===
 +
<syntaxhighlight lang="c">
 +
//библиотеки
 +
#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 бит/сек
  
  
2. Определение освещённости и цвета
+
  //Инициируем работу датчика
[[Файл:Определение освещённости и цвета.png|слева]]
+
  if (apds.init()){                                  //Если инициализация прошла успешно, то
3. Определение приближения
+
    Serial.println("Initialization OK!");            //выводим сообщение об успешной инициализации датчика
[[Файл:Определение приближения.png|слева]]
+
    }
 +
  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.disableLightSesnor();
 +
  //в переменную 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 + " 1x");                      // значения
 +
    }
 +
  else Serial.println("Read light ERROR!");                //Иначе сообщение об ошибке чтения освещённости
 +
 
 +
  delay(1000);                                        //Чтобы не перегружать шину I2C постоянными запросами
 +
}
 +
</syntaxhighlight>
  
 +
===3. Определение приближения===
 +
<syntaxhighlight lang="c">
 +
//библиотеки
 +
#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!");      //Иначе, выводим ошибку инициализации
  
  
 +
  //Устанавливаем коэффициент усиления приёмника      //Доступные значения: 1x, 2x, 4x, 8x (GGAIN_1X, и т.д.)
 +
  //Чем выше коэффициент, тем выше чувствительность
 +
  if (apds.setGestureGain(GGAIN_2X)){                //Если коэффициент в режиме обнаружения жестов
 +
    Serial.println("Set gain OK!");                  //выводим сообщение об успешной установке коэффициента
 +
    }
 +
  else Serial.println("Set gain ERROR!");            //Иначе сообщение об ошибке при установке коэффициента
 +
  //В переменную i сохранится значение GGAIN_1X, GGAIN_2X, GGAIN_4X или GGAIN_8X.
  
  
 +
  //Разрешаем режим определения приближения
 +
  if (apds.enableProximitySensor(false)){              //Режим определения приближения запущен (false - без
 +
                                                        //прерываний на выходе INT), то
 +
    Serial.println("Start proximity sensor OK!");    //сообщение об успешном запуске определения приближения
 +
    }
 +
  else Serial.println("Start proximity sensor ERROR!"); //Иначе сообщение об ошибке определения приближения
 +
  //Запретить режим определения приближения можно так: bool j = apds.disableProximitySesnor();
 +
  //в переменную j сохранится результат выполнения функции (true/false)
  
  
 +
  //ждём завершения инициализации и калибровки
 +
  delay(500);
 +
}
  
Жесты:
+
void loop() {
 +
  //Читаем определённое датчиком значение приближения
 +
  if (apds.readProximity(ProximityData)){    //Если значение корректно прочитано в переменную proximityData
 +
    Serial.println((String) "Proximity = " + proximityData); //то выводим значение приближения
 +
    }
 +
  else Serial.println("Reading proximity value ERROR!");    //Иначе сообщение об ошибке чтения приближения
 +
 
 +
  delay(1000);                                        //Чтобы не перегружать шину I2C постоянными запросами
 +
}
 +
</syntaxhighlight>
  
 +
==Жесты:==
 
Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
 
Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
  
UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
+
*UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
  
DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
+
*DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
  
LEFT - Движение руки перед датчиком ВЛЕВО.
+
*LEFT - Движение руки перед датчиком ВЛЕВО.
  
RIGHT - Движение руки перед датчиком ВПРАВО.
+
*RIGHT - Движение руки перед датчиком ВПРАВО.
  
NEAR - Приближение руки К датчику.
+
*NEAR - Приближение руки К датчику.
  
 
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
 
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
  
FAR Удаление руки ОТ датчика.
+
*FAR Удаление руки ОТ датчика.
  
 
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
 
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
  
NONE Датчик зафиксировал движение, но не смог его распознать.
+
*NONE Датчик зафиксировал движение, но не смог его распознать.

Текущая версия на 23:53, 11 мая 2022

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

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

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

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

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

Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.

Модуль подключается к аппаратной шине I2C Arduino. Для удобства подключения, предлагаем воспользоваться TremaShield.

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

Способ - 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 и тд.

Питание:

Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля.

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

Модуль построен на базе датчика APDS9960, в состав которого входят:

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

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

Примеры:

1. Определение жестов

//библиотеки
#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!");       //Иначе, выводим ошибку инициализации


  //Устанавливаем коэффициент усиления приёмника      //Доступные значения: 1x, 2x, 4x, 8x (GGAIN_1X, и т.д.)
  //Чем выше коэффициент, тем выше чувствительность
  if (apds.setGestureGain(GGAIN_2X)){                 //Если коэффициент в режиме обнаружения жестов
    Serial.println("Set gain OK!");                   //выводим сообщение об успешной установке коэффициента 
    }
  else Serial.println("Set gain ERROR!");             //Иначе сообщение об ошибке при установке коэффициента
  //В переменную i сохранится значение GGAIN_1X, GGAIN_2X, GGAIN_4X или GGAIN_8X.


  //Устанавливаем силу тока драйвера ИК-светодиода    //Доступны значения: 100, 50, 25, 12.5 мА 
                                                      //(LED_DRIVE_12_5MA, LED_DRIVE_100MA и т.д.)
  //Чем выше сила тока, тем выше чувствительность
  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_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; //Зафиксировано движение, но жест не опознан
      }
    }
  delay(1000);                                        //Чтобы не перегружать шину I2C постоянными запросами
}

2. Определение освещённости и цвета

//библиотеки
#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.disableLightSesnor();
  //в переменную 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 + " 1x");                      // значения
    }
  else Serial.println("Read light ERROR!");                //Иначе сообщение об ошибке чтения освещённости
  
  delay(1000);                                        //Чтобы не перегружать шину I2C постоянными запросами
}

3. Определение приближения

//библиотеки
#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!");       //Иначе, выводим ошибку инициализации


  //Устанавливаем коэффициент усиления приёмника      //Доступные значения: 1x, 2x, 4x, 8x (GGAIN_1X, и т.д.)
  //Чем выше коэффициент, тем выше чувствительность
  if (apds.setGestureGain(GGAIN_2X)){                 //Если коэффициент в режиме обнаружения жестов
    Serial.println("Set gain OK!");                   //выводим сообщение об успешной установке коэффициента 
    }
  else Serial.println("Set gain ERROR!");             //Иначе сообщение об ошибке при установке коэффициента
  //В переменную i сохранится значение GGAIN_1X, GGAIN_2X, GGAIN_4X или GGAIN_8X.


  //Разрешаем режим определения приближения
  if (apds.enableProximitySensor(false)){               //Режим определения приближения запущен (false - без
                                                        //прерываний на выходе INT), то
    Serial.println("Start proximity sensor OK!");     //сообщение об успешном запуске определения приближения
    }
  else Serial.println("Start proximity sensor ERROR!"); //Иначе сообщение об ошибке определения приближения
  //Запретить режим определения приближения можно так: bool j = apds.disableProximitySesnor();
  //в переменную j сохранится результат выполнения функции (true/false)


  //ждём завершения инициализации и калибровки
  delay(500);
}

void loop() {
  //Читаем определённое датчиком значение приближения
  if (apds.readProximity(ProximityData)){     //Если значение корректно прочитано в переменную proximityData
    Serial.println((String) "Proximity = " + proximityData); //то выводим значение приближения
    }
  else Serial.println("Reading proximity value ERROR!");     //Иначе сообщение об ошибке чтения приближения
  
  delay(1000);                                         //Чтобы не перегружать шину I2C постоянными запросами
}

Жесты:

Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:

  • UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
  • DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
  • LEFT - Движение руки перед датчиком ВЛЕВО.
  • RIGHT - Движение руки перед датчиком ВПРАВО.
  • NEAR - Приближение руки К датчику.

Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.

  • FAR Удаление руки ОТ датчика.

Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.

  • NONE Датчик зафиксировал движение, но не смог его распознать.