Недавно я публиковал проект простой метеостанции с OLED-дисплеем на ESP8266 и датчике BME280.
Сегодня хочу опубликовать еще более простой проект: люксметр на ESP8266 и датчике освещенности MAX44009 производства калифорнийской компании Maxim Integrated.
Себестоимость используемых компонентов примерно $6, процесс сборки и запуска устройства займет не более 30 минут.
Содержание
Что нам понадобится
Для реализации описываемого в статье проекта понадобится:
- NodeMCU v3 или другая ESP8266-совместимая плата
- датчик MAX44009 (GY-49)
- макетная плата, провода
Датчик поставляется в комплекте с нераспаянными ножками. После покупки их потребуется подпаять самостоятельно.
Про люксы и уровень освещенности
Люкс (Лк) — единица измерения освещенности.
Освещенность — соотношение светового потока к площади поверхности, на которую падает свет.
Для того чтобы соотнести уровень освещенности в люксах с субъективным восприятием освещенности (тем, что мы привыкли видеть своими глазами) можно взглянуть на следующую таблицу:
А вот требования к освещенности жилых и рабочих помещений согласно СНиПам:
Недостаточное количество света плохо влияет на самочувствие человека. Быстрее устают глаза, снижается производительность труда, ухудшается настроение. Даже такое расстройство как «сезонная депрессия» непосредственно связано с недостаточным воздействием света на человеческий организм в северных широтах осенью и зимой.
Сборка схемы
Конструкция предельно простая. Используется ESP8266, датчик освещенности MAX44009, 4 провода.. и все.
Обратите внимание, что всего мест под ножки на модуле датчика 6, а подписано только 4. Если очень интересно, то предназначение неподписанных ножек можно посмотреть в даташите на MAX44009, но подпаивать их не нужно. Для использования датчика они не нужны.
Подключение MAX44009 к ESP8266:
3V — VIN
GND — GND
D1 — SCL
D2 — SDA
Примерно так схема будет смотреться вживую.
Скетч для MAX44009
Для работы с датчиком освещенности используется стандартная библиотека Wire.h и не требуется установки дополнительных библиотек.
Достаточно просто загрузить следующий скетч в ESP8266 через Arduino IDE:
#include<Wire.h>
#define Addr 0x4A
void setup()
{
Wire.begin();
// Initialise serial communication
Serial.begin(9600);
Wire.beginTransmission(Addr);
Wire.write(0x02);
Wire.write(0x40);
Wire.endTransmission();
delay(300);
}
void loop()
{
unsigned int data[2];
Wire.beginTransmission(Addr);
Wire.write(0x03);
Wire.endTransmission();
// Request 2 bytes of data
Wire.requestFrom(Addr, 2);
// Read 2 bytes of data luminance msb, luminance lsb
if (Wire.available() == 2)
{
data[0] = Wire.read();
data[1] = Wire.read();
}
// Convert the data to lux
int exponent = (data[0] & 0xF0) >> 4;
int mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F);
float luminance = pow(2, exponent) * mantissa * 0.045;
Serial.print("Ambient Light luminance :");
Serial.print(luminance);
Serial.println(" lux");
delay(500);
}
И можно проверить работоспособность устройства.
Данный скетч не предполагает вывод данных на дисплей или через веб-сервер, так что воспользуемся встроенным в Arduino IDE монитором порта («Инструменты» -> «Монитор порта», или сочетание клавиш Ctrl+Shift+M).
Вот такие результаты получились у меня:
Уровень освещенности на подоконнике в пасмурный день.
Люксметр лежит на столе под включенной на полную яркость Xiaomi Smart LED Desk Lamp.
Пасмурный день, послеобеденное время, включено верхнее освещение.
Пасмурный день, послеобеденное время, шторы открыты, верхнее освещение выключено.
Пасмурный день, послеобеденное время, шторы закрыты, верхнее освещение выключено.
P.S.: если вместо адекватного текста отображаются кракозябры, то в правом нижнем углу монитора порта нужно сменить скорость на 9600 бод.
Заключение
Вот так на основе ESP8266 и одного недорогого датчика можно собрать люксметр.
Я хочу превратить его в датчик уровня освещенности для «умного дома», поэтому не вижу смысла (для себя) настраивать вывод получаемых значений на дисплей или веб-страницу. Данные с датчиков планирую отправлять на сервер по MQTT, о чем со временем напишу отдельную статью.
Но если есть потребность, то можно подключить дисплей, взять кусок скетча от метеостанции и переделать его на вывод информации с MAX44009.
А как можно подключить 2 датчика освещенности GY-49 max44009 ? А0 я подключил к Vcc. Нужно два разных адреса указывать? 1001 010х и 1001 011 ? Как отразить эти адреса в скетче. И нужно ли корректировать библиотеку?
Затрудняюсь что-то ответить, и поэкспериментировать не могу, т.к. в наличии только один датчик сейчас.
Здравствуйте.
В этом модуле есть возможность настраивать частоту измерений. Для этого нужно на модуль подавать код, что бы он переключился в ручной режим. Как это можно настроить в вашем скетче?
Из даташита
BIT 7 = 0 — Default mode. The IC measures lux intensity only once every 800ms regardless of integration time.
BIT 7 = 1 — Continuous mode. The IC continuously measures lux intensity. That is, as soon as one reading is finished, a new one begins. If integration time is 6.25ms, readings are taken every 6.25ms.
Manual Configuration Mode
In automatic mode (MANUAL = 0), reading the contents of TIM[2:0] and CDR bits reflects the automatically generated values from an internal timing register and are read-only. In manual mode (MANUAL = 1), the contents of TIM[2:0] and CDR bits can be modified by the users through the I2C bus.
TIM[2:0] — это биты 2, 1, 0. Код 000 по дефолту время 800мс, код 001-400мс, код 010-200мс и т.д.
Здравствуйте.
А почему максимум 2913 lux ?
В упор под фонари/лампы ставил, везде один максимум.
2937,60 точнее
Добрый день!
Не подскажете, что изменить в программе, чтобы SDA подключить к D1, а SCL — к D2?
Спасибо.
Спасибо, Дмитрий. Подключил gy-49 к arduino mini, залил Ваш скетч, все сразу заработало. Модуль gy-49 запитал от 5-ти вольт, в модуле для этого все есть.