Сегодня утром я не стал писать посты и тестировать лампочки, а занялся творчеством. Пару дней назад я «изобрёл» прибор, которого мне очень не хватало при тестировании ламп, и сегодня смог сделать его.
Прибор показывает изменение яркости в процентах по прошествии времени. Прежде всего он нужен мне в проекте 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, Алексей Надёжин
Автор: LampTest