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

- В строке поиска вводим «TSL2561», находим библиотеку от Adafruit, выбираем и устанавливаем последнюю версию.

- Библиотека установлена (INSTALLED).

Не стоит забывать о 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
Пример скетча
Библиотека довольно проста в использовании. Первая строка кода в примере — это «конструктор», в котором вы можете указать 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 (один для полного спектра и один для ИК). Чувствительность двух диодов можно увидеть на графике ниже:
Когда вы будете готовы, чтобы получить ваши измерения в 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 — Цифровой датчик освещенности (модуль GY-2561)
datasheets_TSL2561.pdf
Arduino Code | TSL2561 Luminosity Sensor | Adafruit Learning System
TSL2560, TSL2561 Light-to-Digital Converter. TAOS059Q. 2009. November.


