Главная chevron_right Наши уроки chevron_right Arduino chevron_right Урок 23. Определяем параметры ламп: мощность, освещенность, мерцание

Урок 23. Определяем параметры ламп: мощность, освещенность, мерцание

Собираем прибор на Arduino и датчике BH1750 для измерения освещённости, эквивалентной мощности и коэффициента мерцания ламп. Результат выводится на LCD1602 по шине I2C

Видео-обложка запускается при наведении

В этом уроке мы научимся сравнивать яркость различных ламп (по сравнению с мощностями ламп накала), а также определять наличие и коэффициент мерцания ламп.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека /file/239.html BH1750 (для подключения датчика освещённости)
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплея LCD1602 по шине I2C)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki - Работа с символьными ЖК дисплеями.

Видео:

Схема подключения:

Подключение датчика освещённости и LCD дисплея, осуществляется к аппаратным выводам шины I2C. Вывод ADD датчика освещённости не задействуется.

Схема для определения параметров ламп собранная на Arduino Uno

Измерения:

  • Показания освещенности (Люксы) актуальны на любом удалении от источника света. Чем дальше источник, тем меньше освещенность.
  • Показания в Ваттах измеряются на расстоянии 1 метра от источника света и соответствуют значению мощности лампы накаливания, которой можно заменить измеряемую лампу, без потери светового потока.
  • Показания коэффициента мерцания (в процентах) актуальны на любом удалении от источника света. Чем выше коэффициент мерцания, тем сильнее "заметно" мерцание лампы (сильнее её пульсации и ниже их частота). Наличие посторонних источников света снижают этот показатель.
  • Показания на LCD дисплее обновляются каждые пол секунды.

С этим прибором Вы сможете выбрать качественную лампу (с наименьшим, или отсутствующим коэффициентом мерцания), а производитель не сможет Вас запутать наличием разных сеток мощностей для разных типов ламп.

Код программы:

Копировать123456789101112131415161718192021222324252627282930313233343536373839404142// Подключаем библиотеки: #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 мс, то чем выше частота мерцаний, тем меньше разница между полученными максимальным и минимальным значениями освещенности, тем меньше коэффициент мерцаний.

Ссылки:

Комплект для повторения проекта

Что понадобится

Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.

6 позиций
Все уроки Arduino