
Прибор показывает изменение яркости в процентах по прошествии времени. Прежде всего он нужен мне в проекте lamptest.ru для измерения минимального напряжения, при котором горят лампы, не снижая яркость более, чем на 10%. Помимо информации о минимальном напряжении, которая пригодится тем, кто живёт в местах с не очень качественным электропитанием, где напряжение в сети может существенно снижаться (например, в сельских районах), это поможет сделать выводы о типе драйвера и качестве ламп.
Ещё прибор пригодится для анализа снижения яркости ламп по мере прогрева.
В левом верхнем углу экрана показывается текущее значение освещённости в люксах, в левом нижнем углу — исходное значение освещённости. В правом верхнем — какой процент составляет первое число от второго. Кнопка Select устанавливает исходное значение освещённости равное текущему.
Дополнительно сделал индикацию пульсации, но она весьма приблизительна. Я использую цифровой датчик света TSL2561, у него минимальное время интеграции 13 мс, а длительность одного полупериода сетевого напряжения — 10 мс. Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум. Кнопкой Left можно сделать коррекцию внешнего освещения для расчёта пульсации, нажав её, когда исследуемая лампа выключена.
Вся конструкция состоит из трёх готовых модулей — Arduino UNO R3, LCD Keypad Shield, MH-2561 и и четырёх проводов.
<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)
aram_pakhchanian
23.02.2017 21:54if(!tsl.begin()) — тут не переменная, а вызов метода класса, возвращающий либо целое число, либо булевое значение (true/false).
(double)((l_max — l_min))*100/(double)l_max; — это приведение целых чисел (делимого и делителя) к числам с плавающей запятой с двойной точностью, это позволяет получить минимальную ошибку при делении. Его можно конвертировать в целое, вызвав функцию округления round() или floor(), смотря как надо. round() округляет как учили в школе, а floor() отбрасывает десятичную часть.
totuin
23.02.2017 23:18Ну раз с электричеством разбираешся, а с кодом сложно — то тебе точно сюда.
Кстати для люксометра (BH1750) там есть стандартный блок. Так же есть стандартный блок для измерителя цвета TCS230.AlexeyNadezhin
23.02.2017 23:31+1Неее, только не визуальное. По-моему это совсем для даунов.
totuin
23.02.2017 23:42Ну не знаю как насчёт даунов…
Термостат газового котла с управлением по CMC
Автозапуск двигателя по звонку
Система управления самогонным аппаратом
Круиз контроль для автомобиля.
Авто GSM сигнализация к иммобилайзеру.
Метеостанция и GSM сигнализация для загородного дома.
Дальномер+уровень+угломер+лазерная разметка.
Блок управления спиртовой ректификационной колонной.
…
…
Это лишь часть того что сделали дауны которые ни в зуб ногой в С, только с помощью даунской программы.
Ну а на Вашу задачу этим даунам от 5 минут до часа.
tersuren
24.02.2017 17:07-1Блок управления спиртовой ректификационной колонной. Ха. Это ж самогонный аппарат!
AllexIn
23.02.2017 23:55+3Это не для даунов. Скорее для людей не склонных к программированию.
Если с текстом получается, то в визуал лучше не лезть — в общем случае визуальный код хуже текстового.
radiolok
23.02.2017 23:58+4Программисты ПЛК с недоумением смотрят на данный комментарий.
Другое дело, что голова должна уметь в релейно-контакторные схемы и лестничные диаграммы.
proton17
23.02.2017 23:45+1Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум.
У TSL в даташите пишут про "Automatically Rejects 50/60-Hz Lighting Ripple" так что вряд ли им получится мерить пульсации лампочки. Более подробной информации по этой фиче не нашел к сожалению.
AlexeyNadezhin
24.02.2017 10:42Да, какая-то фигня получается. У лампочки со 100% пульсацией около 33%, у ламп вообще без пульсации 1-2%, но вот маленькую пульсацию ловит плохо.
totuin
23.02.2017 23:58+1Для измерения пульсаций можно добавить простой фоторезистор. Ведь не требуется измерять освещённость (этим занимается люксометр), а необходимо только измерять её изменение за определённый период времени.
То есть в течении например 500 мс в цикле читаем значение с аналогового выхода к которому подключён фоторезистор, определяем максимальное и минимальное значение за это время, и разница между ними в процентах как раз будет необходимая величина.AlexeyNadezhin
24.02.2017 00:01+1Да, я тоже думаю, что это будет проще и легче, только не фоторезистор (он медленный), а фотодиод.
totuin
24.02.2017 00:07Ну и для полного счастья подключаем часы реального времени, картридер, и гоним на флешку статистику с метками времени в csv файл.
После проведения замеров флешку в комп, и считай готовый отчёт в экселе (который кстати умеет строить графики по таблицам).
Получится готовый анализаторproton17
24.02.2017 00:31Тогда еще ИК датчик температуры и твердотельное реле, последним можно вкл/выкл лампочку и замерять время старта и время выхода на максимальную яркость, хотя это только для газоразрядных актуально.
aamonster
24.02.2017 10:56Тогда уж и выносной термодатчик добавить, чтобы сразу снимать и график нагревания лампы.
olartamonov
24.02.2017 11:46+2Ты замучаешься искать фотодиод с чувствительностью, соответствующей видимому диапазону.
Доступные BPW21R немного захватывают ИК, этого достаточно, чтобы привирать. У Hamamatsu Photonics есть модели с очень хорошей аппроксимацией чувствительности глаза, но они ни разу не доступные.Shadow_Runner
24.02.2017 13:52А фильтр поставить не поможет?
olartamonov
24.02.2017 14:04+1Отрезающий ИК? Можно попробовать, но точности хорошего оптодатчика колхозными методами вряд ли удастся достичь.
Vishay BPW21R: https://yadi.sk/i/iy2rB6eN3EW9uQ
Видно, что хотя максимум у него совпадает с максимом глаза, но хвосты сильно лезут и в ИК, и в УФ, на уровне 10-20 % от пика видимого диапазона.
Хотя для лампочек, пожалуй, он более-менее пригоден, особенно светодиодных.
Hamamatsu S7686: https://yadi.sk/i/X9njuuWj3EWAi4
Тут уже всё красиво, но когда я их последний раз заказывал — десятилетие тому назад примерно — с меня попросили для начала форму экспортного контроля, а потом в итоге так и не смогли привезти.
AlexeyNadezhin
24.02.2017 21:52А какая мне разница, если он нужен исключительно для измерения пульсации.
olartamonov
24.02.2017 21:54А у тебя инфракрасная компонента в пульсациях строго следует видимой?
Я изволю сильно в этом сомневаться.vvzvlad
24.02.2017 23:17А почему она может быть отличной от нее?
olartamonov
24.02.2017 23:27+1Начиная с тепловой компоненты (малосущественная при температурах в районе +100 °С, впрочем) до нелинейной зависимости компонент спектра светодиода от питающего тока.
Я BPW21R пользовался, и на замерах светимости ламп, и на тестировании мониторов. В обоих случаях линейность оставляла желать лучшего, если говорить мягко, при том, что у усилителя с линейностью особых проблем не было, он-то вполне себе тривиален.vvzvlad
24.02.2017 23:36нелинейной зависимости компонент спектра светодиода от питающего тока.
У ТС вроде же белые светодиоды в основном, а там люминофор и синие/уф кристаллы. Причем излучение самого кристалла наружу не выходит. Получается, что до изменения спектра кристалла при прогреве нам особого дела нет — спектр излучения люминофора меняться не должен, только интенсивность, если вдруг случается так, что при изменении спектрального состава излучения «голого» кристалла люминофор стал возбуждаться меньше/больше.
Хотя, там что-то может быть и хитрее, я так, с дивана свое мнение вставил.olartamonov
24.02.2017 23:41+1У люминофора хвост уходит в ИК.
Вряд ли там будет измеримое влияние, но априори полагаться на то, что уж «а чего там может быть-то» — неверно.
justicebest
25.02.2017 14:34Белых с УФ кристаллами нет в продаже, только фиолетовые в дорогих экземплярах.
Почему наружу не выходит, а как же синий пик на всех графиках?vvzvlad
25.02.2017 14:35А в дешевых что?
Пик зависит от типа кристалла? Мне казалось, это часть спектра люминофора.justicebest
25.02.2017 14:47В дешёвых синий кристалл. Зависит пик. Вот график светодиода с синим кристаллом:
А этот уже с фиолетовым:
Спектр люминофора это всё, что справа от синего/фиолетового пика.
Shpakov
01.03.2017 16:32Вспомнилось (сработал в памяти триггер на «фотодиод») — сразу после университета работал на заводе и принял участие в разработке прибора для измерения параметров фар автомобиля, в том числе и измерения частоты срабатывания поворотников. Все работало, но как выяснилось, прибор ловил пульсацию ламп освещения. Время поджимало и в Руководстве по эксплуатации опытной партии без затей записали требование: «выключить освещение на время проведения измерения» (поглядел бы я на того, кто на СТО будет бегать светом щелкать). К счастью, было немного времени после приемки комиссией и заказчик получил уже «допиленный» вариант.
andd3dfx
24.02.2017 00:29-1Почему нельзя купить нормальный калиброванный и сертифицированный люксметр и мерять им?
totuin
24.02.2017 00:34Ну во первых не спортивно)))) Смотрите какой здесь полёт мысли пошёл.
Ну и во вторых стоит такой сертифицированных люксометр будет наверное немало.
AlexeyNadezhin
24.02.2017 10:44+1У меня их много. Нормальных, калиброванных и всё такое. Но этот прибор НЕ является люксметром и НЕ нужен для измерения освещённости. Он измеряет изменение освещённости в процентах, чего ни один готовый прибор не умеет, а мне было нужно именно это.
Leerooooy
24.02.2017 10:16+1Главный вопрос — как и чем калибровали свой шедевр? А то он может и погоду на Марсе показывать с таким же успехом
AlexeyNadezhin
24.02.2017 10:45Его не нужно калибровать. Его задача — показывать изменение освещённости в процентах, всё остальное — вспомогательная информация.
olartamonov
24.02.2017 11:44И по спектральному отклику?
Ты хоть внутрь ардуиновской библиотеки смотрел, что там компенсация ИК-компоненты делается в каком-то соответствии с даташитом?AlexeyNadezhin
24.02.2017 21:54Это не имеет никакого значения. Мне нужны лишь проценты падения яркости. Спектральный отклик на них никак не влияет.
B0Z0NHIGGSA
27.02.2017 15:49У Алексея несколько поверхностное отношение к измерениям.
в обсуждении его обзора по мультиметру я написал: "… Ты претендуешь на объективность в своих публикациях. А такие мелочи могут свидетельствовать о поверхностном подходе к делу ;)"
В данном конкретном случае — калибровка будет доказательством того, что прибор корректно измеряет именно то, что должен измерять не реагируя на иные излучения. А уж удобство использования в виде разности\суммы\среднего — это функциональное дополнение.
Leerooooy
24.02.2017 14:03-1то есть ты правда веришь, что китайский датчик идеально линеен по своим параметрам? Даже очень хорошее оборудование имеет кучу поправок и ОС чтобы хотя бы+-1% «настоящих» добиться.
Зачем было вообще писать такую статью? Ведь единственно важного аспекта не то, что нет — просто автор про него не в курсе. Или это рассказ «ой как круто я какой-то левый скетч прикрутил»? Где хоть что-то интересное?olartamonov
24.02.2017 14:13то есть ты правда веришь, что китайский датчик идеально линеен по своим параметрам?
Не знал, что Техас уже в Китае.Leerooooy
24.02.2017 16:29хм… точно ams? Не копия? И их правда именно в Штатах штампуют, а не в ЮВА? Надо производителю это сообщить, а то он не знает об этом.
И как мне кажется говорить об оригинальности компонентов можно лишь купив их где нибудь на маузере или диджикее. Тут же я вижу китайский модуль и не более.olartamonov
24.02.2017 16:31А на черта их копировать? У них всё же достаточно сложная начинка, при сохранении совместимости особо не упростишь.
Когда китайцам надо дешёвый датчик — они делают какоё-нибудь своё угрёбище типа DHT22, которое врёт и глючит, зато за три копейки и паять несложно.Leerooooy
24.02.2017 16:42+1Вы видимо не представляете себе вообще производство в Китае. В пример, как-то заказывали партию ASIC, сделали пилотную партию 100 штук — все ок. Даем добро на старт первой партии 10000 штук, сделали — летим делать приемку, а они по ТТХ не соответствуют. Ок, если договор составляли не идиоты, то берем джекичанов за хобот и заставляем переделывать. Но 10к камней это около 150к$, китайцы не идиоты чтобы просто их выкинуть. Смотрят какой функционал у камня (у нас была программируемая версия TL494 скажем так) и начинают его продавать как 494 (оригинал), т.к. качество у них все же не гавно, но как ни крути проверить ТТХ себе позволить мелкие конторы и физики не могут вот и отгребают потом.
С датчиками и прочим точно такая же история. У нас был asic и это пол беды, а если это какие-то стандартные решения типа контроллеров, датчиков, микрух и прочего, то на рынок попадает огромное количество отбраковки.
Так, что пока железка не куплена у проверенного дистрибьютора остается лишь фантазировать о ее оригинальности и шикарности.
yokotoka
24.02.2017 21:55Так тут же в том и вопрос, что чувствительность прибора к изменениям может оказаться нелинейной. Т.е. он может показать 1% разницы там, где ее реально 50% и 80% там где реально 3%, в завися, например, от силы светового потока. Как с этим бороться, кроме как калибровкой.
AlexeyNadezhin
24.02.2017 21:56Сравнил с показанием дорогого профессионального поверенного прибора ТКА-ПКМ(09). Совпадает.
olartamonov
24.02.2017 11:40+1Я использую цифровой датчик света TSL2561, у него минимальное время интеграции 13 мс, а длительность одного полупериода сетевого напряжения — 10 мс. Я делаю 12 замеров подряд с надеждой, что какой-нибудь из них случайно попадёт на минимум яркости при пульсации, а какой-нибудь другой на максимум
Надежда довольно беспочвенная.
https://en.wikipedia.org/wiki/Integrating_ADC
Интегрирующий АЦП по определению не даёт мгновенного значения измеряемой величины, поэтому хоть сто двадцать раз измеряй — ты получишь среднее по больнице, а не минимум и максимум.
uterr
24.02.2017 12:03Есть характеристики линейности датчика?
Может оказаться, что «по приборам» изменение яркости 10%, а на самом деле 50%, или наоборот, у сенсора абсолютно точно есть линейные и нелинейные участкиolartamonov
24.02.2017 14:20https://yadi.sk/i/_0MJ_T4K3EWDQM
Линейность у него хорошая, если в ардуиновской библиотеке с пересчётом raw data в люксы не поэкономили чуток.
SergGUI
24.02.2017 21:57-2Желтый заголовок умиляет, шпалу тебе!
AlexeyNadezhin
24.02.2017 21:58Что в нём жёлтого? Прибора с таким функционалом не существовало в природе до вчерашнего утра. Я его придумал и сделал. Очень удобно теперь с ним.
Dimachill
01.03.2017 16:33Алексей привет, мы можем помогать с Arduino и даже какие то желёзки давать поюзать)
kiltum
Телеграмм kiltum, пиши. Ардуинка, Пимена, стм32 и куча других страшных слов. (double) означает всего лишь приведение типов. Что бы компилятор с устатку не выкинул дробную часть
AlexeyNadezhin
Спасибо!
Leerooooy
«ардуинка и куча других страшных слов» — это насколько же надо быть талантливым и альтернативно одаренным, чтобы ардуина казалась чем-то страшным?
klikalka
Ну слово-то страшное.
IvUyr
При том, что автор умеет в ассемблер БК-0010…