Датчик интенсивности света GY-302 (BH1750)

Содержание:

  • Обзор
  • Технические характеристики модуля
  • Подключение
  • Пример использования
  • Часто задаваемые вопросы FAQ

Измерение освещенности  является важным параметром при создании приложений домашней автоматики и Интернета вещей. Освещенность измеряют в люксах (lx). Люкс равен освещённости поверхности площадью 1 м2 при световом потоке падающего на неё излучения, равном 1 лм. Самым распространенным датчиком измерения освещенности у любителей Arduino является фоторезистор аналоговый датчик, меняющий свое сопротивление в зависимости от интенсивности света, однако точность его невысока и значение от выдает не в люксах. В отличие от него, модуль GY302 на базе чипа BH1750 (рисунок 1), представляет собой высокоточный цифровой датчик интенсивности света, выдающий значение как раз в люксах.

Датчик интенсивности света GY-302

Рисунок 1. Модуль GY-302 на базе чипа BH1750


Технические характеристики GY-302 (BH1750)

  • Напряжение питания — 5 В;
  • Интерфейс: I2C;
  • Чип: BH1750FVI;
  • АЦП: 16 бит;
  • Точность: 1 люкс;
  • Чувствительность: 65536 градаций;
  • Калибровка: не требуется;
  • Размеры: 19 х 13 х 2 мм;
  • Вес: 5 г.

Подключение к Arduino

Модуль имеет 5 выводов (рис. 2):

  • VCC — питание 5 В;
  • GND — земля;
  • SDA — данные I2C;
  • SCL—  синхронизация I2C;
  • ADDR — выбор адреса для протокола I2C.
Выводы модуля GY-302

Рисунок 2. Выводы модуля GY-302

Разберемся с возможными адресами датчика BH1750. Есть два варианта подключения датчика BH1750 к шине I2C (рис. 3).

Подключение датчика BH1750 к Arduino

Рисунок 3. Подключение датчика BH1750 к Arduino

Для получения адресов загрузим на Arduino скетч из листинга 1 (сканирование устройств, которые подключены к плате Arduino по шине I2C).

Листинг 1

#include "Wire.h"
void setup() {
   Wire.begin();
   Serial.begin(9600);  // запуск последовательного порта
}

void loop() {
int devices;
byte err, add;

   Serial.println("Start scan I2C bus...");
   devices = 0;
   Serial.print("  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
   for(add = 0; addr<= 127; addr++ ) {
      if((addr% 0x10) == 0) {
         Serial.println();
         if(addr< 16)
         Serial.print('0');
         Serial.print(addr, 16);
         Serial.print(" ");
      }
   Wire.beginTransmission(addr);err = Wire.endTransmission();
   if (err == 0) {
      if (addr<16)
         Serial.print("0");
      Serial.print(addr, HEX);
      devices++;
   }
   else {
      Serial.print("--");
   }
   Serial.print(" ");
   delay(1);  
   }
   Serial.println();
   if (nDevices == 0)
      Serial.println("No I2C devices found\n");

   delay(2500);
}

Скетч сканирует шину I2C и выводит в последовательный порт Arduino таблицу с адресами подключенных устройств (рисунок 4).

Сканер I2C устройств

Рисунок 4. Сканер I2C устройств

Как видим, модуль BH1750 может иметь, в зависимости от уровня сигнала на входе ADDR два адреса (0x23 и 0x5C). Это значит, что к одной плате Arduino можно подсоединить одновременно два датчика BH1750.


Пример использования

Рассмотрим пример подключения датчика BH1750 к плате Arduino и вывода показаний на экран дисплея Nokia 5110.

Нам понадобятся следующие детали:

Соберем схему соединений согласно рис. 5.

Схема подсоединения к Arduino датчика BH1750 и дисплея Nokia 5110

Рисунок 5. Схема подсоединения к Arduino датчика BH1750 и дисплея Nokia 5110

Для работы с Arduino написано несколько  библиотек. Будем использовать одну из них – BH1750FVI (https://github.com/enjoyneering/BH1750FVI). Данная библиотека поддерживает все режимы датчика BH1750, позволяет производить измерения освещенности с несколькими параметрами чувствительности (0.45 – 3.68) и разрешающей способности (0.5 – 4 lx), а также в режиме энергосбережения. К библиотеке прилагается пример (BH1750FVI_Demo) вывода в последовательный порт Arduino данных с датчика BH1750 при различных режимах измерения (см. рис. 6).

Пример вывода данных с датчика BH1750 в последовательный порт Arduino при различных режимах измерения

Рисунок 6. Пример вывода данных с датчика BH1750 в последовательный порт Arduino при различных режимах измерения

Текущие значения освещенности будем выводить на дисплей Nokia 5110. Нам понадобятся Arduino библиотеки Adafruit_GFX и Adafruit_PCD8544. Данные с датчика BH1750 будем получать со следующими настройками:

  • чувствительность;
  • точность 0.5 lx.

Периодичность измерения 5 секунд.

Создадим в Arduino IDE новый скетч, занесем в него код из листинга 2 и загрузим скетч на на плату Arduino.

Листинг 2

// подключение библиотек для nokia 5110
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// подключение библиотеки Wire (для I2C)
#include <Wire.h>
// подключение библиотеки для bh1750
#include <BH1750FVI.h>

// Nokia 5110
// pin 13 - SCLK
// pin 12 - DIN
// pin 11 - D/C
// pin 10 - CS
// pin 8 - RST
Adafruit_PCD8544 Nokia5110 = Adafruit_PCD8544(13, 12, 11, 10, 8);
// bh1750
BH1750FVI myBH1750;
// для периода опроса датчика
unsigned long millis1=0;

void setup()
{
   // запуск последовательного порта
   Serial.begin(9600);
   // инициализация дисплея
   Nokia5110.begin();
   // установить контраст фона экрана
   Nokia5110.setContrast(60);
   Nokia5110.clearDisplay();
   Nokia5110.setTextSize(1);
   Nokia5110.setTextColor(BLACK);
   // начальный экран
   Nokia5110.setCursor(10,5);
   Nokia5110.print("makerplus.ru");
   Nokia5110.setCursor(30,15);
   Nokia5110.print("BH1750");
   Nokia5110.display();
   // запуск bh1750
   myBH1750.begin();
   // пауза для заставки
   delay(2000);
}

void loop() {
   // раз в 5 секунд
   if(millis()-millis1>=5000) {
      Serial.println(F("Sensitivity - 1.0, Continuous Mode (default settings)"));
      myBH1750.setSensitivity(1);
      Serial.print(F("Light level: "));
      Serial.print(myBH1750.readLightLevel());
      Serial.println(F(" +-0.5 lx"));
      Serial.println(F(""));
      // вывод на дисплей
      Nokia5110.clearDisplay();
      Nokia5110.setCursor(10,5);
      Nokia5110.print("makerplus.ru");
      Nokia5110.setCursor(15,15);
      Nokia5110.print("Light level: ");
      Nokia5110.setCursor(35,25);
      Nokia5110.print(myBH1750.readLightLevel());
      Nokia5110.setCursor(20,35);
      Nokia5110.print(" +-0.5 lx");
      Nokia5110.display();
      millis1=millis();
   }
}

Вывод данных в монитор последовательного порта Arduino (рис. 7).

Вывод данных с датчика BH1750 в монитор последовательного порта.

Рисунок 7. Вывод данных с датчика BH1750 в монитор последовательного порта.


Часто задаваемые вопросы

      1. Сканер I2C устройств не находит датчика BH1750 или нет данных с датчика

Проверьте правильность подключения датчика BH1750 к плате Arduino.

      2. Данные не выводятся на экран дисплея Nokia 5110

Проверьте правильность подключения дисплея Nokia 5110 к плате Arduino.

.