Датчик освещённости BH1750 против фоторезистора: обзор и подключение
Задача: узнать, сколько вокруг света
Свет в самоделках измеряют постоянно: включить ночник, закрыть дверцу курятника, понять, что теплице хватит. Ходовых решения два — фоторезистор GL5528 и цифровой датчик BH1750 на шине I2C. Разница не в цене, а в том, что приходит на выход: «какое-то сопротивление» или готовые люксы, заявленные производителем. Разберём оба по паспортам и подключим к Arduino и ESP32.
Фоторезистор GL5528: дёшево, но без люксов
Фоторезистор — пластина сернистого кадмия, сопротивление которой падает при освещении. По datasheet серии GL55 (Senba) для типового GL5528: 8–20 кОм при 10 лк, 2–3,5 кОм при 100 лк, в темноте не меньше 1 МОм; спектральный пик 540 нм, время отклика 20 мс на нарастание и 30 мс на спад, рассеиваемая мощность 100 мВт, максимальное напряжение 150 В. Подключается делителем: резистор 10 кОм с фоторезистора на землю, средняя точка — на аналоговый вход.
Дальше начинаются проблемы:
- люксов на выходе нет. Разброс между экземплярами уже в два раза: у одного 9 кОм, у другого 19 при тех же 10 лк. Перевод в люксы — только индивидуальная калибровка по степенной зависимости (гамма 0,7);
- нелинейность: от сотен ом на ярком свету до мегаом в темноте, поэтому «отсчёт 512» сам по себе ничего не значит;
- инерция и гистерезис: после яркого света показания плывут секунды — мгновенные сравнения «было/стало» врут;
- температура: паспорт даёт лишь −30…+70 °C и оговаривает зависимость характеристик от истории освещения.
Для «день или ночь» этого обычно хватает. Как только нужны цифры — «ниже 200 лк», «постепенно темнеет» — начинается калибровка каждого экземпляра.
BH1750: люксы сразу из datasheet
BH1750FVI — цифровой датчик ROHM. Внутри фотодиод со спектральной чувствительностью, близкой к глазу человека (пик 560 нм), усилитель и 16-битный АЦП; результат отдаётся готовым числом по I2C. Ключевое из datasheet (BH1750FVI Technical Note, Rev.D):
- диапазон 1–65535 лк; с коррекцией времени интегрирования — от 0,11 до 100 000 лк;
- питание 2,4–3,6 В (абсолютный максимум 4,5 В), потребление 120 мкА, в power down 0,01 мкА;
- точность ±20 % (0,96–1,44 × фактической освещённости);
- режимы: 1 лк за 120 мс (макс 180), 0,5 лк за 120 мс, 4 лк за 16 мс (макс 24);
- подавление шума сети 50/60 Гц, ИК почти не влияет, шина до 400 кГц;
- два адреса: 0x23 при ADDR на земле, 0x5C при ADDR на питании.
Сводка по паспортам
| Параметр | BH1750FVI (ROHM) | GL5528 (Senba) |
|---|---|---|
| Выход | цифровой, I2C | сопротивление |
| Диапазон | 1–65535 лк, 16 бит | в лк не переводится без калибровки |
| Разрешение | 0,5 / 1 / 4 лк | зависит от АЦП и делителя |
| Время измерения | 120 мс (16 мс в L-режиме) | отклик 20/30 мс + гистерезис |
| Точность | ±20 % | разброс экземпляров ×2 |
| Питание | 2,4–3,6 В, 120 мкА | пассивный (100 мВт, до 150 В) |
| Пик чувствительности | 560 нм | 540 нм |
| Температура | −40…+85 °C | −30…+70 °C |
| Подключение | SCL/SDA, адрес 0x23/0x5C | делитель на вход АЦП |
Подключение к Arduino и ESP32
Берём готовый модуль (GY-302 и аналоги): на плате стоят стабилизатор и подтяжки, поэтому VIN вешается на 5 В у Arduino Uno/Nano или на 3V3 у ESP32. Провода одинаковые:
- Arduino Uno/Nano: SCL → A5, SDA → A4;
- ESP32: SCL → GPIO22, SDA → GPIO21;
- ADDR соединён с землёй → адрес 0x23; если переставить на питание — 0x5C.
Важно: 5 В идут на модуль, а не на микросхему — голый чип питается строго в пределах 2,4–3,6 В по datasheet.
Код: люксы одной функцией
Библиотека не обязательна — протокол укладывается в три команды:
#include <Wire.h>
const byte BH = 0x23; // ADDR на GND; на питании — 0x5C
void setup() {
Serial.begin(9600);
Wire.begin(); // ESP32: Wire.begin(21, 22);
Wire.beginTransmission(BH);
Wire.write(0x10); // 0x10 — непрерывно, H-разрешение (1 лк)
Wire.endTransmission();
}
void loop() {
delay(180); // паспортное время измерения, макс 180 мс
Wire.requestFrom(BH, 2); // запросить 2 байта результата
if (Wire.available() == 2) {
unsigned raw = (Wire.read() << 8) | Wire.read();
float lux = raw / 1.2; // поправка из datasheet
Serial.print(lux, 0);
Serial.println(" lx");
}
}
В непрерывном режиме датчик обновляет результат каждые 120 мс, код читает два байта и делит на 1,2 — заводская поправка из datasheet. Для разовых измерений вместо 0x10 шлют 0x20 (One Time): после замера датчик сам уходит в power down на 0,01 мкА.
Частые ошибки
- Сканер I2C не видит датчик. Проверьте, что сканер показывает 0x23 или 0x5C; если оба молчат — обрыв SDA/SCL либо питание: по datasheet после подачи питания линия сброса должна пройти низкий уровень, поэтому дайте модулю секунду до первой команды.
- 5 В на голую микросхему. Рабочий диапазон 2,4–3,6 В, максимум 4,5 В. Модуль GY-302 спасает только потому, что на нём стоит стабилизатор.
- Показания завышены в 1,2 раза — забыли поделить сырой отсчёт на 1,2.
- Мусор на входе АЦП с фоторезистором. Слишком большое нижнее плечо делителя: вход подтекает ток, и при мегаомных значениях в темноте показания плавают. Берите 10 кОм.
- Калибровка «навсегда». Разброс между экземплярами в два раза плюс гистерезис — калибровка привязана к конкретному фоторезистору; замена детали её сбрасывает.
- Формула «люксы из интернета» для фоторезистора верна только для конкретного экземпляра при конкретной температуре.
Что выбрать
«День/ночь», подсветка, дверца курятника — хватает фоторезистора, если заранее ясно, что точность не нужна. Всё, где нужны числа — контроль света в теплице, логгер, ночник с порогом — BH1750: он дороже одного фоторезистора, но дешевле своей калибровки.
По шине I2C у нас уже есть разбор OLED-дисплея SSD1306, а история «аналог против цифрового» заканчивалась так же у датчика влажности почвы.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.