Содержание
- Обзор
- Технические характеристики модуля
- Подключение
- Пример использования
- Часто задаваемые вопросы FAQ
Измерение освещенности является важным параметром при создании приложений домашней автоматики и Интернета вещей. Освещенность измеряют в люксах (lx). Люкс равен освещённости поверхности площадью 1 м2 при световом потоке падающего на неё излучения, равном 1 лм. Самым распространенным датчиком измерения освещенности у любителей Arduino является фоторезистор аналоговый датчик, меняющий свое сопротивление в зависимости от интенсивности света, однако точность его невысока и значение от выдает не в люксах. В отличие от него, модуль GY302 на базе чипа BH1750 (рисунок 1), представляет собой высокоточный цифровой датчик интенсивности света, выдающий значение как раз в люксах.
Рисунок 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.
Рисунок 2. Выводы модуля GY-302
Разберемся с возможными адресами датчика BH1750. Есть два варианта подключения датчика BH1750 к шине I2C (рис. 3).Рисунок 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).Рисунок 4. Сканер I2C устройств
Как видим, модуль BH1750 может иметь, в зависимости от уровня сигнала на входе ADDR два адреса (0x23 и 0x5C). Это значит, что к одной плате Arduino можно подсоединить одновременно два датчика BH1750.Датчики и сенсоры для Arduino купить с доставкой по России можно в нашем магазине!
Пример использования
Рассмотрим пример подключения датчика BH1750 к плате Arduino и вывода показаний на экран дисплея Nokia 5110. Нам понадобятся следующие детали:- плата Arduino Uno
- датчик 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).Рисунок 6. Пример вывода данных с датчика BH1750 в последовательный порт Arduino при различных режимах измерения
Текущие значения освещенности будем выводить на дисплей Nokia 5110. Нам понадобятся Arduino библиотеки Adafruit_GFX и Adafruit_PCD8544. Данные с датчика BH1750 будем получать со следующими настройками:- чувствительность;
- точность 0.5 lx.
Листинг 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).Рисунок 7. Вывод данных с датчика BH1750 в монитор последовательного порта.
Часто задаваемые вопросы
1. Сканер I2C устройств не находит датчика BH1750 или нет данных с датчика- Проверьте правильность подключения датчика BH1750 к плате Arduino.
- Проверьте правильность подключения дисплея Nokia 5110 к плате Arduino.
.