moon

Dependencies:   Hexi_OLED_SSD1351

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lum.cpp Source File

lum.cpp

00001 #include "lum.h"
00002 
00003 TSL2561::TSL2561 (PinName sda, PinName scl)
00004  : _i2c_p(new I2C(sda, scl)), _i2c(*_i2c_p)
00005 {
00006     TSL2561_addr = TSL2561_ADDRESS_GND;
00007     init();
00008 }
00009 
00010 TSL2561::TSL2561 (PinName sda, PinName scl, uint8_t addr)
00011  : _i2c_p(new I2C(sda, scl)), _i2c(*_i2c_p)
00012 {
00013     TSL2561_addr = addr;
00014     init();
00015 }
00016 
00017 TSL2561::TSL2561 (I2C& TSL2561_i2c)
00018  : _i2c(TSL2561_i2c)
00019 {
00020     TSL2561_addr = TSL2561_ADDRESS_GND;
00021     init();
00022 }
00023 
00024 TSL2561::TSL2561 (I2C& TSL2561_i2c, uint8_t addr)
00025  : _i2c(TSL2561_i2c)
00026 {
00027     TSL2561_addr = addr;
00028     init();
00029 }
00030 
00031 
00032 void TSL2561::init()            //Initialize sensor
00033 {
00034     _i2c.frequency(100000);
00035     power_up();
00036     set_timing_reg(TIMING_DEFAULT);
00037 }
00038 
00039 
00040 float TSL2561::lux()            // Read Lux from sensor
00041 {
00042     double lux0, lux1;
00043     double ratio;
00044     double dlux;
00045 
00046     dt[0] = CMD_MULTI + TSL2561_DATA0LOW;
00047     _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
00048     _i2c.read(TSL2561_addr, (char *)dt, 2, false);
00049     ch0 = dt[1] << 8 | dt[0];
00050     dt[0] = CMD_MULTI + TSL2561_DATA1LOW;
00051     _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
00052     _i2c.read(TSL2561_addr, (char *)dt, 2, false);
00053     ch1 = dt[1] << 8 | dt[0];
00054     if (ch0 == 0xFFFF) {
00055         return 2500.0;
00056     }
00057     lux0 = (double)ch0;
00058     lux1 = (double)ch1;
00059     ratio = lux1 / lux0;
00060     read_timing_reg();
00061     lux0 *= (402.0/integ_time);
00062     lux1 *= (402.0/integ_time);
00063     lux0 /= gain;
00064     lux1 /= gain;
00065     if (ratio <= 0.5) {
00066         dlux = 0.03040 * lux0 - 0.06200 * lux0 * pow(ratio,1.4);
00067     } else if (ratio <= 0.61) {
00068         dlux = 0.02240 * lux0 - 0.03100 * lux1;
00069     } else if (ratio <= 0.80) {
00070         dlux = 0.01280 * lux0 - 0.01530 * lux1;
00071     } else if (ratio <= 1.30) {
00072         dlux = 0.00146 * lux0 - 0.00112 * lux1;
00073     } else {
00074         dlux = 0;
00075     }
00076     return (float)dlux;
00077 }
00078 
00079 
00080 uint8_t TSL2561::set_timing_reg(uint8_t parameter)
00081 {
00082     dt[0] = CMD_SINGLE + TSL2561_TIMING;
00083     dt[1] = parameter;
00084     _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
00085     dt[0] = CMD_SINGLE + TSL2561_TIMING;
00086     _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
00087     _i2c.read(TSL2561_addr, (char *)dt, 1, false);
00088     return dt[0];
00089 }
00090 
00091 uint8_t TSL2561::read_timing_reg(void)
00092 {
00093     uint8_t i;
00094 
00095     dt[0] = CMD_SINGLE + TSL2561_TIMING;
00096     _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
00097     _i2c.read(TSL2561_addr, (char *)dt, 1, false);
00098     if (dt[0] & TIMING_GAIN_16){
00099         gain = 16;
00100     } else {
00101         gain = 1;
00102     }
00103     i = dt[0] & 0x3;
00104     switch (i) {
00105         case 0:
00106             integ_time = 13.7;
00107             break;
00108         case 1:
00109             integ_time = 101.0;
00110             break;
00111         case 2:
00112             integ_time = 402.0;
00113             break;
00114         default:
00115             integ_time = 0;
00116             break;
00117     }
00118     return dt[0];
00119 }
00120 
00121 uint16_t TSL2561::get_ID()
00122 {
00123     dt[0] = CMD_SINGLE + TSL2561_ID;
00124     _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
00125     _i2c.read(TSL2561_addr, (char *)dt, 2, false);
00126     id_number = dt[0] << 8 | dt[1];
00127     return id_number;
00128 }
00129 
00130 uint8_t TSL2561::get_device_ID()
00131 {
00132     get_ID();
00133     if ((id_number >> 8) == I_AM_TSL2561) {
00134         return 1;
00135     } else {
00136         return 0;
00137     }
00138 }
00139 
00140 void TSL2561::power_up()
00141 {
00142     dt[0] = CMD_SINGLE + TSL2561_CONTROL;
00143     dt[1] = 3;
00144     _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
00145 }
00146 
00147 void TSL2561::power_down()
00148 {
00149     dt[0] = CMD_SINGLE + TSL2561_CONTROL;
00150     dt[1] = 0;
00151     _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
00152 }
00153 
00154 void TSL2561::frequency(int hz)
00155 {
00156     _i2c.frequency(hz);
00157 }
00158 
00159 
00160