Измеритель освещенности на Arduino своими руками

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

Но такие устройства стоят не так дешево, чтобы их мог купить каждый. Впрочем, всегда можно сделать измеритель освещенности своими руками на основе популярной платы 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.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/1016-izmeritel-osveschennosti-na-arduino-svoimi-rukami/images/izmeritel-osveschennosti-na-arduino-2.jpg

Для вывода данных подсоединим к Arduino (в данном случае Arduino Nano) небольшой OLED-дисплей с разрешением 128 x 64 (0.96 дюйма). Благодаря малым размерам платы Arduino Nano, дисплея и модуля GY-30 конечное устройство получается очень компактным и легким. В качестве источника питания можно использовать какой-нибудь небольшой аккумулятор (Li-ion или LiPo) с выходным напряжением 7.4 В. Схема подключения Arduino, модуля GY-30 и дисплея представлена ниже.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/1016-izmeritel-osveschennosti-na-arduino-svoimi-rukami/images/izmeritel-osveschennosti-na-arduino-1.jpg

Далее приведен код (скетч) для 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;

}