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

в 18:26, , рубрики: arduino, Блог компании LampTest, Люксметр, Прибор, метки:

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

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


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

Автор: LampTest

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js