raynard omongbale / Mbed OS hexiwear_Bluetooth_Moonshot

Dependencies:   Hexi_OLED_SSD1351

Committer:
raynard
Date:
Fri Jul 26 13:37:55 2019 +0000
Revision:
0:a84d2425acba
watch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
raynard 0:a84d2425acba 1 #include "lum.h"
raynard 0:a84d2425acba 2
raynard 0:a84d2425acba 3 TSL2561::TSL2561 (PinName sda, PinName scl)
raynard 0:a84d2425acba 4 : _i2c_p(new I2C(sda, scl)), _i2c(*_i2c_p)
raynard 0:a84d2425acba 5 {
raynard 0:a84d2425acba 6 TSL2561_addr = TSL2561_ADDRESS_GND;
raynard 0:a84d2425acba 7 init();
raynard 0:a84d2425acba 8 }
raynard 0:a84d2425acba 9
raynard 0:a84d2425acba 10 TSL2561::TSL2561 (PinName sda, PinName scl, uint8_t addr)
raynard 0:a84d2425acba 11 : _i2c_p(new I2C(sda, scl)), _i2c(*_i2c_p)
raynard 0:a84d2425acba 12 {
raynard 0:a84d2425acba 13 TSL2561_addr = addr;
raynard 0:a84d2425acba 14 init();
raynard 0:a84d2425acba 15 }
raynard 0:a84d2425acba 16
raynard 0:a84d2425acba 17 TSL2561::TSL2561 (I2C& TSL2561_i2c)
raynard 0:a84d2425acba 18 : _i2c(TSL2561_i2c)
raynard 0:a84d2425acba 19 {
raynard 0:a84d2425acba 20 TSL2561_addr = TSL2561_ADDRESS_GND;
raynard 0:a84d2425acba 21 init();
raynard 0:a84d2425acba 22 }
raynard 0:a84d2425acba 23
raynard 0:a84d2425acba 24 TSL2561::TSL2561 (I2C& TSL2561_i2c, uint8_t addr)
raynard 0:a84d2425acba 25 : _i2c(TSL2561_i2c)
raynard 0:a84d2425acba 26 {
raynard 0:a84d2425acba 27 TSL2561_addr = addr;
raynard 0:a84d2425acba 28 init();
raynard 0:a84d2425acba 29 }
raynard 0:a84d2425acba 30
raynard 0:a84d2425acba 31
raynard 0:a84d2425acba 32 void TSL2561::init() //Initialize sensor
raynard 0:a84d2425acba 33 {
raynard 0:a84d2425acba 34 _i2c.frequency(100000);
raynard 0:a84d2425acba 35 power_up();
raynard 0:a84d2425acba 36 set_timing_reg(TIMING_DEFAULT);
raynard 0:a84d2425acba 37 }
raynard 0:a84d2425acba 38
raynard 0:a84d2425acba 39
raynard 0:a84d2425acba 40 float TSL2561::lux() // Read Lux from sensor
raynard 0:a84d2425acba 41 {
raynard 0:a84d2425acba 42 double lux0, lux1;
raynard 0:a84d2425acba 43 double ratio;
raynard 0:a84d2425acba 44 double dlux;
raynard 0:a84d2425acba 45
raynard 0:a84d2425acba 46 dt[0] = CMD_MULTI + TSL2561_DATA0LOW;
raynard 0:a84d2425acba 47 _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
raynard 0:a84d2425acba 48 _i2c.read(TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 49 ch0 = dt[1] << 8 | dt[0];
raynard 0:a84d2425acba 50 dt[0] = CMD_MULTI + TSL2561_DATA1LOW;
raynard 0:a84d2425acba 51 _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
raynard 0:a84d2425acba 52 _i2c.read(TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 53 ch1 = dt[1] << 8 | dt[0];
raynard 0:a84d2425acba 54 if (ch0 == 0xFFFF) {
raynard 0:a84d2425acba 55 return 2500.0;
raynard 0:a84d2425acba 56 }
raynard 0:a84d2425acba 57 lux0 = (double)ch0;
raynard 0:a84d2425acba 58 lux1 = (double)ch1;
raynard 0:a84d2425acba 59 ratio = lux1 / lux0;
raynard 0:a84d2425acba 60 read_timing_reg();
raynard 0:a84d2425acba 61 lux0 *= (402.0/integ_time);
raynard 0:a84d2425acba 62 lux1 *= (402.0/integ_time);
raynard 0:a84d2425acba 63 lux0 /= gain;
raynard 0:a84d2425acba 64 lux1 /= gain;
raynard 0:a84d2425acba 65 if (ratio <= 0.5) {
raynard 0:a84d2425acba 66 dlux = 0.03040 * lux0 - 0.06200 * lux0 * pow(ratio,1.4);
raynard 0:a84d2425acba 67 } else if (ratio <= 0.61) {
raynard 0:a84d2425acba 68 dlux = 0.02240 * lux0 - 0.03100 * lux1;
raynard 0:a84d2425acba 69 } else if (ratio <= 0.80) {
raynard 0:a84d2425acba 70 dlux = 0.01280 * lux0 - 0.01530 * lux1;
raynard 0:a84d2425acba 71 } else if (ratio <= 1.30) {
raynard 0:a84d2425acba 72 dlux = 0.00146 * lux0 - 0.00112 * lux1;
raynard 0:a84d2425acba 73 } else {
raynard 0:a84d2425acba 74 dlux = 0;
raynard 0:a84d2425acba 75 }
raynard 0:a84d2425acba 76 return (float)dlux;
raynard 0:a84d2425acba 77 }
raynard 0:a84d2425acba 78
raynard 0:a84d2425acba 79
raynard 0:a84d2425acba 80 uint8_t TSL2561::set_timing_reg(uint8_t parameter)
raynard 0:a84d2425acba 81 {
raynard 0:a84d2425acba 82 dt[0] = CMD_SINGLE + TSL2561_TIMING;
raynard 0:a84d2425acba 83 dt[1] = parameter;
raynard 0:a84d2425acba 84 _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 85 dt[0] = CMD_SINGLE + TSL2561_TIMING;
raynard 0:a84d2425acba 86 _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
raynard 0:a84d2425acba 87 _i2c.read(TSL2561_addr, (char *)dt, 1, false);
raynard 0:a84d2425acba 88 return dt[0];
raynard 0:a84d2425acba 89 }
raynard 0:a84d2425acba 90
raynard 0:a84d2425acba 91 uint8_t TSL2561::read_timing_reg(void)
raynard 0:a84d2425acba 92 {
raynard 0:a84d2425acba 93 uint8_t i;
raynard 0:a84d2425acba 94
raynard 0:a84d2425acba 95 dt[0] = CMD_SINGLE + TSL2561_TIMING;
raynard 0:a84d2425acba 96 _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
raynard 0:a84d2425acba 97 _i2c.read(TSL2561_addr, (char *)dt, 1, false);
raynard 0:a84d2425acba 98 if (dt[0] & TIMING_GAIN_16){
raynard 0:a84d2425acba 99 gain = 16;
raynard 0:a84d2425acba 100 } else {
raynard 0:a84d2425acba 101 gain = 1;
raynard 0:a84d2425acba 102 }
raynard 0:a84d2425acba 103 i = dt[0] & 0x3;
raynard 0:a84d2425acba 104 switch (i) {
raynard 0:a84d2425acba 105 case 0:
raynard 0:a84d2425acba 106 integ_time = 13.7;
raynard 0:a84d2425acba 107 break;
raynard 0:a84d2425acba 108 case 1:
raynard 0:a84d2425acba 109 integ_time = 101.0;
raynard 0:a84d2425acba 110 break;
raynard 0:a84d2425acba 111 case 2:
raynard 0:a84d2425acba 112 integ_time = 402.0;
raynard 0:a84d2425acba 113 break;
raynard 0:a84d2425acba 114 default:
raynard 0:a84d2425acba 115 integ_time = 0;
raynard 0:a84d2425acba 116 break;
raynard 0:a84d2425acba 117 }
raynard 0:a84d2425acba 118 return dt[0];
raynard 0:a84d2425acba 119 }
raynard 0:a84d2425acba 120
raynard 0:a84d2425acba 121 uint16_t TSL2561::get_ID()
raynard 0:a84d2425acba 122 {
raynard 0:a84d2425acba 123 dt[0] = CMD_SINGLE + TSL2561_ID;
raynard 0:a84d2425acba 124 _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
raynard 0:a84d2425acba 125 _i2c.read(TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 126 id_number = dt[0] << 8 | dt[1];
raynard 0:a84d2425acba 127 return id_number;
raynard 0:a84d2425acba 128 }
raynard 0:a84d2425acba 129
raynard 0:a84d2425acba 130 uint8_t TSL2561::get_device_ID()
raynard 0:a84d2425acba 131 {
raynard 0:a84d2425acba 132 get_ID();
raynard 0:a84d2425acba 133 if ((id_number >> 8) == I_AM_TSL2561) {
raynard 0:a84d2425acba 134 return 1;
raynard 0:a84d2425acba 135 } else {
raynard 0:a84d2425acba 136 return 0;
raynard 0:a84d2425acba 137 }
raynard 0:a84d2425acba 138 }
raynard 0:a84d2425acba 139
raynard 0:a84d2425acba 140 void TSL2561::power_up()
raynard 0:a84d2425acba 141 {
raynard 0:a84d2425acba 142 dt[0] = CMD_SINGLE + TSL2561_CONTROL;
raynard 0:a84d2425acba 143 dt[1] = 3;
raynard 0:a84d2425acba 144 _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 145 }
raynard 0:a84d2425acba 146
raynard 0:a84d2425acba 147 void TSL2561::power_down()
raynard 0:a84d2425acba 148 {
raynard 0:a84d2425acba 149 dt[0] = CMD_SINGLE + TSL2561_CONTROL;
raynard 0:a84d2425acba 150 dt[1] = 0;
raynard 0:a84d2425acba 151 _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
raynard 0:a84d2425acba 152 }
raynard 0:a84d2425acba 153
raynard 0:a84d2425acba 154 void TSL2561::frequency(int hz)
raynard 0:a84d2425acba 155 {
raynard 0:a84d2425acba 156 _i2c.frequency(hz);
raynard 0:a84d2425acba 157 }
raynard 0:a84d2425acba 158
raynard 0:a84d2425acba 159
raynard 0:a84d2425acba 160