Люксметр

karl2233
Offline
Зарегистрирован: 05.07.2015

запустился скетч из поста 96.

дисплей надо так подключать:

// pin 10 - Serial clock out (SCLK)

// pin 4 - Serial data out (DIN)

// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
но надписи на экране в режиме 1 и 2 лезут друг на друга а график рисует нормально.
все показания меняются как-то рывками, заторможенно.
sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

satman123 пишет:

Доброе время суток

получил моник решил проэкспериментировать

все сторонние тесты на ура

при заливке данно скетча при отключённом датчике эффект "0"

на какой версии программы ардуино вы сидите?

sav13 - где наша глобальная ошибка?

Та программа написана на 1.0.5

Сейчас портирую все на 1.6.5 + u8glib + поддержка разных сенсоров

 

karl2233
Offline
Зарегистрирован: 05.07.2015

поборол я наползание.

в авторском скетче, видимо, случайно пропущены строки установки курсора дисплея в меню экрана 1 и 3.

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

хорошо что есть откуда брать примеры, иначе этот скетч не запустить.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

О, здорово.

sav13, У меня к вам вопрос по датчикам TCS3200: насколько они калиброваны и что можно выжать из них?

Для своего проекта "Ардуино как Лего" сделал на их базе 2 датчика. Поставил защитную трубку вокруг датчика от засветки светодиодами и закрыл это все в коробочку с дырками под светодиоды и датчик. Сделал:

драйвер приема показаний на базе счетчика Т5 Меги2560 по прерываниям (1024мксек). Датчик выдает частотный сигнал в цветах - подсчет количества импульсов входа Т5 за время 1.024мсек. Посчитал обратную матрицу RGB по усредненным данным из даташит, воткнул её в драйвер. Далее согласно даташиту обнаружил примерно 15% "общую засветку" в ИК области и сделал обратное повышение контрастности на 12.5% (1/8). Далее, согласно даташиту высчитал зависимость частоты показаний "белого" от мощности излучения и пересчитал коэффициент в люксы .. всё это сделано с округлениями и точностью в 0.5% ..

Каково будет освещение белого листа 60вт лампой накаливания с расстояния 0.5м, для "калибровки" датчика с расстояния 5см от листа? Датчик направляем на лист, а не на лампу..

Вопрос: насколько этот датчик может использоваться как люксометр или RGB определитель цвета при таком подходе? Как вы считаете?

karl2233
Offline
Зарегистрирован: 05.07.2015

поборол я это дело =)

убрал прерывания всякие, оставил только кнопку MODE

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Arhat109-2 пишет:

Каково будет освещение белого листа 60вт лампой накаливания с расстояния 0.5м, для "калибровки" датчика с расстояния 5см от листа? Датчик направляем на лист, а не на лампу..

Вопрос: насколько этот датчик может использоваться как люксометр или RGB определитель цвета при таком подходе? Как вы считаете?

Я сравнивал с несколькими поверенными люксметрами
Показания датчиков очень сильно зависят от конструкции сенсора. (Площадь окна, есть линза Френеля или нет), обысловленные назначением приборов. Даже два поверенных прибора могут сильно разнится в показаниях, хотя в испытательной лаборатории дают одно и тоже.

По результатам TSL2561 и BH1750 (в том числе разные экземпляры) дают практически идентичные показатели в одинаковых конструкциях. С поверенными прибрами хорошо бьются при расеянном освещении без косых лучей. Это говорит о том, что сами датчики идут откалиброванными с завода.

При использовании в конкретных условиях (например уличный датчик освещенности)  требуется калибровка из-за положения и конструкции прибора целиком. В вашем случае защитный козырек сильно уменьшит освещенность по сравнению с поверенным приборам где сенсор в виде плоской или выпуклой линзы.

 

kussns
Offline
Зарегистрирован: 09.04.2016
убрал прерывания всякие, оставил только кнопку MODE

Поделитесь своим скетчем.

karl2233
Offline
Зарегистрирован: 05.07.2015

вот.

оставил только кнопку выбор режима. щас допиливаю туда ещё датчик на фоторезисторе(хз зачем, но пусть будет).

отображение будет в виде полоски с процентами.

// Библиотеки для работы с дисплеем 5110
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Библиотека работы с устройствами по I2C
#include <Wire.h> 
// Библиотека работы с TSL2561
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h> 
#define MAX_UNITS  84 
// pin 10  - Serial clock out (SCLK)
// pin 4  - Serial data out (DIN)
// pin 5  - Data/Command select (D/C)
// pin 6  - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(10, 4, 5, 6, 7);
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

int disp_interval      = 1000;
int regim = 1;
int flag = 0;
uint16_t l1=0,l2=0,l_min=0,l_max=0;
uint32_t l_avg = 0;
uint16_t u1    = 0;
double pulse   = 0;
uint16_t l_mas[MAX_UNITS];
uint16_t l_pos = 0;

/**
* Функция определения напряжения питания устройства
*/
static int vccRead(byte us =250) {
  ADMUX = 1<<REFS0; // опорное напряжение - Vcc
  ADMUX |= 0x0E;    // объект измерения - внутренний источник
                    // стабилизированного напряжения 1.1В
  delayMicroseconds(us);
 
  ADCSRA |= 1<<ADSC;         // запуск АЦ-преобразования
  while(ADCSRA & (1<<ADSC)); // и ожидание его завершения
  word x = ADC;
  return x ? (1100L * 1023) / x : -1;
}

/**
* Выдача на дисплей в режиме 1
*/
void DisplayMode1(){ 
   display.clearDisplay();
   display.setTextSize(2);
   display.setCursor(10,0);
   display.print(l1);
   display.setTextSize(1);
   display.println(" Lx");
   display.println("");
   display.println("");
   display.setCursor(5,25);
   display.print("Pulse:");
   display.print(pulse,1);
   display.println("%");
   display.setCursor(5,40);
   display.print("Bat: ");
   display.print(u1/1000);
   display.print(".");
   display.print((u1/100)%10);
   display.println("V");
   display.display(); 
} 

/**
* Выдача на дисплей в режиме 2 (график)
*/
void DisplayMode2(){ 
   display.clearDisplay();
   display.setTextSize(1);
   display.setCursor(0,0);
   display.print(l1);
   display.print(" Lx. ");
   display.print(pulse,1);
   display.println("%"); 
   uint16_t dl = l_max - l_min;
   display.drawLine(0, 45, 84, 45 , BLACK);
   display.drawLine(78, 43, 84, 45 , BLACK);
   display.drawLine(78, 47, 84, 45 , BLACK);
   for( int i=0; i<MAX_UNITS/3; i++){
      uint16_t y1 = 44-(l_max-l_mas[i])*28/dl;
      uint16_t y2 = 44-(l_max-l_mas[i+1])*28/dl;
      display.drawLine(i*3, y1, i*3+3, y2, BLACK);
   }  
   display.display();
} 

/**
* Выдача на экран в режиме 3 (максимальное качество)
*/
void DisplayMode3(){ 
   display.clearDisplay();
   display.setTextSize(2);
   display.setCursor(10,0);
   display.print(l1);
   display.setTextSize(1);
   display.println(" Lx");
   display.println("");
   display.setCursor(0,20);
   display.println("Max Quality");
   display.println("");
   display.setCursor(5,40);
   display.print("Bat: ");
   display.print(u1/1000);
   display.print(".");
   display.print((u1/100)%10);
   display.println(" V");
   display.display(); 
} 


/**
* Переключение режимов люксометра
*/
void SwitchMode(){
   switch(regim){
      case 1  :
         regim     = 2;
         disp_interval = 3000;
         DisplayMode2();
         tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
         break;
      case 2  :
         regim     = 3;
         disp_interval = 1000;
         DisplayMode3();
         tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);      
         break;
      case 3  :
         regim     = 1;
         disp_interval = 1000;
         DisplayMode1();
         tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
         break;
      default :
         regim = 1;  
   }

}
 
void setup()
{
  analogRead(0); // Порт для измерения напряжения питания по внутреннему источнику
  pinMode(3, INPUT);// Порт кнопки MODE 
  Wire.begin();
  tsl.begin();
  tsl.enableAutoRange(true); /* Auto-gain ... switches automatically between 1x and 16x */
  u1 = vccRead(100);
  display.begin();
  display.setContrast(65); 
}

void loop()
{
   
// Выдача картинки на дисплей в зависимости от режима
   if(digitalRead(3)==LOW&&flag==0){
      regim++;  
      flag=1;
   if(regim>3)//ограничим количество режимов
        {
          regim=1;
        }
   }
        if(digitalRead(3)==HIGH&&flag==1)//если кнопка НЕ нажата
     {
        flag=0;//обнуляем переменную "knopka"
     }

      u1 = vccRead(100);
      if(regim == 1)DisplayMode1();
      else if(regim == 2)DisplayMode2();
      else if(regim == 3)DisplayMode3();
   
   
// Опрос датчика освещенности 
   sensors_event_t event;
   tsl.getEvent(&event);
   l1 = event.light;
   if( l_pos == 0 ){
      l2 = l_avg / MAX_UNITS;
      if( l_max != 0 )pulse = (double)((l_max - l_min))*100/(double)l_max;
      else pulse = 0; 
      l_min = l1;
      l_max = l1;
      l_avg = 0;
   }
   l_mas[l_pos++] = l1;
   l_avg += l1;
   if( event.light < l_min )l_min = l1;
   if( event.light > l_max )l_max = l1;
   if( l_pos >= MAX_UNITS )l_pos = 0;
 }

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

karl2233 пишет:

вот.

оставил только кнопку выбор режима. щас допиливаю туда ещё датчик на фоторезисторе(хз зачем, но пусть будет).

Фоторезистор вещь бесполезная - большая инертность + непонятно как калибровать.

Лучше фотодиод для измерения пульсаций

karl2233
Offline
Зарегистрирован: 05.07.2015

это так.

но моих познаний в программировании на это не хватит.

а тут встретил скетч на фоторезисторе, красивенькая полоска с процентами, место на экрене есть =)

калибровать... ну например в яркий солнечный день это будет 100%, а дальше в уменьшающихся попугаях ))))

 

UPD. не, не получается у мну (((

там другая библиотека, а как их подружить - хз

вот код, мож кому пригодится

// LCD5110_Graph_Demo (C)2013 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program is a demo of most of the functions
// in the library.
//
// This program requires a Nokia 5110 LCD module.
//
// It is assumed that the LCD module is connected to
// the following pins:
//      SCK  - Pin 8
//      MOSI - Pin 9
//      DC   - Pin 10
//      RST  - Pin 11
//      CS   - Pin 12
//
#include <LCD5110_Graph.h>

LCD5110 myGLCD(8, 9, 10, 11, 12);

extern unsigned char SmallFont[];
extern unsigned char TinyFont[];

int LDRpin = 13;
char lightString [4];
String str; 

int lightIntensity = 0;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  randomSeed(analogRead(7));
}

void loop()
{
  myGLCD.clrScr();
  myGLCD.update();
  
  lightIntensity = analogRead(LDRpin);
  
  lightIntensity = map(lightIntensity, 1050, 20, 0, 100);

  str = String(lightIntensity)+"%";
  str.toCharArray(lightString,4);
  
  myGLCD.print("LIGHT METER",CENTER,0);
  myGLCD.print(lightString,CENTER,20); 
  
  printBar();
  fillBar(lightIntensity);
  
  myGLCD.update();  
  delay(100);
}

void printBar()
{  
  myGLCD.drawRect(2, 35, 81, 40);
  myGLCD.update(); 
}

void fillBar(int percent)
{
    percent = map(percent,0,100,2,81);     
    myGLCD.drawLine(2, 36, percent, 36);
    myGLCD.drawLine(2, 37, percent, 37);
    myGLCD.drawLine(2, 38, percent, 38);
    myGLCD.drawLine(2, 39, percent, 39);
}

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

В конце статьи добавил обновленный скетч v 2.1 и ссылки на используемые библиотеки

  1. Дисплей перевел на библиотеку u8glib
  2. Убрал режимы сна и экономии питания. Теперь питание должно включаться аппаратной кнопкой с фиксацией
  3. Первая кнопка вкл/выкл прошивку
  4. Вторая кнопка переключает режимы экрана
karl2233
Offline
Зарегистрирован: 05.07.2015

ооо! вот это дело! sav13, спасибо!

а нет ли мыслей прикрутить фоторезистор(фотодиод)? )) место на экране в режиме 1 и 3 есть пусть бы бегала б себе полосочка с процентами.

а схему можно? я про часть кнопки "ВКЛ-ВЫКЛ". а то не совсем понял  - кнопка с фиксацией, однако в скетче для неё есть код. 

может есть смысл сделать как в транзистортестере с питанием от лития?

и ещё вопрос -  изменения коснулись только того, что Вы упомянули? а то читал в блоге что собирались ещё чего-то изменять.

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

karl2233 пишет:

ооо! вот это дело! sav13, спасибо!

а нет ли мыслей прикрутить фоторезистор(фотодиод)? )) место на экране в режиме 1 и 3 есть пусть бы бегала б себе полосочка с процентами.

а схему можно? я про часть кнопки "ВКЛ-ВЫКЛ". а то не совсем понял  - кнопка с фиксацией, однако в скетче для неё есть код. 

может есть смысл сделать как в транзистортестере с питанием от лития?

и ещё вопрос -  изменения коснулись только того, что Вы упомянули? а то читал в блоге что собирались ещё чего-то изменять.

Схему можно на пальцах )))

Дисплей:

U8GLIB_PCD8544 u8g(10, 4, 6, 5, 7);  

CLK - pin10
DIN - Pin4
CE - Pin6
DC - Pin5
RST - Pin7

Питание дисплея напрямую к VCC (Было к Pin8)

Подсветка дисплея Pin9

Кнопка 1 (Подсветка) - Pin2

Кнопка 2 (Режим) - Pin3

Кнопка 3 с фиксацией в разрыв питания. В принципе, кнопку подсветки можно не делать, пусть всегда светит, когда включен.

Датчики I2C все к A4, A5 как обычно

Фотодиод я хочу в перспективе задействовать на измерение пульсаций. Но там нужно схему собирать - фотдиод + операционник. Сейчас эксперементирую с датчиком MAX44009 у которого мини мальный порог измерения 0.04 люкса, минимальное время измерения 6мс. Еще из интересного, что можно получать раздельные показания с ИК и оптического сенсора (также как и в TSL2561). В общем, перспектив много. Нужно только определтьбся, что нужно, что не нужно. Просто я использую эти сенсоры в параллельных проектах коммерческих.

 

karl2233
Offline
Зарегистрирован: 05.07.2015

ага, понял про кнопки, спасибо!

тогда добавлю в Ваш скетч вариант с кнопкой ВКЛ-ВЫКЛ без фиксации.

про фотодиод - не такая великая схема )))) код написать в разы труднее.

про "что нужно-не нужно"(вкл режим"фантазия"):

1. датчик на фотодиоде.

2. датчик на фоторезисторе - ну и что что он инерционный? зато калибровать просто - Солнце=100%, а дальше попугаи помогут =)

3. кнопку на ВКЛ-ВЫКЛ по типу транзистортестера - сложностей минимум, зато все кнопки одинаковые.

4. я б добавил стартовую страницу, где можно было б выбирать изображение на экране.

5. ну и добавил бы комментарий про калибровку фоторезистора(фотодиода) - это что б не программно, а что б в скетче.

 

 

 

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

karl2233 пишет:

ага, понял про кнопки, спасибо!

тогда добавлю в Ваш скетч вариант с кнопкой ВКЛ-ВЫКЛ без фиксации.

про фотодиод - не такая великая схема )))) код написать в разы труднее.

про "что нужно-не нужно"(вкл режим"фантазия"):

1. датчик на фотодиоде.

2. датчик на фоторезисторе - ну и что что он инерционный? зато калибровать просто - Солнце=100%, а дальше попугаи помогут =)

3. кнопку на ВКЛ-ВЫКЛ по типу транзистортестера - сложностей минимум, зато все кнопки одинаковые.

4. я б добавил стартовую страницу, где можно было б выбирать изображение на экране.

5. ну и добавил бы комментарий про калибровку фоторезистора(фотодиода) - это что б не программно, а что б в скетче.

С фотодиодами все не так просто - больше всего фотодиодов продается с максимумом в ИК диапозоне. Они используются для управления. Правильный измерительный диод стоит довольно дорого.

Изерение - солнце 100% не отражает сути. Солнце бывает очень разное, утром и вечером, зимой и летом, в дымке и т.д. Его тоже можно мерить в люксах, как и лампочки.

Все таки совершенно не вижу смысла в фоторезисторе с 10-битной АЦП ардуины, в то время, когда уже есть откалиброванный на заводе цифровой датчик 16-бит (TSL2561) или 22-бит (MAX44009)

В общем собираюсь следующую версию сделать примерно такой:

- Датчик MAX44009 в режиме максимальной точности.(0,045 - 188000 люкс). Сенсор выносной с линзой френеля от ИК сенсора

- Фотодиод для измерения пульсаций в том же сенсоре автоопределение процента и частоты пульсаций . В графике вообще не вижу смысла. На дополнительном экране можно добавить информацию раздельной освещенности с ИК и оптического диода сенсора MAX44009

- Соответсвенно, кнопка одна - вкл/выкл. Экран сделать миниатюрный 1602. На нем лучше все видно.

karl2233
Offline
Зарегистрирован: 05.07.2015

ну... солнце да, разное. я имел в виду что 100% = яркий свет, а всё остальное мерять относительно него.

про АЦП Ардуины понятно, тут без вопросов.

про кнопки - решили оставить один режим?

про миниатюрный индикатор... хозяин-барин но, как понимаю, можно будет простой 1602 прикрутить? хотя 5110 позволил бы визуализировать красиво даже [s]попугаев[/s] фоторезистор - полосочка с процентами убедит любого ))))

в любом случае, спасибо за труды!

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

karl2233 пишет:

ну... солнце да, разное. я имел в виду что 100% = яркий свет, а всё остальное мерять относительно него.

про АЦП Ардуины понятно, тут без вопросов.

про кнопки - решили оставить один режим?

про миниатюрный индикатор... хозяин-барин но, как понимаю, можно будет простой 1602 прикрутить? хотя 5110 позволил бы визуализировать красиво даже [s]попугаев[/s] фоторезистор - полосочка с процентами убедит любого ))))

в любом случае, спасибо за труды!

Давал попользоваться прибором раличным людям. График никому нафиг не нужен. Процент пульсации в очень редком случае. Поэтому и решил упростить управление для эргономики. Разве что на 12864 графику реализовать. Там хоть что-то внятное получится. На 5110 все жаловались - слепой дисплей.

Полосочка - она как раз совсем не информативная. Разве что ее к СНИПу привязать. Но для этого совсем не нужен фоторезистор, можно просто по формуле от освещенности с датчика длину ее расчитывать.

1602 полностью совместим с теми что на Али за копейки продаются

 

karl2233
Offline
Зарегистрирован: 05.07.2015

понятно. и с 1602 согласен с Вами - даж самый простой красиво смотрится. 

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

а график да, сумбурный хоть и симпатичный получился.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

karl2233 пишет:

понятно. и с 1602 согласен с Вами - даж самый простой красиво смотрится. 

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

а график да, сумбурный хоть и симпатичный получился.

А еще интересный прибор получится, если убрать все экраны, заменить Ардуину на ESP8266 и выводить показания на телефон/планшет по WiFi

karl2233
Offline
Зарегистрирован: 05.07.2015

)))))))))))))))))))) и отчёт сразу с рабочего места отправлять в надзирающий орган.

как по мне, это неоправданно усложнит и удорожит вполне себе народный прибор.

но Вам виднее.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

sav13 пишет:
Arhat109-2 пишет:
Каково будет освещение белого листа 60вт лампой накаливания с расстояния 0.5м, для "калибровки" датчика с расстояния 5см от листа? Датчик направляем на лист, а не на лампу..
Я сравнивал с несколькими поверенными люксметрами
Показания датчиков очень сильно зависят от конструкции сенсора. (Площадь окна, есть линза Френеля или нет), обысловленные назначением приборов. Даже два поверенных прибора могут сильно разнится в показаниях, хотя в испытательной лаборатории дают одно и тоже.

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

Чтобы условия можно было воспроизвести, предлагаю сделать так: берем обыкновенную лампу накаливания на 60вт, без абажуров и отражателей. Освещаем только ею (завесив шторки, ночью и т.п.) лист белой офисной бумаги типа "Снегурочка" (или другой) (отр. в 90-95% там часто нормировано) с расстояния в 50см. от центра листа и под углом к перпендикуляру градусов 45 (измерять удобно "на дому"). И измеряем освещенность этого листа вашим или поверенным прибором расположив его над центром листа сантиметрах 5 .. или сколько удобно. .. и получаем освещенность в люксах.

Её и хочется получить, и использовать далее как ориентир для поверки своего датчика. Мне просто понять насколько сильно я ошибся в пересчетных коэффициентах из даташита. Да и другим, у кого нет доступа к поверке - будет какая-никакая, а отправная точка.

Сможете? Спасибо.

satman123
Offline
Зарегистрирован: 11.02.2016

Здравствуйте, sav13!

А вы сможете на ЕСР8266 прицепить пачку световых датчиков прикрутить разных диапазонов (ML8511, TSL2561 и тд) с выводом на планшет/смарт?

medtexsnab(собака)bk.ru

satman123
Offline
Зарегистрирован: 11.02.2016

sav13! Благодарю!

Текущий скетчик прижился

буду дальше набираться опыта

karl2233
Offline
Зарегистрирован: 05.07.2015

з.ы. скетч из сообщещения №61  не "вгружается".

в чём там проблема - не стал копать, загрузил свой вариант из №60.

Yulik
Offline
Зарегистрирован: 27.02.2016

karl2233 пишет:

з.ы. скетч из сообщещения №61  не "вгружается".

 Скомпилировался без проблем.

Onkel
Offline
Зарегистрирован: 22.02.2016

art100 пишет:

 

 

нужно

вредный совет? Эта линза для ИК 10 мкм (длина волны теплового излучения), кроме того - это линза френеля, так что при перемещении источника освещения или вращения датчика  будут осцилляции  показаний.

Yulik
Offline
Зарегистрирован: 27.02.2016

  sav13

 Проверьте, пож-ста, схему:

  https://cloud.mail.ru/public/L35J/QZ2oZrHSX

Machomotofan
Offline
Зарегистрирован: 17.05.2016

 

 

// Библиотека работы с устройствами по I2C
#include <Wire.h> 
// Библиотека работы с TSL2561
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
#include <TimerOne.h>
#include "sav_button.h"

#include <PCF8812_new.h> 
#include "font_12x16_rus.h"
#include "font_5x8.h"
#include "font_16x24.h"
 
#define MAX_UNITS  63 

Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
SButton button1(16,100,3000,0,0);
int key_mode2           = 1;
uint16_t autooff=0;

void timerIsr()
{
    autooff++;
    if (autooff>18000) power_off();
   switch( button1.Loop()){
      case SB_LONG_CLICK :  
         power_off(); 
         break;
      case SB_CLICK : //Короткое нажатие
         autooff=0;
         if( key_mode2 == 1){  key_mode2 = 2; } else {  key_mode2 = 1; }
         break;

   }
}
/**
* Функция определения напряжения питания устройства
*/
static int vccRead(byte us =250) {
  ADMUX = 1<<REFS0; // опорное напряжение - Vcc
  ADMUX |= 0x0E;    // объект измерения - внутренний источник
                    // стабилизированного напряжения 1.1В
  delayMicroseconds(us);
  ADCSRA |= 1<<ADSC;         // запуск АЦ-преобразования
  while(ADCSRA & (1<<ADSC)); // и ожидание его завершения
  word x = ADC;
  return x ? (1100L * 1023) / x : -1;
}


uint16_t l1=0,l2=0,l_min=0,l_max=0;
uint16_t u1 = 0;
double pulse = 0;
uint16_t l_mas[MAX_UNITS];


/**
* Текстовый экран
*/
void DisplayMode1(){
   char s[20];
  LcdPageONE(); 
   do {
      sprintf(s,"%u",l1);
      LcdsetFont(font_12x16_rus);
      LcdGotoXY(0,0);
      LcdPrint(s , ON, 1); //u8g.drawStr( 0, 20, s);
      LcdsetFont(font_12x16_rus);
      LcdPrint( "lx" , ON, 1); 
      LcdsetFont(font_5x8);
      sprintf(s,"Pulse: %d.%d%c",(int)pulse,(int)(pulse*10)%10,'%'); 
      LcdGotoXY(0,30);
      LcdPrint(s , ON, 1);
      sprintf(s,"Bat: %d.%d V",u1/1000,u1%1000); 
      LcdGotoXY(0,39);
      LcdPrint(s , ON, 1);
      LcdGotoXY(0,48);
      LcdPrint("Sensor TSL2561" , ON, 1);
  }   while(LcdPageTWO());
} 
/**
* Графический экран
*/
void DisplayMode2(){ 
   char s[20];
  LcdPageONE(); 
   do {
      sprintf(s,"%u lx %d.%d%c",l1,(int)pulse,(int)(pulse*10)%10,'%');
      LcdsetFont(font_5x8);
      LcdGotoXY(0,7);
      LcdPrint(s , ON, 1);
      
      uint16_t dl = l_max - l_min;
      LcdLine(0, 61, 100, 61 ,ON);
      LcdLine(94, 59, 100, 61 ,ON );
      LcdLine(94, 63, 100, 61 , ON);
      for( int i=0; i<MAX_UNITS/3; i++){
         uint16_t y = 60-(l_max-l_mas[i])*28/dl;
        uint16_t  y2 = 60-(l_max-l_mas[i+1])*28/dl;
         LcdLine(i*3, y, i*3+3, y2, ON);
      }  
  }   while(LcdPageTWO());
} 

void power_off()
{ LcdPageONE(); 
   do {
 LcdsetFont(font_12x16_rus);
 LcdGotoXY(2,30);
 LcdPrint("Buy buy" , ON, 1);
   }   while(LcdPageTWO());
 delay(2000);
 digitalWrite(15,LOW);
 delay(20000);
}
 
void setup()
{
  LcdInit( 10, 11, 12, 13, 14);  //CS, RESET, D/C, CLK, DATA
   pinMode(15,OUTPUT); // Выход на питание дисплея
   digitalWrite(15,HIGH);
   button1.begin();
   Timer1.initialize(10000);  
   Timer1.attachInterrupt( timerIsr ); 
}

unsigned long ms1 = 0; 
void loop()
{
   unsigned long ms = millis();
// Опрос датчиков каждую секунду
   if( (ms < ms1 || (ms - ms1) > 500)){
      ms1 = ms;
      l1=0;l2=0;l_min=0;l_max=0;
      u1 = vccRead(100);
      uint32_t l_avg = 0;
      sensors_event_t event;
// Делаем MSX_UNITS измерений по 13мс      
      for( int i=0; i<MAX_UNITS; i++){
         tsl.getEvent(&event);
         l_avg += event.light;
         l_mas[i] = event.light;
         if( i == 0 ){
            l_min = event.light;
            l_max = event.light;
         }
         else {
            if( event.light < l_min )l_min = event.light;
            if( event.light > l_max )l_max = event.light;
         }
      } 
      l1 = l_avg / MAX_UNITS;
      if( l_max != 0 )pulse = (double)((l_max - l_min))*100/(double)l_max;
      else pulse = 0; 


     if( key_mode2 == 1)DisplayMode1();
     else DisplayMode2();
   }
 
}

----------------------------------

Спасибо за код ))

Повторил люксометр на  дисплее от siemens a70 

Управление и питание сделал на одной кнопке.

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

 

satman123
Offline
Зарегистрирован: 11.02.2016

Уважаемые коллеги!

Что я делаю не так, почему эти ошибки?

 

Arduino: 1.6.7 (Windows 7), Плата:"Arduino Pro or Pro Mini, ATmega328 (3.3V, 8 MHz)"

In file included from C:\...\A70\A70.ino:10:0:

C:\...\Documents\Arduino\libraries\PCF8812_NEW/font_12x16_rus.h:8:8: error: 'prog_uint8_t' does not name a type

static prog_uint8_t font_12x16_rus[] PROGMEM=

^
In file included from C:\...\A70\A70.ino:11:0:

C:\...\Documents\Arduino\libraries\PCF8812_NEW/font_5x8.h:8:8: error: 'prog_uint8_t' does not name a type

static prog_uint8_t font_5x8[] PROGMEM =

^
In file included from C:\...\A70\A70.ino:12:0:

C:\...\Documents\Arduino\libraries\PCF8812_NEW/font_16x24.h:8:8: error: 'prog_uint8_t' does not name a type

static prog_uint8_t font_16x24[] PROGMEM=

^
C:\...\A70\A70.ino: In function 'void DisplayMode1()':

A70:65: error: 'font_12x16_rus' was not declared in this scope

A70:70: error: 'font_5x8' was not declared in this scope

C:\...\A70\A70.ino: In function 'void DisplayMode2()':

A70:89: error: 'font_5x8' was not declared in this scope

C:\...\A70\A70.ino: In function 'void power_off()':

A70:108: error: 'font_12x16_rus' was not declared in this scope

Machomotofan
Offline
Зарегистрирован: 17.05.2016

satman123,

http://rgho.st/8spyZ44Qm    решение вашей поблемы ))    Подправленая библиотека.

grif66
Offline
Зарегистрирован: 28.04.2017

Удачный приборчик получился. Попробвал оба сенсора. Но для работы со светодиодным освещением хотелось бы с пульсациями поподробнее,  так сказать. Существующей точности от датчика TSL маловато. При частоте пульсаций драйвера или любой другой схемы питания светодиодов 100Гц (10мс) уже выходим за возможности датчика (13мс). Наткнулся на аналоговый датчик ТЕМТ6000 разработанный для видимого спектра. На нем можно было бы реализовать измерение пульсаций с бОльшей точностью?

Getcev
Offline
Зарегистрирован: 17.04.2017

 Господа, здравствуйте!

Вопрос понимаю не совсем по теме, но на других форумах никто внятно не ответил...(

Как датчик ВН1750 перевести в режим низкого разрешения ( 16мс )? В проекте который мы начали с сыном не нужна высокая точность измерения..., неоходима скорость ( так понимаю по умолчанию идет 1Лк/120мс , а это для меня много ибо импульс потока всего 100+-10мс ). зараннее благодарен!

grif66
Offline
Зарегистрирован: 28.04.2017

Что-то давно никаких новостей о люксметре. Как опыты с МАХ44009?

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

grif66 пишет:

Что-то давно никаких новостей о люксметре. Как опыты с МАХ44009?

Опыты прошли успешно.

Точность отличная, диапазон намного больше. Цены на Али все падают и падают.

Только пока в люксметре нет необходимости. Есть ряд стационарных датчиков.

grif66
Offline
Зарегистрирован: 28.04.2017

С диапазоном я уже тоже проверял, хороший датчик. А пробовали пульсации этим датчиком измерять? У него, судя по даташиту 6,25мс быстродействие, должно хватить для бытовых целей?

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

grif66 пишет:

С диапазоном я уже тоже проверял, хороший датчик. А пробовали пульсации этим датчиком измерять? У него, судя по даташиту 6,25мс быстродействие, должно хватить для бытовых целей?

Там все сложнее. Чем меньше время интеграции, тем хуже измеряемый диапазон. Нет автоматического переключения. А учшие результаты получаются на 800мс

Я забил на пульсации. Если нужно, можно их фототранзистором померить, подключенным к осциллографу. Или фотодиодом с усилителем

grif66
Offline
Зарегистрирован: 28.04.2017

Ну вот я тоже начал пытать ТЕМРТ6000 фототранзистор, посмотрим, какие он результаты даст по измерению пульсаций. Я довольно много делаю всякой всячины на светиках и было бы весьма полезно знать (хотя бы для себя) уровень пульсаций светильника.