Подключение цифрового датчика освещенности TSL2561 к Arduino

TSL2561 — это цифровой датчик освещенности с интерфейсом I2C/TWI. Более подробное описание этого модуля можете найти на странице TSL2561 — Цифровой датчик освещенности (модуль GY-2561). А в этом посте мы подключим по I2C датчик TSL2561 к Arduino, установим необходимую библиотеку и будем выводить значения в последовательный порт компьютера. С помощью TSL2561 можно изготовить самодельный люксметр на Ардуино.

Установка библиотеки Adafruit TSL2561

Для работы с данным модулем необходимо установить библиотеку Adafruit TSL2561. Скачиваем, распаковываем и закидываем в папку Arduino/libraries. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из среды Arduino следующим образом:

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…Подключение датчика освещенности TSL2561 к Arduino - Управлять библиотеками...
  2. В строке поиска вводим «TSL2561», находим библиотеку от Adafruit, выбираем и устанавливаем последнюю версию.Подключение датчика освещенности TSL2561 к Arduino - Установка Adafruit_TSL2561
  3. Библиотека установлена (INSTALLED).Подключение датчика освещенности TSL2561 к Arduino - Библиотека установлена

Не стоит забывать о Adafruit Unified Sensor Library, эту библиотеку также нужно установить.

Подключение TSL2561 к Arduino

Модуль модуль GY-2561 оборудован пяти-пиновым разъемом стандарта 2.54мм

  • VCC: «+» питания
  • GND: «-» питания
  • SCL: последовательная линия тактирования (Serial CLock)
  • SDA: последовательная линия данных (Serial DAta)
  • INT: выход прерывания

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся

Arduino Mega Arduino Uno/Nano/Pro Mini TSL2561 модуль Цвет проводов на фото
GND GND GND Черный
5V 5V VCC Красный
20 (SDA) A4 SDA Синий
21 (SCL) A5 SCL Зелёный

Схема подключения TSL2561 к Arduino по I2C

Схема подключения датчика освещенности TSL2561 к Arduino по I2C

Пример скетча

Библиотека довольно проста в использовании. Первая строка кода в примере — это «конструктор», в котором вы можете указать I2C адрес (на случай, если вы захотите его изменить) и уникальный идентификатор для подключения к этому датчику (вы можете просто оставить это значение по умолчанию: 12345 на данный момент). Изменяя адрес I2C, мы можем подключить до трех датчиков TSL2561 к одной плате:

/*
  Адрес будет отличаться в зависимости от того, оставляете ли вы плавающий
  вывод ADDR (addr 0x39) или привязываете его к GND или Vcc. В этих случаях
  используйте TSL2561_ADDR_LOW (0x29) или TSL2561_ADDR_HIGH (0x49) соответственно
*/
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

Далее вам нужно будет настроить коэффициент усиления датчика и время интеграции.

Вы можете получить либо усиление 0 (без дополнительного усиления, хорошо в условиях хорошего освещения), либо усиление на 16, которое значительно усилит полученный сигнал с датчика в условиях слабого освещения.

Вы также можете изменить время интеграции, то есть как долго датчик TSL2561 будет собирать данные об освещении. Чем дольше время интеграции, тем выше точность датчика.

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

/*
  Конфигурация усиления и времени интеграции для TSL2561
*/
void configureSensor(void) {
  /*
    Вы также можете вручную установить усиление или включить авто-усиление
  */
  /*
    Нет усиления ... используйте при ярком свете, чтобы избежать насыщения датчика
  */
  // tsl.setGain(TSL2561_GAIN_1X);
  /*
    16-кратное усиление ... используйте при слабом освещении для повышения чувствительности
  */
  // tsl.setGain(TSL2561_GAIN_16X);
  /*
    Авто-усиление ... автоматически переключается между 1x и 16x
  */
  tsl.enableAutoRange(true);

  /*
    Изменение времени интеграции дает вам лучшее разрешение сенсора (402 мс = 16-битные данные)
  */

  /*
    быстрое, но низкое разрешение
  */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
  /*
    среднее разрешение и скорость
  */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
  /*
    16-битные данные, но самое медленное преобразование
  */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);

  /*
    Обновите эти значения в зависимости от того, что вы установили выше!
  */
  Serial.println("------------------------------------");
  Serial.print  ("Усиление:           "); Serial.println("Auto");
  Serial.print  ("Времени интеграции: "); Serial.println("13 ms");
  Serial.println("------------------------------------");
}

По умолчанию драйвер возвращает свет в стандартных единицах SI lux, которые являются результатом некоторых сложных вычислений на основе обоих фотодиодов на TSL2561 (один для полного спектра и один для ИК). Чувствительность двух диодов можно увидеть на графике ниже:

TSL2561 - Спектральная чувствительность

Когда вы будете готовы, чтобы получить ваши измерения в lux-ах, просто вызовите getEvent() со ссылкой на объект sensor_event_t, где будут храниться данные датчика. В этом примере предполагается, что мы используем экземпляр tsl Adafruit_TSL2561 из верхней части примера кода:

/*
  Функция цикла Arduino, вызываемая после завершения
  установки (здесь должен быть указан ваш собственный код)
*/
void loop(void) {
  /*
    Получить новое событие датчика
  */
  sensors_event_t event;
  tsl.getEvent(&event);

  /*
    Показать результаты (Освещённость измеряется в люксах)
  */
  if (event.light) {
    Serial.print(event.light); Serial.println(" lux");
  } else {
    /*
      Если event.light = 0 люкса датчик, вероятно, насыщенные
      и достоверные данные не может быть сгенерированы!
    */
    Serial.println("Sensor overload");
  }
  delay(250);
}

Если вы хотите вручную прочитать данные от датчика, вы сможете сделать это, вызвав функцию getLuminosity() и передав две переменные, в которых будут храниться данные датчика:

uint16_t broadband = 0;
uint16_t infrared = 0;

getLuminosity (&broadband, &infrared);

Полный код скетча:

#include <Wire.h>
#include <Adafruit_TSL2561_U.h>

/*
  Адрес будет отличаться в зависимости от того, оставляете ли вы плавающий
  вывод ADDR (addr 0x39) или привязываете его к GND или Vcc. В этих случаях
  используйте TSL2561_ADDR_LOW (0x29) или TSL2561_ADDR_HIGH (0x49) соответственно
*/
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

/*
    Отображает некоторую основную информацию об этом датчике
*/
void displaySensorDetails(void) {
  sensor_t sensor;
  tsl.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Датчик:             "); Serial.println(sensor.name);
  Serial.print  ("Версия драйвера:    "); Serial.println(sensor.version);
  Serial.print  ("Уникальный ID:      "); Serial.println(sensor.sensor_id);
  Serial.print  ("Макс. значение:     "); Serial.print(sensor.max_value); Serial.println(" lux");
  Serial.print  ("Мин. значение:      "); Serial.print(sensor.min_value); Serial.println(" lux");
  Serial.print  ("Разрешение:         "); Serial.print(sensor.resolution); Serial.println(" lux");
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

/*
  Конфигурация усиления и времени интеграции для TSL2561
*/
void configureSensor(void) {
  /*
    Вы также можете вручную установить усиление или включить авто-усиление
  */
  /*
    Нет усиления ... используйте при ярком свете, чтобы избежать насыщения датчика
  */
  // tsl.setGain(TSL2561_GAIN_1X);
  /*
    16-кратное усиление ... используйте при слабом освещении для повышения чувствительности
  */
  // tsl.setGain(TSL2561_GAIN_16X);
  /*
    Авто-усиление ... автоматически переключается между 1x и 16x
  */
  tsl.enableAutoRange(true);

  /*
    Изменение времени интеграции дает вам лучшее разрешение сенсора (402 мс = 16-битные данные)
  */

  /*
    быстрое, но низкое разрешение
  */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
  /*
    среднее разрешение и скорость
  */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
  /*
    16-битные данные, но самое медленное преобразование
  */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);

  /*
    Обновите эти значения в зависимости от того, что вы установили выше!
  */
  Serial.println("------------------------------------");
  Serial.print  ("Усиление:           "); Serial.println("Auto");
  Serial.print  ("Времени интеграции: "); Serial.println("13 ms");
  Serial.println("------------------------------------");
}

/*
  Функция настройки Arduino (автоматически вызывается при запуске)
*/
void setup(void) {
  Serial.begin(9600);
  Serial.println("Тест датчика света"); Serial.println("");

  /*
    Инициализировать датчик
  */
  /*
    использовать tsl.begin() to default to Wire,
    tsl.begin(&Wire2) направляет API для использования Wire2 и т.д.
  */
  if (!tsl.begin()) {
    /*
      При обнаружении TSL2561 возникла проблема ... проверьте подключение
    */
    Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
    while (1);
  }

  /*
    Показать основную информацию об этом датчике
  */
  displaySensorDetails();

  /*
    Настройка коэффициента усиления датчика и времени интеграции
  */
  configureSensor();

  /*
    Мы готовы к работе!
  */
  Serial.println("");
}

/*
  Функция цикла Arduino, вызываемая после завершения
  установки (здесь должен быть указан ваш собственный код)
*/
void loop(void) {
  /*
    Получить новое событие датчика
  */
  sensors_event_t event;
  tsl.getEvent(&event);

  /*
    Показать результаты (Освещённость измеряется в люксах)
  */
  if (event.light) {
    Serial.print(event.light); Serial.println(" lux");
  } else {
    /*
      Если event.light = 0 люкса датчик, вероятно, насыщенные
      и достоверные данные не может быть сгенерированы!
    */
    Serial.println("Sensor overload");
  }
  delay(250);
}

Результат

Подключение цифрового датчика освещенности TSL2561 к Arduino - Результат

Материалы

TSL2561 — Цифровой датчик освещенности (модуль GY-2561)
datasheets_TSL2561.pdf
Arduino Code | TSL2561 Luminosity Sensor | Adafruit Learning System
TSL2560, TSL2561 Light-to-Digital Converter. TAOS059Q. 2009. November.

Похожие записи

Комментарии 2

  • Taken together, these observations suggest that the IRGS, while recapitulating some of the prognostic features of the molecular subtypes, may provide valuable additive prognostic information to the LumA and NL subtypes, and potentially ER negative breast cancer, although further validation in larger breast cancer populations is necessary order cialis online

  • I am so excited is viagra bad Dietary intake was estimated from a 24 hour urine collection obtained on the day before admission to the Clinical Research Unit

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *