Общие сведения:
Модуль Metro - Датчик освещённости - является цифровым датчиком определения освещённости в люксах, уровня близости препятствия и коэффициента пульсаций источника света в процентах. Для передачи данных используется шина I2C.
К одной шине I2C можно подключить более 100 модулей.
Модуль можно использовать в любых проектах где требуется датчик освещённости, например, в метеостанциях, в проектах умных домов (для открывания жалюзи или штор, включения освещения и т.д.), для наведения солнечных батарей на источник света, для создания роботов, для контроля освещённости при работе с фоторезистами и т.д. Модуль можно использовать для определения наличия и близости препятствий, что можно использовать в качестве сигнализации, бесконтактной кнопки, и т.д.
Видео:
Спецификация:
- Напряжение питания: 5 В (постоянного тока)
- Потребляемый ток: до 70 мА (во время измерений расстояния).
- Диапазон измерений освещённости: от 0 до 8191 лк.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
- Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
- Рабочая температура: от -40 до +85 °С.
- Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
- Вес: 4 г.
Подключение:
У модуля имеются две колодки выводов: IN (вход) - штыревой разъем и OUT (выход) гнездовой разъем. Все модули подключаются друг к другу соединяя выход предыдущего модуля со входом следующего, образуя состав из модулей Metro в котором первым «вагоном» является плата управления Metro Leonardo или Metro ESP.
Подключение к управляющей плате Metro Leonardo:

К плате Metro Leonardo можно подключить только датчики освещённости или чередовать их с другими модулями Metro в любой последовательности.
Подключение к управляющей плате Metro ESP:

К плате Metro ESP можно подключить только датчики освещённости или чередовать их с другими модулями Metro в любой последовательности.
Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.
Вместо платы управления Metro Leonardo или Metro ESP можно использовать платы Arduino или Piranha, у которых будут задействованы 2 вывода шины I2C (SCL и SDA), 2 вывода питания (5V и GND) и один вывод установки адреса ADR, по умолчанию используется вывод D12 (можно менять в скетче).
Питание:
Входное напряжение питания 5 В постоянного тока, подаётся на выводы 5V и GND модуля.
Модуль сохраняет работоспособность при снижении напряжения питания до 3,3 В.
Подробнее о модуле:
Модуль Metro - Датчик освещённости построен на базе датчика APDS-9930, микроконтроллера STM32F030F4 и снабжен собственный стабилизатором напряжения.
Модуль считывает значение с датчика и позволяет:
- Определить текущую освещённость в лк.
- Определить событие - освещённость изменилась на заданное значение.
- Задать значение при изменении освещённости на которое установится событие - освещённость изменилась
- Определить уровень близости препятствия.
- Определить коэффициент пульсаций источника света в процентах.
Специально для работы с модулями Metro нами разработана библиотека iarduino_Metro, одна библиотека для всех модулей линейки Metro. Библиотека сама определяет наличие и тип модулей на шине I2C, присваивает им адреса и создаёт массив объектов для работы с найденными модулями. Стоит отметить что пользователю даже не обязательно знать адреса присвоенные модулям, так как для обращения к любому модулю достаточно знать его номер по порядку от платы управления Metro Leonardo или Metro ESP.
- Количество элементов массива
Metro[0]
- объект для управления первым модулем (ближайшим к управляющей плате);Metro[1]
- объект для управления вторым модулем (следующим после первого);Metro[2]
- объект для управления третьим модулем (и т.д. до последнего модуля).
Metro
совпадает с количеством найденных модулей:Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Вывод показаний освещённости:
#include <Wire.h> // Подключаем библиотеку Wire. #include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro. // void setup(){ // iarduino_Metro_Start(); // Определяем подключённые модули. Serial.begin(9600); // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек. while(!Serial){;} // Ждём готовность к работе аппаратной шины UART. } // // void loop(){ // Serial.print( "Освещённость " ); // Serial.print( Metro[0].read( DSL_LUX ) ); // Выводим значение освещённости в лк. Serial.print( "лк.\r\n" ); // delay(1000); // Ждём 1 секунду. } //
Данный пример демонстрирует вывод показаний освещённости в монитор последовательного порта.
Вывод освещённости при её изменении на заданное значение:
#include <Wire.h> // Подключаем библиотеку Wire. #include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro. // void setup(){ // iarduino_Metro_Start(); // Определяем подключённые модули. Serial.begin(9600); // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек. while(!Serial){;} // Ждём готовность к работе аппаратной шины UART. Metro[0].set(100); // Задаём диапазон изменения освещённости в лк. } // // void loop(){ // if( Metro[0].read( DSL_CHANGED) ){ // Если освещённость изменилась на 100 лк, то ... Serial.print( Metro[0].read(DSL_LUX) ); // Выводим освещённость. Serial.print( "лк.\r\n" ); // } // } //
В данном примере показания освещённости выводится не постоянно, а только при изменении более чем на 100 лк с момента последнего вывода. Данный принцип можно использовать для экономии места при выводе данных в монитор, или в качестве сигнализации чрезмерного изменения данных.
Вывод уровня близости препятствия:
#include <Wire.h> // Подключаем библиотеку Wire. #include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro. // void setup(){ // iarduino_Metro_Start(); // Определяем подключённые модули. Serial.begin(9600); // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек. while(!Serial){;} // Ждём готовность к работе аппаратной шины UART. } // // void loop(){ // Serial.print( "Уровень близости " ); // Serial.print( Metro[0].read(DSL_DISTANCE)); // Выводим уровень близости препятствия. Serial.print( ".\r\n" ); // delay(1000); // Ждём 1 секунду. } //
Данный пример демонстрирует вывод уровня близости препятствий (от 0 до 10) в монитор последовательного порта. Чем ближе препятствие, тем выше значение.
Вывод коэффициента пульсаций источника света:
#include <Wire.h> // Подключаем библиотеку Wire. #include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro. // void setup(){ // iarduino_Metro_Start(); // Определяем подключённые модули. Serial.begin(9600); // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек. while(!Serial){;} // Ждём готовность к работе аппаратной шины UART. } // // void loop(){ // Serial.print( "Коэффициент пульсаций " ); // Serial.print(Metro[0].read(DSL_COEFFICIENT)); // Выводим коэффициент пульсаций источника света. Serial.print( "%.\r\n" ); // delay(1000); // Ждём 1 секунду. } //
Данный пример демонстрирует вывод коэффициента пульсаций источника света (0...100%) в монитор последовательного порта. Это значение показывает на сколько сильно мерцает свет.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_Metro для работы с датчиком освещённости, при работе с другими модулями те же функции могут иметь другое назначение.
Подключение библиотеки:
#include <Wire.h> // Подключаем библиотеку Wire. Для работы с Arduino, Piranha или Metro Leonardo, библиотеку Wire можно не подключать. #include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro.
После подключения библиотеки iarduino_Metro создавать объекты не требуется, вместо этого необходимо однократно вызвать функцию iarduino_Metro_Start();
в коде setup
. Эта функция обнаружит все модули Metro, назначит им адреса на шине I2C и создаст массив объектов Metro
, количество элементов которого будет совпадать с количеством найденных модулей Metro.
Определение подключённых модулей Metro:
iarduino_Metro_Start(); // В качестве аргумента функции можно указать вывод Arduino к которому подключен вход ADR модуля Metro (по умолчанию используется вывод D12).
Определение подключённых модулей Metro с возвращением их количества:
i = iarduino_Metro_Start(); // Определить все модули и записать их количество в переменную i.
После определения подключенных модулей станет доступен массив Metro
, каждый элемент которого является объектом подключенного модуля Metro и предназначен для управления им.
- Например, если к управляющей плате подключено 3 любых модуля Metro, то массив
Metro[0]
- объект для управления первым модулем (ближайшим к управляющей плате);Metro[1]
- объект для управления вторым модулем (следующим после первого);Metro[2]
- объект для управления третьим модулем (дальним от управляющей платы).
Metro
будет содержать 3 элемента:Сторонние модули ша шине I2C: На шине I2C могут присутствовать сторонние модули* (не принадлежащие линейке Metro) со своими библиотеками. Это не повлияет на корректность обнаружения модулей Metro, не приведёт к присвоению неуникального адреса модулю и не нарушит очерёдность следования элементов массива Metro.
* Кроме сторонних модулей с адресом 0x09.
Функция read();
- Назначение: Чтение освещённости.
- Синтаксис: Metro[ индекс ].read( [ПАРАМЕТР] );
- Параметры:
- DSL_LUX - Вернуть текущую освещённость в лк, от 0 до 8191.
- DSL_CHANGED - Вернуть true если освещённость изменилась, иначе вернуть false.
- DSL_DISTANCE - Вернуть уровень близости препятствия, от 0 до 10.
- DSL_COEFFICIENT - Вернуть коэффициент пульсаций источника света, от 0 до 100%.
- Возвращаемые значения: Зависят от параметра функции.
- Примечание:
- Считается что освещённость изменилась если с момента её последнего изменения она увеличилась или уменьшилась на значение указанное функцией set (по умолчанию 1°С).
- Препятствие определяется на расстоянии до 10 см (±2 см). Чем ближе препятствие, тем выше возвращаемое значение.
- Пример:
Serial.print ( "Освещённость: " ); Serial.print ( Metro[0].read(DSL_LUX) ); // Выводим текущую освещённость. Serial.println( " лк." );
Функция set();
- Назначение: Функция задаёт значение определяющее факт изменения освещённости.
- Синтаксис: Metro[ индекс ].set( ОСВЕЩЁННОСТЬ );
- Параметры:
- ОСВЕЩЁННОСТЬ - Целое количество лк (от 1 до 255) на которое должна увеличиться или уменьшиться текущая освещённость, чтоб функция read() с параметром DSL_CHANGED вернула true.
- Возвращаемые значения: Нет.
- Примечание:
- Если функцию set() не вызывать, то будет использовано значение по умолчанию: 100 лк.
- Пример:
Metro[0].set(50); // Задаём диапазон освещённости. if( Metro[0].read(DSL_CHANGED) ){ Serial.println("Освещённость изменилась на 50 лк"); }
Переменная address:
- Тип: uint8_t.
- Данные: Адрес модуля на шине I2C.
- Примечание: Адрес формируется и присваивается во время определения модулей функцией
iarduino_Metro_Start();
Не меняйте адрес, так как он используется библиотекой. - Пример чтения адреса модуля:
Serial.print ( "Адрес модуля на шине I2C = " ); Serial.println( Metro[0].address );
Переменная model:
- Тип: uint8_t.
- Данные: Идентификатор типа модуля.
- Примечание: Тип модуля считывается во время определения модулей функцией
iarduino_Metro_Start();
Не меняйте тип модуля, так как он используется библиотекой. - Пример определения типа модуля:
switch( Metro[0].model ){ case MOD_KEY: Serial.println( "кнопка" ); break; case MOD_RGB: Serial.println( "светодиод" ); break; case MOD_RES: Serial.println( "потенциометр" ); break; case MOD_BUZ: Serial.println( "звукоизлучатель" ); break; case MOD_DHT: Serial.println( "датчик влажности и температуры" ); break; case MOD_DSL: Serial.println( "датчик освещённости" ); break; case MOD_8X8: Serial.println( "светодиодная матрица 8х8" ); break; default: Serial.println( "неизвестный модуль" ); break; }
Переменная version:
- Тип: uint8_t.
- Данные: Версия прошивки модуля.
- Примечание: Версия прошивки считывается во время определения модулей функцией
iarduino_Metro_Start();
Изменение значения переменной не изменит версию модуля и не повлияет на работу модуля, и библиотеки. - Пример чтения версии прошивки модуля:
Serial.print ( "Версия прошивки модуля = " ); Serial.println( Metro[0].version );
Переменная size:
- Тип: uint8_t.
- Данные: Объем памяти ОЗУ в байтах, используемый библиотекой для данного модуля.
- Примечание: Библиотека создаёт массив объектов
Metro
с помощью функцииiarduino_Metro_Start();
в кодеsetup
(при старте скетча), значит и память ОЗУ для работы с модулями выделяется там же, а не во время компиляции скетча. Зная объем выделенной памяти можно определить объем свободной и рассчитать, какое количество модулей Metro ещё можно подключить. Изменение значения переменной не изменит объём выделенной памяти и не повлияет на работу модуля, и библиотеки. - Пример чтения объема памяти ОЗУ выделенного для работы с модулем:
Serial.print ( "Для работы данного модуля выделено " ); Serial.print ( Metro[0].size ); Serial.println( " байт памяти ОЗУ." );
Применение:
Модуль Metro - Датчик освещённости можно использовать в любых проектах где требуется люксметр, например, в метеостанциях, в проектах умных домов (для открывания жалюзи или штор, включения освещения и т.д.), для наведения солнечных батарей на источник света, для создания роботов, для контроля освещённости при работе с фоторезистами и т.д.
Обсуждение