В этом уроке мы научимся сравнивать яркость различных ламп (по сравнению с мощностями ламп накала), а также определять наличие и коэффициент мерцания ламп.
Нам понадобится:
- Arduino х 1шт.
- Датчик освещённости GY-30 на базе чипа BH1750 х 1шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
- Trema Shield х 1шт.
- Trema-модуль i2C Hub х 1шт.
- Шлейф «мама-мама»для шины I2С х 3шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека BH1750 (для подключения датчика освещённости)
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплея LCD1602 по шине I2C)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki - Работа с символьными ЖК дисплеями.
Видео:
Схема подключения:
Подключение датчика освещённости и LCD дисплея, осуществляется к аппаратным выводам шины I2C. Вывод ADD датчика освещённости не задействуется.
Измерения:
- Показания освещенности (Люксы) актуальны на любом удалении от источника света. Чем дальше источник, тем меньше освещенность.
- Показания в Ваттах измеряются на расстоянии 1 метра от источника света и соответствуют значению мощности лампы накаливания, которой можно заменить измеряемую лампу, без потери светового потока.
- Показания коэффициента мерцания (в процентах) актуальны на любом удалении от источника света. Чем выше коэффициент мерцания, тем сильнее "заметно" мерцание лампы (сильнее её пульсации и ниже их частота). Наличие посторонних источников света снижают этот показатель.
- Показания на LCD дисплее обновляются каждые пол секунды.
С этим прибором Вы сможете выбрать качественную лампу (с наименьшим, или отсутствующим коэффициентом мерцания), а производитель не сможет Вас запутать наличием разных сеток мощностей для разных типов ламп.
Код программы:
// Подключаем библиотеки: #include <Wire.h> // подключаем библиотеку для работы с шиной I2C (для LCD дисплея) #include <BH1750.h> // подключаем библиотеку для работы с цифровым датчиком освещенности #include <LiquidCrystal_I2C.h> // подключаем библиотеку для работы с LCD дисплеем // Объявляем переменные и константы: LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) BH1750 sensor; // объявляем переменную для работы с цифровым датчиком освещенности uint16_t LUM_CUR, LUM_MIN, LUM_MAX; // объявляем переменные показаний датчика в Люксах, за время измерений 0,5 секунд (текущее, минимальное и максимальное) uint8_t LUM_W, LUM_BLINC; // объявляем переменные рассчитываемых показаний (мощность лампы накаливания и коэффициент мерцания) uint32_t SEC_START = 0; // количество микросекунд на начало измерений void setup(){ sensor.begin(BH1750_CONTINUOUS_LOW_RES_MODE); // инициируем датчик на измерение силы света с точностью 4 Lx и периодом измерений 16мс lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(F("iArduino.ru")); // выводим текст "iArduino.ru" delay(2000); // ждём 2 секунды } void loop(){ LUM_MAX = 0; // устанавливаем минимальное для максимального значения LUM_MIN = 65535; // устанавливаем максимальное для минимального значения LUM_W = 5; // устанавливаем минимальное значение освещенности в Вт SEC_START = micros(); // сохраняем количество микросекунд в момент старта функции while(SEC_START>(micros()-500000)&&SEC_START<micros()){ // если прошло меньше 0,5 сек и не произошло переполнение micros(), то ... LUM_CUR = sensor.readLightLevel(); // считываем показания с датчика освещенности if(LUM_MIN>LUM_CUR){LUM_MIN=LUM_CUR;} // обновляем минимальное значение if(LUM_MAX<LUM_CUR){LUM_MAX=LUM_CUR;} // обновляем максимальное значение delay(5); // ждём 5 мс (датчик не сможет обновить показания регистра данных быстрее) } //Переводим люксы в Ватты (на расстоянии 1м от объекта освещения) if(LUM_MAX >1800){LUM_W=200;}else if(LUM_MAX >1340){LUM_W=150;}else if(LUM_MAX >935){LUM_W=100;}else if(LUM_MAX >710){LUM_W=75;}else if(LUM_MAX >415){LUM_W=60;}else if(LUM_MAX >220){LUM_W=40;}else if(LUM_MAX >120){LUM_W=25;}else if(LUM_MAX >50){LUM_W=15;}else if(LUM_MAX >20){LUM_W=10;} //Определяем коэффициент мерцания LUM_BLINC = map(LUM_MIN, 0, LUM_MAX, 100, 0); if(LUM_BLINC>0 && LUM_BLINC<30){LUM_BLINC--;}else if(LUM_BLINC<100 && LUM_BLINC>70){LUM_BLINC++;} //Стираем экран lcd.clear(); //Выводим показания датчика в Люксах lcd.setCursor(0, 0); lcd.print(LUM_MAX); lcd.print(F(" Lx ")); //Выводим показания датчика в Ваттах lcd.setCursor(9, 0); if(LUM_MAX>2500){lcd.print(F("> "));}else if(LUM_MAX<20){lcd.print(F("< "));}else{lcd.print(F("= "));} lcd.print(LUM_W); lcd.setCursor(15, 0); lcd.print(F("W")); //Выводим коэффициент мерцания lcd.setCursor(0, 1); lcd.print(F("Blinking = ")); lcd.print(LUM_BLINC); lcd.setCursor(15, 1); lcd.print(F("%")); }
Алгоритм работы программы:
Значение освещённости в Люксах читается из регистра данных датчика, по шине I2C, вызовом функции readLightLevel(). Датчик обновляет значение своего регистра данных, с периодом, зависящим от режима работы датчика. Режим работы устанавливается при инициализации датчика, передачей соответствующего параметра в функцию begin(). Список допустимых параметров описан в файле BH1750.h подключённой библиотеки. Так как нам важен коэффициент мерцания, то при инициализации чипа выбран режим BH1750_CONTINUOUS_LOW_RES_MODE с максимально допустимой частотой измерений освещённости.
Чтение данных из датчика происходит в цикле while(){...} который выполняется в течении 0,5 секунд. Из всех полученных значений определяются только два: максимальное и минимальное. Максимальное значение соответствует реальной освещённости, а разница между этими значениями соответствует коэффициенту мерцания:
- если минимальное значение равно максимальному, то коэффициент мерцания = 0%.
- если минимальное значение в два раза меньше максимального, то коэффициент мерцания = 50%
- если минимальное значение равно 0, то коэффициент мерцания = 100%
Так как на измерение освещённости (обновление регистра данных) датчик тратит до 16 мс, то чем выше частота мерцаний, тем меньше разница между полученными максимальным и минимальным значениями освещенности, тем меньше коэффициент мерцаний.
Обсуждение