Придумал и сделал прибор

Feb 23, 2017 22:00

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




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

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

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

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

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

[Скетч для Arduino]
Скетч для Arduino:

#include
#include
#include
#include

//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, Алексей Надёжин

Основная тема моего блога - техника в жизни человека. Я пишу обзоры, делюсь опытом, рассказываю о всяких интересных штуках. А ещё я делаю репортажи из интересных мест и рассказываю об интересных событиях.
Добавьте меня в друзья здесь. Запомните короткие адреса моего блога: Блог1.рф и Blog1rf.ru.

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

arduino, Электроника, lamptest

Previous post Next post
Up