[137] | 1 | /* TSL2591 Digital Light Sensor */
|
---|
| 2 | /* Dynamic Range: 600M:1 */
|
---|
| 3 | /* Maximum Lux: 88K */
|
---|
| 4 |
|
---|
| 5 | #include <Wire.h>
|
---|
| 6 | #include <Adafruit_Sensor.h>
|
---|
| 7 | #include "Adafruit_TSL2591.h"
|
---|
| 8 |
|
---|
| 9 | // Example for demonstrating the TSL2591 library - public domain!
|
---|
| 10 |
|
---|
| 11 | // connect SCL to analog 5
|
---|
| 12 | // connect SDA to analog 4
|
---|
| 13 | // connect Vin to 3.3-5V DC
|
---|
| 14 | // connect GROUND to common ground
|
---|
| 15 |
|
---|
| 16 | Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); // pass in a number for the sensor identifier (for your use later)
|
---|
| 17 |
|
---|
| 18 | /**************************************************************************/
|
---|
| 19 | /*
|
---|
| 20 | Displays some basic information on this sensor from the unified
|
---|
| 21 | sensor API sensor_t type (see Adafruit_Sensor for more information)
|
---|
| 22 | */
|
---|
| 23 | /**************************************************************************/
|
---|
| 24 | void displaySensorDetails(void)
|
---|
| 25 | {
|
---|
| 26 | sensor_t sensor;
|
---|
| 27 | tsl.getSensor(&sensor);
|
---|
| 28 | Serial.println("------------------------------------");
|
---|
| 29 | Serial.print ("Sensor: "); Serial.println(sensor.name);
|
---|
| 30 | Serial.print ("Driver Ver: "); Serial.println(sensor.version);
|
---|
| 31 | Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
|
---|
| 32 | Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux");
|
---|
| 33 | Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux");
|
---|
| 34 | Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux");
|
---|
| 35 | Serial.println("------------------------------------");
|
---|
| 36 | Serial.println("");
|
---|
| 37 | delay(500);
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | /**************************************************************************/
|
---|
| 41 | /*
|
---|
| 42 | Configures the gain and integration time for the TSL2591
|
---|
| 43 | */
|
---|
| 44 | /**************************************************************************/
|
---|
| 45 | void configureSensor(void)
|
---|
| 46 | {
|
---|
| 47 | // You can change the gain on the fly, to adapt to brighter/dimmer light situations
|
---|
| 48 | //tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light)
|
---|
| 49 | tsl.setGain(TSL2591_GAIN_MED); // 25x gain
|
---|
| 50 | //tsl.setGain(TSL2591_GAIN_HIGH); // 428x gain
|
---|
| 51 |
|
---|
| 52 | // Changing the integration time gives you a longer time over which to sense light
|
---|
| 53 | // longer timelines are slower, but are good in very low light situtations!
|
---|
| 54 | tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // shortest integration time (bright light)
|
---|
| 55 | //tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS);
|
---|
| 56 | //tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS);
|
---|
| 57 | //tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS);
|
---|
| 58 | //tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS);
|
---|
| 59 | //tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); // longest integration time (dim light)
|
---|
| 60 |
|
---|
| 61 | /* Display the gain and integration time for reference sake */
|
---|
| 62 | Serial.println("------------------------------------");
|
---|
| 63 | Serial.print ("Gain: ");
|
---|
| 64 | tsl2591Gain_t gain = tsl.getGain();
|
---|
| 65 | switch(gain)
|
---|
| 66 | {
|
---|
| 67 | case TSL2591_GAIN_LOW:
|
---|
| 68 | Serial.println("1x (Low)");
|
---|
| 69 | break;
|
---|
| 70 | case TSL2591_GAIN_MED:
|
---|
| 71 | Serial.println("25x (Medium)");
|
---|
| 72 | break;
|
---|
| 73 | case TSL2591_GAIN_HIGH:
|
---|
| 74 | Serial.println("428x (High)");
|
---|
| 75 | break;
|
---|
| 76 | case TSL2591_GAIN_MAX:
|
---|
| 77 | Serial.println("9876x (Max)");
|
---|
| 78 | break;
|
---|
| 79 | }
|
---|
| 80 | Serial.print ("Timing: ");
|
---|
| 81 | Serial.print((tsl.getTiming() + 1) * 100, DEC);
|
---|
| 82 | Serial.println(" ms");
|
---|
| 83 | Serial.println("------------------------------------");
|
---|
| 84 | Serial.println("");
|
---|
| 85 | }
|
---|
| 86 |
|
---|
| 87 | /**************************************************************************/
|
---|
| 88 | /*
|
---|
| 89 | Program entry point for the Arduino sketch
|
---|
| 90 | */
|
---|
| 91 | /**************************************************************************/
|
---|
| 92 | void setup(void)
|
---|
| 93 | {
|
---|
| 94 | Serial.begin(115200);
|
---|
| 95 |
|
---|
| 96 | Serial.println("Starting Adafruit TSL2591 Test!");
|
---|
| 97 |
|
---|
| 98 | if (tsl.begin())
|
---|
| 99 | {
|
---|
| 100 | Serial.println("Found a TSL2591 sensor");
|
---|
| 101 | }
|
---|
| 102 | else
|
---|
| 103 | {
|
---|
| 104 | Serial.println("No sensor found ... check your wiring?");
|
---|
| 105 | while (1);
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | /* Display some basic information on this sensor */
|
---|
| 109 | displaySensorDetails();
|
---|
| 110 |
|
---|
| 111 | /* Configure the sensor */
|
---|
| 112 | configureSensor();
|
---|
| 113 |
|
---|
| 114 | // Now we're ready to get readings ... move on to loop()!
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | /**************************************************************************/
|
---|
| 118 | /*
|
---|
| 119 | Shows how to perform a basic read on visible, full spectrum or
|
---|
| 120 | infrared light (returns raw 16-bit ADC values)
|
---|
| 121 | */
|
---|
| 122 | /**************************************************************************/
|
---|
| 123 | void simpleRead(void)
|
---|
| 124 | {
|
---|
| 125 | // Simple data read example. Just read the infrared, fullspecrtrum diode
|
---|
| 126 | // or 'visible' (difference between the two) channels.
|
---|
| 127 | // This can take 100-600 milliseconds! Uncomment whichever of the following you want to read
|
---|
| 128 | uint16_t x = tsl.getLuminosity(TSL2591_VISIBLE);
|
---|
| 129 | //uint16_t x = tsl.getLuminosity(TSL2591_FULLSPECTRUM);
|
---|
| 130 | //uint16_t x = tsl.getLuminosity(TSL2591_INFRARED);
|
---|
| 131 |
|
---|
| 132 | Serial.print("[ "); Serial.print(millis()); Serial.print(" ms ] ");
|
---|
| 133 | Serial.print("Luminosity: ");
|
---|
| 134 | Serial.println(x, DEC);
|
---|
| 135 | }
|
---|
| 136 |
|
---|
| 137 | /**************************************************************************/
|
---|
| 138 | /*
|
---|
| 139 | Show how to read IR and Full Spectrum at once and convert to lux
|
---|
| 140 | */
|
---|
| 141 | /**************************************************************************/
|
---|
| 142 | void advancedRead(void)
|
---|
| 143 | {
|
---|
| 144 | // More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
|
---|
| 145 | // That way you can do whatever math and comparisons you want!
|
---|
| 146 | uint32_t lum = tsl.getFullLuminosity();
|
---|
| 147 | uint16_t ir, full;
|
---|
| 148 | ir = lum >> 16;
|
---|
| 149 | full = lum & 0xFFFF;
|
---|
| 150 | Serial.print("[ "); Serial.print(millis()); Serial.print(" ms ] ");
|
---|
| 151 | Serial.print("IR: "); Serial.print(ir); Serial.print(" ");
|
---|
| 152 | Serial.print("Full: "); Serial.print(full); Serial.print(" ");
|
---|
| 153 | Serial.print("Visible: "); Serial.print(full - ir); Serial.print(" ");
|
---|
| 154 | Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));
|
---|
| 155 | }
|
---|
| 156 |
|
---|
| 157 | /**************************************************************************/
|
---|
| 158 | /*
|
---|
| 159 | Performs a read using the Adafruit Unified Sensor API.
|
---|
| 160 | */
|
---|
| 161 | /**************************************************************************/
|
---|
| 162 | void unifiedSensorAPIRead(void)
|
---|
| 163 | {
|
---|
| 164 | /* Get a new sensor event */
|
---|
| 165 | sensors_event_t event;
|
---|
| 166 | tsl.getEvent(&event);
|
---|
| 167 |
|
---|
| 168 | /* Display the results (light is measured in lux) */
|
---|
| 169 | Serial.print("[ "); Serial.print(event.timestamp); Serial.print(" ms ] ");
|
---|
| 170 | if ((event.light == 0) |
|
---|
| 171 | (event.light > 4294966000.0) |
|
---|
| 172 | (event.light <-4294966000.0))
|
---|
| 173 | {
|
---|
| 174 | /* If event.light = 0 lux the sensor is probably saturated */
|
---|
| 175 | /* and no reliable data could be generated! */
|
---|
| 176 | /* if event.light is +/- 4294967040 there was a float over/underflow */
|
---|
| 177 | Serial.println("Invalid data (adjust gain or timing)");
|
---|
| 178 | }
|
---|
| 179 | else
|
---|
| 180 | {
|
---|
| 181 | Serial.print(event.light); Serial.println(" lux");
|
---|
| 182 | }
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | /**************************************************************************/
|
---|
| 186 | /*
|
---|
| 187 | Arduino loop function, called once 'setup' is complete (your own code
|
---|
| 188 | should go here)
|
---|
| 189 | */
|
---|
| 190 | /**************************************************************************/
|
---|
| 191 | void loop(void)
|
---|
| 192 | {
|
---|
| 193 | // simpleRead();
|
---|
| 194 | // advancedRead();
|
---|
| 195 | unifiedSensorAPIRead();
|
---|
| 196 |
|
---|
| 197 | delay(250);
|
---|
| 198 | }
|
---|