Скидки, ограниченное предложение! Полный список акционных товаров

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

Необходимые детали
Видео уроки

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

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

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

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

Видео:


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

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

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

Измерения:

  • Показания освещенности (Люксы) актуальны на любом удалении от источника света. Чем дальше источник, тем меньше освещенность.
  • Показания в Ваттах измеряются на расстоянии 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 мс, то чем выше частота мерцаний, тем меньше разница между полученными максимальным и минимальным значениями освещенности, тем меньше коэффициент мерцаний.

Обсуждение

Присоединяйся

Другие уроки

На главную