BH1750 цифровой 16-битный датчик освещённости (люксметр), диапазон измерений: от 1 до 65535 люкс. Согласно datasheet, датчик BH1750 чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения, т.е. реагирует примерно на тот же спектральный диапазон, что и человеческий глаз.
В наше случае мы использует уже готовый модуль GY-302 со стабилизатором напряжения и удобными выводами подключения.
ПОДКЛЮЧЕНИЕ :
Подключение модуля производится по двухпроводному интерфейсу I2C, а питание осуществляется от +5 В. Интерфейс I2C в платах Arduino реализован на аналоговых пинах A4 и A5, которые отвечают за SDA (шина данных) и SCL (шина тактирования), соответственно. Вывод ADDR модуля GY-302 можно оставить не подключённым или соединить с землёй.
- VCC — питание 5 В;
- GND — земля;
- SDA — данные I2C(А4);
- SCL— синхронизация I2C(А5);
- ADDR — выбор адреса для протокола I2C. BH1750 может иметь, в зависимости от уровня сигнала на входе ADDR два адреса (0x23 и 0x5C). Это значит, что к одной плате Arduino можно подсоединить одновременно два датчика BH1750.
КОДИНГ :
Я использую библиотеку BH1750FVI которая поддерживает все режимы датчика BH1750, позволяет производить измерения освещенности с несколькими параметрами чувствительности (0.45 – 3.68) и разрешающей способности (0.5 – 4 lx), а также в режиме энергосбережения. Скачать можно с нашего сайта или с GitHub .
Загрузим примерочный скетч из библиотеки:
/***************************************************************************************************/ /* Example for ROHM BH1750FVI Ambient Light Sensor library written by : enjoyneering79 sourse code: https://github.com/enjoyneering/ Wide range: 1 - 65'535 lx (by default) Possible to detect: 0.11 - 100'000 lx by changing Sensitivity This sensor uses I2C bus to communicate, specials pins are required to interface Connect chip to pins: SDA SCL Uno, Mini, Pro: A4 A5 Mega2560, Due: 20 21 Leonardo: 2 3 ATtiny85: 0(5) 2/A1(7) (ATTinyCore - https://github.com/SpenceKonde/ATTinyCore & TinyWireM - https://github.com/SpenceKonde/TinyWireM) ESP8266 ESP-01: GPIO0/D5 GPIO2/D3 (ESP8266Core - https://github.com/esp8266/Arduino) NodeMCU 1.0: GPIO4/D2 GPIO5/D1 WeMos D1 Mini: GPIO4/D2 GPIO5/D1 BSD license, all text above must be included in any redistribution */ /***************************************************************************************************/ #include <Wire.h> #include <BH1750FVI.h> /* BH1750FVI(address, resolution, sensitivity) address: BH1750_DEFAULT_I2CADDR (when address pin LOW) BH1750_SECOND_I2CADDR (when address pin HIGH) resolution: BH1750_CONTINUOUS_HIGH_RES_MODE - Continuous measurement. Resolution - 1.0 lx. BH1750_CONTINUOUS_HIGH_RES_MODE_2 - Continuous measurement. Resolution - 0.5 lx. BH1750_CONTINUOUS_LOW_RES_MODE - Continuous measurement. Resolution - 4.0 lx. BH1750_ONE_TIME_HIGH_RES_MODE - One-time measurement(power down after). Resolution - 1.0 lx. BH1750_ONE_TIME_HIGH_RES_MODE_2 - One-time measurement(power down after). Resolution - 0.5 lx. BH1750_ONE_TIME_LOW_RES_MODE - One-time measurement(power down after). Resolution - 4.0 lx. sensitivity: NOTE: your value have to be between min. and max. 1.00 - default Sensitivity 0.45 - minimum Sensitivity 3.68 - maximum Sensitivity */ BH1750FVI myBH1750(BH1750_DEFAULT_I2CADDR, BH1750_CONTINUOUS_HIGH_RES_MODE_2, 1.00); void setup() { Serial.begin(115200); Serial.flush(); while (myBH1750.begin() != true) { Serial.println(F("ROHM BH1750FVI ambient light sensor is not present")); delay(5000); } Serial.println(F("ROHM BH1750FVI ambient light sensor is present")); } void loop() { /* DEMO - 1 */ Serial.println(F("DEMO 1: Sensitivity - 1.0, Continuous High Res II Mode")); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-0.5 lx")); Serial.print(F("Power for 555nm wave: ")); Serial.print(myBH1750.readLightLevel()/683); Serial.println(F(" Watt/m^2")); myBH1750.reset(); /* DEMO - 2 */ Serial.println(F("DEMO 2: Sensitivity - 2.00, Continuous High Res II Mode")); myBH1750.setSensitivity(2); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-0.5 lx")); /* DEMO - 3 */ Serial.println(F("DEMO 3: Sensitivity - 0.50, Continuous High Res II Mode")); myBH1750.setSensitivity(0.5); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-0.5 lx")); /* DEMO - 4 */ Serial.println(F("DEMO 4: Sensitivity - 3.68, Power Down High Res Mode")); myBH1750.setSensitivity(3.68); myBH1750.setResolution(BH1750_ONE_TIME_HIGH_RES_MODE); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-1.0 lx")); /* DEMO - 5 */ Serial.println(F("DEMO 5: Sensitivity - 0.45, Power Down High Res II Mode")); myBH1750.setSensitivity(0.45); myBH1750.setResolution(BH1750_CONTINUOUS_HIGH_RES_MODE_2); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-0.5 lx")); /* DEMO - 6 */ Serial.println(F("DEMO 6: Sensitivity - 1.00, Power Down High Res II Mode")); myBH1750.setSensitivity(1); myBH1750.setResolution(BH1750_ONE_TIME_HIGH_RES_MODE_2); Serial.print(F("Light level.........: ")); Serial.print(myBH1750.readLightLevel()); Serial.println(F(" +-0.5 lx")); /* DEMO - 7 */ Serial.println(F("DEMO 7: Manual Power Down")); myBH1750.powerDown(); /* DEMO - END */ Serial.print(F("DEMO: Starts over again in 5 sec.")); delay(5000); /* back to lib. default resolution */ myBH1750.setResolution(BH1750_CONTINUOUS_HIGH_RES_MODE_2);
И под конец познавательная таблица :
Полнолуние в ясном небе | 0,27 |
В море на глубине ~50 м. | до 20 |
Очень пасмурный день | 100 |
Восход или закат в ясный день. | 400 |
Пасмурный день | 1000 |
Полдень в декабре — январе | 4-5 тысч. |
Ясный солнечный день (в тени) | 10-25 тысч |