Fényerősség érzékelő


Ebben a cikkben a TSL2591 digitális fényérzékelővel fogunk megismerkedni. Ez egy nagy pontosságú fényérzékelő ami lehetővé teszi pontos lux értékek számítását.
Teljes fénytartományban mér, egyaránt tartalmaz infravörös és teljes spektrumú mérő diódát is.
Mérhető vele külön-külön infravörös, teljes spektrumú ill. emberi szem számára látható fény. I2C protokoll szerint kommunikál viszont az I2C címe nem változtatható ez fixen 0x29. A beépített ADC lehetővé teszi hogy szinte bármilyen mikrovezérlő használhassa.

Csatlakozások:

Vin – 3V de 3V-5V közötti értéket fesz. szabályzóval átalakít.

3vo – 3,3V-os kimenet 100mA-ig terhelhető

GND – közös föld

SCL – I2C órajel

SDA – I2C adat

INT – megszakítás jel


Az érzékelőt érdemes ellátni itt is tüskesorral ez nagyban megkönnyíti a munkánkat.

Kapcsolás:

Könyvtár:


Töltsük le a https://github.com/adafruit/Adafruit_TSL2591_Library oldalról a TSL2591 könyvtárát. Tömörítsük ki, nevezzük át Adafruit_TSL2591 -re, másoljuk be az Arduino/libraries
könyvtárba a gépünkön.

A TSL2591 könyvtár használja az Adafruit_Sensor könyvtárat ami letölthető a :
https://github.com/adafruit/Adafruit_Sensor címről.


Tesztprogram futtatása:

Nyissuk meg az Arduino IDE Fájl/Minták/Adafruit_TSL2591 könyvtár tsl2591 sketchét, ezt
töltsük fel az arduinonkra, és nyissuk meg a soros monitort.
A következőt láthatjuk:

Kikerül a soros monitora az erősítés mértéke(25x), valamint a mérés ideje(100ms),
és a mért értékek kb 360ms -onként.

Könyvtárról néhány szóban:

Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
Evvel a sorral létrehozunk egy TSL2591es vezérlő példányt.


Ez után beállítjuk az erősítést és az integrációs időt, az erősítés függ a külső fényhatások mértékétől. Az erősítés a következő értékek állíthatók be:

A max érték nem ajánlott csak ténylegesen nagyon korlátozott fényviszonyoknál használható.
Az erősítés olvasható illetve beállítható a következő sorokkal:

void setGain (tsl2591Gain_t gain);

tsl2591Gain_t getGain ();



Az integrációs idő beállítható 100ms-tól 600ms-ig, minél hosszabb az integrációs idő a szenzor
annál több fényt képes integrálni, így érzékenyebb. Gyenge fényviszonyok mellet hosszabb az integrációs idő. Az alábbi értékek használhatók:

Az integrációs idő olvasható illetve beállítható a következő sorokkal:

void setTiming (tsl2591IntegrationTime_t integration);

tsl2591IntegrationTime_t getTiming ();


Ezeket a funkciókat mutatja be a következő kód:

/**************************************************************************/
/*
Configures the gain and integration time for the TSL2561
*/
/**************************************************************************/
void configureSensor(void)
{
// erősítés megváltoztatása
//tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light)
tsl.setGain(TSL2591_GAIN_MED); // 25x gain
//tsl.setGain(TSL2591_GAIN_HIGH); // 428x gain

// integrációs idő megválasztása
tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // legrövidebb megvilágítás
//tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS);
//tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS);
//tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS);
//tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS);
//tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); // leghosszabb, gyenge fénynél

// az erősítés és az integrációs idő megjelenitése
Serial.println("------------------------------------");
Serial.print ("Gain: ");
tsl2591Gain_t gain = tsl.getGain();
switch(gain)
{
case TSL2591_GAIN_LOW:
Serial.println("1x (Low)");
break;
case TSL2591_GAIN_MED:
Serial.println("25x (Medium)");
break;
case TSL2591_GAIN_HIGH:
Serial.println("428x (High)");
break;
case TSL2591_GAIN_MAX:
Serial.println("9876x (Max)");
break;
}
Serial.print ("Timing: ");
Serial.print((tsl.getTiming() + 1) * 100, DEC);
Serial.println(" ms");
Serial.println("------------------------------------");
Serial.println("");
}

A getEvent és a getSensor egy egységes érzékelő keretet biztosít az érzékelt adatok kiíratására.

Egy minta beolvasása az érzékelőről:

void getEvent(sensors_event_t*)

kód:


/**************************************************************************/
/*
Performs a read using the Adafruit Unified Sensor API.
*/
/**************************************************************************/
void unifiedSensorAPIRead(void)
{
/* egy új érzékelő esemény */
sensors_event_t event;
tsl.getEvent(&event);

/* az eredmények megjelenítése luxban */
Serial.print("[ "); Serial.print(event.timestamp); Serial.print(" ms ] ");
if ((event.light == 0) |
(event.light > 4294966000.0) |
(event.light <-4294966000.0))
{
/* ha event.light = 0 lux az érzékelő valószinűleg telített */
/* és nem hozható létre megbízható adat */
/* ha event.light +/- 4294967040 akkor úszik az érték, túlcsordulás ill alúlcsordulás */
Serial.println("Invalid data (adjust gain or timing)");
}
else
{
Serial.print(event.light); Serial.println(" lux");
}
}

Ha az érzékelő telített akkor állítsunk az erősítésen illetve az integrációs időn a megfelelő mértékben.


Void getSensor(sensor_t*)

Néhány alapvető adatot közvetít az érzékelőről.





void displaySensorDetails(void)
{
sensor_t sensor;
tsl.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}

Az érzékelőről nyers adatokat továbbító 3 utasítás:

uint16_t getLuminosity (uint8_t channel);

uint32_t getFullLuminosity ();

uint32_t calculateLux (CH0 uint16_t, uint16_t CH1);

getLuminosity: a látható fény vagy infravörös fény 16bites értékét adja.




void simpleRead(void)
{
// Simple data read example. Just read the infrared, fullspecrtrum diode
// or 'visible' (difference between the two) channels.
// This can take 100-600 milliseconds! Uncomment whichever of the following you want to read
uint16_t x = tsl.getLuminosity(TSL2591_VISIBLE);
//uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM);
//uint16_t x = tsl.getLuminosity(TSL2561_INFRARED);

Serial.print("[ "); Serial.print(millis()); Serial.print(" ms ] ");
Serial.print("Luminosity: ");
Serial.println(x, DEC);
}


getFullLuminosity beolvassa az IR értéket és a teljes értéket kiszámitja a két érték különbséget,

majd elválasztja őket, 32bites értéket ad vissza.


/**************************************************************************/
/*
Show how to read IR and Full Spectrum at once and convert to lux
*/
/**************************************************************************/
void advancedRead(void)
{
// More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
// That way you can do whatever math and comparisons you want!
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
Serial.print("[ "); Serial.print(millis()); Serial.print(" ms ] ");
Serial.print("IR: "); Serial.print(ir); Serial.print(" ");
Serial.print("Full: "); Serial.print(full); Serial.print(" ");
Serial.print("Visible: "); Serial.print(full - ir); Serial.print(" ");
Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));
}

calculateLux a mért értékekből kiszámítja a lux értéket.