Датчик освещенности, люксметр, i2c (Metro-модуль)

Общие сведения:

Модуль Metro - Датчик освещённости - является цифровым датчиком определения освещённости в люксах. Для передачи данных используется шина I2C.

К одной шине I2C можно подключить более 100 модулей.

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

Видео:

Редактируется...

Спецификация:

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 15 мА.
  • Диапазон измерений освещённости: от 0 до 65535 лк.
  • Интерфейс: 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 - Датчик освещённости построен на базе датчика BH1750, микроконтроллера STM32F030F4 и снабжен собственный стабилизатором напряжения.

Модуль считывает значение с датчика и позволяет:

  • Определить текущую освещённость в лк.
  • Определить событие - освещённость изменилась на заданное значение.
  • Задать значение при изменении освещённости на которое установится событие - освещённость изменилась

Специально для работы с модулями Metro нами разработана библиотека iarduino_Metro, одна библиотека для всех модулей линейки Metro. Библиотека сама определяет наличие и тип модулей на шине I2C, присваивает им адреса и создаёт массив объектов для работы с найденными модулями. Стоит отметить что пользователю даже не обязательно знать адреса присвоенные модулям, так как для обращения к любому модулю достаточно знать его номер по порядку от платы управления Metro Leonardo или Metro ESP.

    Количество элементов массива Metro совпадает с количеством найденных модулей:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (и т.д. до последнего модуля).

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Вывод показаний освещённости:

#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 лк с момента последнего вывода. Данный принцип можно использовать для экономии места при выводе данных в монитор, или в качестве сигнализации чрезмерного изменения данных.

Описание функций библиотеки:

В данном разделе описаны функции библиотеки 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 будет содержать 3 элемента:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (дальним от управляющей платы).

Сторонние модули ша шине I2C: На шине I2C могут присутствовать сторонние модули* (не принадлежащие линейке Metro) со своими библиотеками. Это не повлияет на корректность обнаружения модулей Metro, не приведёт к присвоению неуникального адреса модулю и не нарушит очерёдность следования элементов массива Metro.
* Кроме сторонних модулей с адресом 0x09.

Функция read();

  • Назначение: Чтение освещённости.
  • Синтаксис: Metro[ индекс ].read( [ПАРАМЕТР] );
  • Параметры:
    • DSL_LUX - Вернуть текущую освещённость в лк, от 0 до 65535.
    • DSL_CHANGED - Вернуть true если освещённость изменилась, иначе вернуть false.
  • Возвращаемые значения: Зависят от параметра функции.
  • Примечание:
    • Считается что освещённость изменилась если с момента её последнего изменения она увеличилась или уменьшилась на значение указанное функцией set (по умолчанию 1°С).
  • Пример:
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 - Датчик освещённости можно использовать в любых проектах где требуется люксметр, например, в метеостанциях, в проектах умных домов (для открывания жалюзи или штор, включения освещения и т.д.), для наведения солнечных батарей на источник света, для создания роботов, для контроля освещённости при работе с фоторезистами и т.д.

Ссылки:

Обсуждение