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:
TSL2591_GAIN_LOW: az erősítés 1x (erős fénynél)
TSL2591_GAIN_MEDIUM: 25x erősítés (általános célú felhasználás)
TSL2591_GAIN_HIGH: 428x erősítés (kevés fény)
TSL2591_GAIN_MAX: 9876x erősítés (rendkivűl alacsony erősségű fény)
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:
TSL2591_INTEGRATIONTIME_100MS
TSL2591_INTEGRATIONTIME_200MS
TSL2591_INTEGRATIONTIME_300MS
TSL2591_INTEGRATIONTIME_400MS
TSL2591_INTEGRATIONTIME_500MS
TSL2591_INTEGRATIONTIME_600MS
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.