Подключение цифрового датчика освещенности 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.

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

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

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

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