Измеритель освещенности (люксметр, экспонометр, фотометр) представляет собой устройство для определения уровня и распределения освещённости, иными словам для измерения интенсивности света. В наши дни такие приборы уже не являются редкостью, и их можно приобрести в специализированных магазинах электроники.
Но такие устройства стоят не так дешево, чтобы их мог купить каждый. Впрочем, всегда можно сделать измеритель освещенности своими руками на основе популярной платы Arduino и цифрового датчика окружающего света BH1750FVI компании ROHM.
В Интернете можно найти несколько различных модулей с датчиком BH1750, и хорошим моментом является то, что все они почти одинаковы. Для этого проекта был использован модуль регистрации интенсивности света GY-30. Модуль, по сути, является компактной платой с BH1750FVI и со встроенным 16-разрядным АЦП, который может напрямую выводить цифровой сигнал, поэтому в данном случае нет необходимости в применении сложной математики. Этот модуль с интерфейсом I2C выводит данные непосредственно в люксах (lx). В дополнение к хорошо откалиброванному датчику освещенности на плате можно найти низковольтный регулятор и преобразователь логических уровней. Модуль может питаться от источника с напряжением от 3.3 до 5.0 В. GY-30 имеет пять контактов, в то время как нам нужны два для источника питания (VCC и GND) и два для интерфейса I2C (SCL и SDA). Дополнительный контакт (ADD) может использоваться для установки адреса I2C датчика. Болтающийся в воздухе или подключенный к GND, этот контакт установит адрес I2C в 0x23 (по умолчанию), а если он будет подключен к VCC, адрес станет 0x5C.
Для вывода данных подсоединим к Arduino (в данном случае Arduino Nano) небольшой OLED-дисплей с разрешением 128 x 64 (0.96 дюйма). Благодаря малым размерам платы Arduino Nano, дисплея и модуля GY-30 конечное устройство получается очень компактным и легким. В качестве источника питания можно использовать какой-нибудь небольшой аккумулятор (Li-ion или LiPo) с выходным напряжением 7.4 В. Схема подключения Arduino, модуля GY-30 и дисплея представлена ниже.
Далее приведен код (скетч) для Arduino, который позволяет реализовать измеритель интенсивности света. Эта программа довольно проста в понимании. Следует заметить, что для работы с OLED-дисплеем в данном случае используется библиотека «u8glib library». Адрес датчика BH1750 установлен в 0x23.
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
int BH17_add = 0x23; // I2C адрес датчика BH1750
byte buff[2];
void setup() {
Wire.begin();
BH750_Init(BH17_add);
delay(200);
}
void light() {
float valf = 0;
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 50);
if (BH1750_Read(BH17_add) == 2) {
valf = ((buff[0] << 8) | buff[1]) / 1.2;
if (valf < 0)u8g.print("> 65535");
else
u8g.setPrintPos(0, 30);
u8g.print("--------------");
u8g.setPrintPos(0, 40);
u8g.print("Light Meter");
u8g.setPrintPos(0, 60);
u8g.print((int)valf, DEC);
u8g.print(" LX/SI"); //
}
delay(100);
}
void loop() {
u8g.firstPage();
do {
light();
} while (u8g.nextPage());
}
void BH750_Init(int address) {
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}
byte BH1750_Read(int address) {
byte i = 0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while (Wire.available()) {
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
© digitrode.ru