Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Hexi_OLED_SSD1351
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
Generated on Tue Jul 12 2022 18:19:43 by
1.7.2