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.
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