Сегодня утром я не стал писать посты и тестировать лампочки, а занялся творчеством. Пару дней назад я «изобрёл» прибор, которого мне очень не хватало при тестировании ламп, и сегодня смог сделать его.


Прибор показывает изменение яркости в процентах по прошествии времени. Прежде всего он нужен мне в проекте lamptest.ru для измерения минимального напряжения, при котором горят лампы, не снижая яркость более, чем на 10%. Помимо информации о минимальном напряжении, которая пригодится тем, кто живёт в местах с не очень качественным электропитанием, где напряжение в сети может существенно снижаться (например, в сельских районах), это поможет сделать выводы о типе драйвера и качестве ламп.

Ещё прибор пригодится для анализа снижения яркости ламп по мере прогрева.

В левом верхнем углу экрана показывается текущее значение освещённости в люксах, в левом нижнем углу — исходное значение освещённости. В правом верхнем — какой процент составляет первое число от второго. Кнопка Select устанавливает исходное значение освещённости равное текущему.

Дополнительно сделал индикацию пульсации, но она весьма приблизительна. Я использую цифровой датчик света TSL2561, у него минимальное время интеграции 13 мс, а длительность одного полупериода сетевого напряжения — 10 мс. Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум. Кнопкой Left можно сделать коррекцию внешнего освещения для расчёта пульсации, нажав её, когда исследуемая лампа выключена.

Вся конструкция состоит из трёх готовых модулей — Arduino UNO R3, LCD Keypad Shield, MH-2561 и и четырёх проводов.

Скетч для Arduino
Скетч для Arduino:
<textarea rows="130" cols="110">
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
#include <LiquidCrystal.h>

//initialize LCD with the numbers of the interface pins
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int start;
int lm;
int procent;

//Переменные из люксметра от samopal.pro
#define MAX_UNITS 12 
uint16_t l_min=0,l_max=0,l=0,env=0;
int pulse = 0;
   
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

void configureSensor(void)
{
  tsl.setGain(TSL2561_GAIN_1X);      /* No gain ... use in bright light to avoid sensor saturation */
  // tsl.setGain(TSL2561_GAIN_16X);     /* 16x gain ... use in low light to boost sensitivity */
  // tsl.enableAutoRange(true);            /* Auto-gain ... switches automatically between 1x and 16x */
  
  /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);      /* fast but low resolution */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);  /* medium resolution and speed   */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);  /* 16-bit data but slowest conversions */

}

void setup(void) 

{
// set up the LCD's number of columns and rows:
      lcd.begin(16, 2);
  
  Serial.begin(9600);
  
  /* Initialise the sensor */
  if(!tsl.begin())
  {
    /* There was a problem detecting the TSL2561 ... check your connections */
    Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }

  /* Setup the sensor gain and integration time */
  configureSensor();

// Записываем исходное значение
   
  sensors_event_t event;
  tsl.getEvent(&event);
  start = event.light;
 
lcd.setCursor(0,1);
lcd.print(start);
}

void loop(void) 
{  
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); 
  /* Get a new sensor event */ 
  sensors_event_t event;
  tsl.getEvent(&event);
 
lm = event.light;

lcd.setCursor(0,0);
lcd.print(lm); lcd.print("  ");

procent = (event.light/start*100);

lcd.setCursor(10,0);
lcd.print(procent); lcd.print("%  ");

{
      int x;
      x = analogRead (0);
      
      if (x < 60) {
//        lcd.print ("Right ");
      }
      else if (x < 200) {
//        lcd.print ("Up    ");
      }
      else if (x < 400){
//        lcd.print ("Down  ");
      }
      else if (x < 600){
//        lcd.print ("Left  ");
env = event.light;
      }
      else if (x < 800){
start = lm;     
lcd.setCursor(0,1);
lcd.print(start);
lcd.print("    ");
      }
}

// Замер пульсации 
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);

l=event.light-env;
l_min = l;
l_max = l;
  
  for (int i = 0; i < MAX_UNITS; i = i + 1) {

   tsl.getEvent(&event);

l=event.light-env;   
if( l < l_min )l_min = l;
if( l > l_max )l_max = l;
}
      if( l_max != 0 )pulse = (double)((l_max - l_min))*100/(double)((l_max + l_min));
      else pulse = 0; 
   
lcd.setCursor(10,1);
lcd.print(pulse);
lcd.print("    ");
}


Честно говоря, не надеялся, что вот так за полдня у меня получится готовый работающий прибор. И это при том, что из языков программирования я когда-то знал только ассемблер БК0010 и многое делаю просто методом тыка.

В программе для Arduino я использовал фрагменты программ-примеров использования TSL2561, LCD Keypad Shield, а для расчёта пульсации кусочек из скетча люксметра с samopal.pro. Некоторые вещи работают, но я не понимаю, что они означают :)

Тем не менее прибор работает и очень значительно экономит время. С его помощью уже протестировал полсотни лампочек на минимальное напряжение и тип драйвера.

P.S. Буду очень благодарен, если кто-нибудь, хорошо знакомый с Arduino, будет готов иногда отвечать на мои вопросы в Telegram, Facebook или Вконтакте.

© 2017, Алексей Надёжин
Поделиться с друзьями
-->

Комментарии (66)


  1. kiltum
    23.02.2017 21:44
    +1

    Телеграмм kiltum, пиши. Ардуинка, Пимена, стм32 и куча других страшных слов. (double) означает всего лишь приведение типов. Что бы компилятор с устатку не выкинул дробную часть


    1. AlexeyNadezhin
      23.02.2017 21:49

      Спасибо!


    1. Leerooooy
      24.02.2017 10:14
      +2

      «ардуинка и куча других страшных слов» — это насколько же надо быть талантливым и альтернативно одаренным, чтобы ардуина казалась чем-то страшным?


      1. klikalka
        24.02.2017 10:18
        +3

        Ну слово-то страшное.


      1. IvUyr
        27.02.2017 13:17

        При том, что автор умеет в ассемблер БК-0010…


  1. aram_pakhchanian
    23.02.2017 21:54

    if(!tsl.begin()) — тут не переменная, а вызов метода класса, возвращающий либо целое число, либо булевое значение (true/false).

    (double)((l_max — l_min))*100/(double)l_max; — это приведение целых чисел (делимого и делителя) к числам с плавающей запятой с двойной точностью, это позволяет получить минимальную ошибку при делении. Его можно конвертировать в целое, вызвав функцию округления round() или floor(), смотря как надо. round() округляет как учили в школе, а floor() отбрасывает десятичную часть.


    1. AlexeyNadezhin
      23.02.2017 21:56

      Спасибо!


  1. totuin
    23.02.2017 23:18

    Ну раз с электричеством разбираешся, а с кодом сложно — то тебе точно сюда.
    Кстати для люксометра (BH1750) там есть стандартный блок. Так же есть стандартный блок для измерителя цвета TCS230.


    1. AlexeyNadezhin
      23.02.2017 23:31
      +1

      Неее, только не визуальное. По-моему это совсем для даунов.


      1. totuin
        23.02.2017 23:42

        1. tersuren
          24.02.2017 17:07
          -1

          Блок управления спиртовой ректификационной колонной. Ха. Это ж самогонный аппарат!


      1. AllexIn
        23.02.2017 23:55
        +3

        Это не для даунов. Скорее для людей не склонных к программированию.
        Если с текстом получается, то в визуал лучше не лезть — в общем случае визуальный код хуже текстового.


      1. radiolok
        23.02.2017 23:58
        +4

        Программисты ПЛК с недоумением смотрят на данный комментарий.
        Другое дело, что голова должна уметь в релейно-контакторные схемы и лестничные диаграммы.


      1. Haarolean
        24.02.2017 10:41
        +2

        Вы так всех программистов PLC назвали «даунами»?


        1. AlexeyNadezhin
          24.02.2017 10:41
          +2

          Нет конечно.Правда я не знаю, что такое PLC,


    1. Vanellope
      24.02.2017 21:51

      Интересная программа, но она только для ардуин? Не планируете возможность работы с незаардуинеными АВРками?


      1. totuin
        25.02.2017 05:14

        Планирую, но в будущем. Пока и ардуинок хватает. В сутках всего 24 часа, и рук всего две)))))


  1. proton17
    23.02.2017 23:45
    +1

    Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум.

    У TSL в даташите пишут про "Automatically Rejects 50/60-Hz Lighting Ripple" так что вряд ли им получится мерить пульсации лампочки. Более подробной информации по этой фиче не нашел к сожалению.


    1. AlexeyNadezhin
      24.02.2017 10:42

      Да, какая-то фигня получается. У лампочки со 100% пульсацией около 33%, у ламп вообще без пульсации 1-2%, но вот маленькую пульсацию ловит плохо.


  1. totuin
    23.02.2017 23:58
    +1

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


    1. AlexeyNadezhin
      24.02.2017 00:01
      +1

      Да, я тоже думаю, что это будет проще и легче, только не фоторезистор (он медленный), а фотодиод.


      1. totuin
        24.02.2017 00:02

        То же верно


      1. totuin
        24.02.2017 00:07

        Ну и для полного счастья подключаем часы реального времени, картридер, и гоним на флешку статистику с метками времени в csv файл.
        После проведения замеров флешку в комп, и считай готовый отчёт в экселе (который кстати умеет строить графики по таблицам).
        Получится готовый анализатор


        1. proton17
          24.02.2017 00:31

          Тогда еще ИК датчик температуры и твердотельное реле, последним можно вкл/выкл лампочку и замерять время старта и время выхода на максимальную яркость, хотя это только для газоразрядных актуально.


        1. xedas
          24.02.2017 01:18

          Не надо часы и кардридер. Arduino UNO умеет по USB данные на комп отправлять, а там и часы есть и всё что нужно.


          1. totuin
            24.02.2017 06:55

            Но с часами и ридером можно сделать автономное устройство. И не таскать с собой ноут


      1. aamonster
        24.02.2017 10:56

        Тогда уж и выносной термодатчик добавить, чтобы сразу снимать и график нагревания лампы.


      1. olartamonov
        24.02.2017 11:46
        +2

        Ты замучаешься искать фотодиод с чувствительностью, соответствующей видимому диапазону.

        Доступные BPW21R немного захватывают ИК, этого достаточно, чтобы привирать. У Hamamatsu Photonics есть модели с очень хорошей аппроксимацией чувствительности глаза, но они ни разу не доступные.


        1. Shadow_Runner
          24.02.2017 13:52

          А фильтр поставить не поможет?


          1. olartamonov
            24.02.2017 14:04
            +1

            Отрезающий ИК? Можно попробовать, но точности хорошего оптодатчика колхозными методами вряд ли удастся достичь.

            Vishay BPW21R: https://yadi.sk/i/iy2rB6eN3EW9uQ

            Видно, что хотя максимум у него совпадает с максимом глаза, но хвосты сильно лезут и в ИК, и в УФ, на уровне 10-20 % от пика видимого диапазона.

            Хотя для лампочек, пожалуй, он более-менее пригоден, особенно светодиодных.

            Hamamatsu S7686: https://yadi.sk/i/X9njuuWj3EWAi4

            Тут уже всё красиво, но когда я их последний раз заказывал — десятилетие тому назад примерно — с меня попросили для начала форму экспортного контроля, а потом в итоге так и не смогли привезти.


        1. AlexeyNadezhin
          24.02.2017 21:52

          А какая мне разница, если он нужен исключительно для измерения пульсации.


          1. olartamonov
            24.02.2017 21:54

            А у тебя инфракрасная компонента в пульсациях строго следует видимой?

            Я изволю сильно в этом сомневаться.


            1. vvzvlad
              24.02.2017 23:17

              А почему она может быть отличной от нее?


              1. olartamonov
                24.02.2017 23:27
                +1

                Начиная с тепловой компоненты (малосущественная при температурах в районе +100 °С, впрочем) до нелинейной зависимости компонент спектра светодиода от питающего тока.

                Я BPW21R пользовался, и на замерах светимости ламп, и на тестировании мониторов. В обоих случаях линейность оставляла желать лучшего, если говорить мягко, при том, что у усилителя с линейностью особых проблем не было, он-то вполне себе тривиален.


                1. vvzvlad
                  24.02.2017 23:36

                  нелинейной зависимости компонент спектра светодиода от питающего тока.

                  У ТС вроде же белые светодиоды в основном, а там люминофор и синие/уф кристаллы. Причем излучение самого кристалла наружу не выходит. Получается, что до изменения спектра кристалла при прогреве нам особого дела нет — спектр излучения люминофора меняться не должен, только интенсивность, если вдруг случается так, что при изменении спектрального состава излучения «голого» кристалла люминофор стал возбуждаться меньше/больше.
                  Хотя, там что-то может быть и хитрее, я так, с дивана свое мнение вставил.


                  1. olartamonov
                    24.02.2017 23:41
                    +1

                    У люминофора хвост уходит в ИК.

                    Вряд ли там будет измеримое влияние, но априори полагаться на то, что уж «а чего там может быть-то» — неверно.


                  1. justicebest
                    25.02.2017 14:34

                    Белых с УФ кристаллами нет в продаже, только фиолетовые в дорогих экземплярах.
                    Почему наружу не выходит, а как же синий пик на всех графиках?


                    1. vvzvlad
                      25.02.2017 14:35

                      А в дешевых что?
                      Пик зависит от типа кристалла? Мне казалось, это часть спектра люминофора.


                      1. justicebest
                        25.02.2017 14:47

                        В дешёвых синий кристалл. Зависит пик. Вот график светодиода с синим кристаллом: image
                        А этот уже с фиолетовым: image
                        Спектр люминофора это всё, что справа от синего/фиолетового пика.


      1. Shpakov
        01.03.2017 16:32

        Вспомнилось (сработал в памяти триггер на «фотодиод») — сразу после университета работал на заводе и принял участие в разработке прибора для измерения параметров фар автомобиля, в том числе и измерения частоты срабатывания поворотников. Все работало, но как выяснилось, прибор ловил пульсацию ламп освещения. Время поджимало и в Руководстве по эксплуатации опытной партии без затей записали требование: «выключить освещение на время проведения измерения» (поглядел бы я на того, кто на СТО будет бегать светом щелкать). К счастью, было немного времени после приемки комиссией и заказчик получил уже «допиленный» вариант.


  1. andd3dfx
    24.02.2017 00:29
    -1

    Почему нельзя купить нормальный калиброванный и сертифицированный люксметр и мерять им?


    1. totuin
      24.02.2017 00:34

      Ну во первых не спортивно)))) Смотрите какой здесь полёт мысли пошёл.
      Ну и во вторых стоит такой сертифицированных люксометр будет наверное немало.


      1. AlexeyNadezhin
        24.02.2017 10:44

        Нет, Вы тоже невнимательно прочитали.


    1. AlexeyNadezhin
      24.02.2017 10:44
      +1

      У меня их много. Нормальных, калиброванных и всё такое. Но этот прибор НЕ является люксметром и НЕ нужен для измерения освещённости. Он измеряет изменение освещённости в процентах, чего ни один готовый прибор не умеет, а мне было нужно именно это.


  1. Leerooooy
    24.02.2017 10:16
    +1

    Главный вопрос — как и чем калибровали свой шедевр? А то он может и погоду на Марсе показывать с таким же успехом


    1. AlexeyNadezhin
      24.02.2017 10:45

      Его не нужно калибровать. Его задача — показывать изменение освещённости в процентах, всё остальное — вспомогательная информация.


      1. olartamonov
        24.02.2017 11:44

        И по спектральному отклику?

        Ты хоть внутрь ардуиновской библиотеки смотрел, что там компенсация ИК-компоненты делается в каком-то соответствии с даташитом?


        1. AlexeyNadezhin
          24.02.2017 21:54

          Это не имеет никакого значения. Мне нужны лишь проценты падения яркости. Спектральный отклик на них никак не влияет.


          1. olartamonov
            24.02.2017 21:55
            +1

            Ага, конечно. Если лампочка не греется.


        1. B0Z0NHIGGSA
          27.02.2017 15:49

          У Алексея несколько поверхностное отношение к измерениям.
          в обсуждении его обзора по мультиметру я написал: "… Ты претендуешь на объективность в своих публикациях. А такие мелочи могут свидетельствовать о поверхностном подходе к делу ;)"

          В данном конкретном случае — калибровка будет доказательством того, что прибор корректно измеряет именно то, что должен измерять не реагируя на иные излучения. А уж удобство использования в виде разности\суммы\среднего — это функциональное дополнение.


      1. Leerooooy
        24.02.2017 14:03
        -1

        то есть ты правда веришь, что китайский датчик идеально линеен по своим параметрам? Даже очень хорошее оборудование имеет кучу поправок и ОС чтобы хотя бы+-1% «настоящих» добиться.

        Зачем было вообще писать такую статью? Ведь единственно важного аспекта не то, что нет — просто автор про него не в курсе. Или это рассказ «ой как круто я какой-то левый скетч прикрутил»? Где хоть что-то интересное?


        1. olartamonov
          24.02.2017 14:13

          то есть ты правда веришь, что китайский датчик идеально линеен по своим параметрам?


          Не знал, что Техас уже в Китае.


          1. Leerooooy
            24.02.2017 16:29

            хм… точно ams? Не копия? И их правда именно в Штатах штампуют, а не в ЮВА? Надо производителю это сообщить, а то он не знает об этом.
            И как мне кажется говорить об оригинальности компонентов можно лишь купив их где нибудь на маузере или диджикее. Тут же я вижу китайский модуль и не более.


            1. olartamonov
              24.02.2017 16:31

              А на черта их копировать? У них всё же достаточно сложная начинка, при сохранении совместимости особо не упростишь.

              Когда китайцам надо дешёвый датчик — они делают какоё-нибудь своё угрёбище типа DHT22, которое врёт и глючит, зато за три копейки и паять несложно.


              1. Leerooooy
                24.02.2017 16:42
                +1

                Вы видимо не представляете себе вообще производство в Китае. В пример, как-то заказывали партию ASIC, сделали пилотную партию 100 штук — все ок. Даем добро на старт первой партии 10000 штук, сделали — летим делать приемку, а они по ТТХ не соответствуют. Ок, если договор составляли не идиоты, то берем джекичанов за хобот и заставляем переделывать. Но 10к камней это около 150к$, китайцы не идиоты чтобы просто их выкинуть. Смотрят какой функционал у камня (у нас была программируемая версия TL494 скажем так) и начинают его продавать как 494 (оригинал), т.к. качество у них все же не гавно, но как ни крути проверить ТТХ себе позволить мелкие конторы и физики не могут вот и отгребают потом.
                С датчиками и прочим точно такая же история. У нас был asic и это пол беды, а если это какие-то стандартные решения типа контроллеров, датчиков, микрух и прочего, то на рынок попадает огромное количество отбраковки.
                Так, что пока железка не куплена у проверенного дистрибьютора остается лишь фантазировать о ее оригинальности и шикарности.


      1. yokotoka
        24.02.2017 21:55

        Так тут же в том и вопрос, что чувствительность прибора к изменениям может оказаться нелинейной. Т.е. он может показать 1% разницы там, где ее реально 50% и 80% там где реально 3%, в завися, например, от силы светового потока. Как с этим бороться, кроме как калибровкой.


        1. AlexeyNadezhin
          24.02.2017 21:56

          Сравнил с показанием дорогого профессионального поверенного прибора ТКА-ПКМ(09). Совпадает.


  1. olartamonov
    24.02.2017 11:40
    +1

    Я использую цифровой датчик света TSL2561, у него минимальное время интеграции 13 мс, а длительность одного полупериода сетевого напряжения — 10 мс. Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум


    Надежда довольно беспочвенная.

    https://en.wikipedia.org/wiki/Integrating_ADC

    Интегрирующий АЦП по определению не даёт мгновенного значения измеряемой величины, поэтому хоть сто двадцать раз измеряй — ты получишь среднее по больнице, а не минимум и максимум.


    1. AlexeyNadezhin
      24.02.2017 21:57

      Угу. Так и есть. Но тут пульсация скорее для развлечения.


  1. uterr
    24.02.2017 12:03

    Есть характеристики линейности датчика?
    Может оказаться, что «по приборам» изменение яркости 10%, а на самом деле 50%, или наоборот, у сенсора абсолютно точно есть линейные и нелинейные участки


    1. olartamonov
      24.02.2017 14:20

      https://yadi.sk/i/_0MJ_T4K3EWDQM

      Линейность у него хорошая, если в ардуиновской библиотеке с пересчётом raw data в люксы не поэкономили чуток.


      1. AlexeyNadezhin
        24.02.2017 21:59

        Сравнил показания с ТКА-ПКМ. Всё нормально.


  1. SergGUI
    24.02.2017 21:57
    -2

    Желтый заголовок умиляет, шпалу тебе!


    1. AlexeyNadezhin
      24.02.2017 21:58

      Что в нём жёлтого? Прибора с таким функционалом не существовало в природе до вчерашнего утра. Я его придумал и сделал. Очень удобно теперь с ним.


      1. Dimachill
        01.03.2017 16:33

        Алексей привет, мы можем помогать с Arduino и даже какие то желёзки давать поюзать)


        1. AlexeyNadezhin
          01.03.2017 16:33

          Спасибо! Пишу в личку.