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@0:a84d2425acba, 2019-07-26 (annotated)
- Committer:
- raynard
- Date:
- Fri Jul 26 13:37:55 2019 +0000
- Revision:
- 0:a84d2425acba
watch
Who changed what in which revision?
| User | Revision | Line number | New 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 |