Etienne Charbonnier
/
plant_monitoring
Plant Monitoring CS
TSL2561.cpp@62:4763f2aa486c, 2020-03-26 (annotated)
- Committer:
- titi9211
- Date:
- Thu Mar 26 10:01:31 2020 +0000
- Revision:
- 62:4763f2aa486c
TSL2561
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
titi9211 | 62:4763f2aa486c | 1 | /* |
titi9211 | 62:4763f2aa486c | 2 | * mbed library program |
titi9211 | 62:4763f2aa486c | 3 | * Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output) |
titi9211 | 62:4763f2aa486c | 4 | * TSL2561 by Texas Advanced Optoelectronic Solutions Inc. |
titi9211 | 62:4763f2aa486c | 5 | * |
titi9211 | 62:4763f2aa486c | 6 | * Copyright (c) 2015,'17 Kenji Arai / JH1PJL |
titi9211 | 62:4763f2aa486c | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
titi9211 | 62:4763f2aa486c | 8 | * http://mbed.org/users/kenjiArai/ |
titi9211 | 62:4763f2aa486c | 9 | * Created: Feburary 21st, 2015 |
titi9211 | 62:4763f2aa486c | 10 | * Revised: August 23rd, 2017 |
titi9211 | 62:4763f2aa486c | 11 | */ |
titi9211 | 62:4763f2aa486c | 12 | |
titi9211 | 62:4763f2aa486c | 13 | #include "TSL2561.h" |
titi9211 | 62:4763f2aa486c | 14 | |
titi9211 | 62:4763f2aa486c | 15 | TSL2561::TSL2561 (PinName p_sda, PinName p_scl) |
titi9211 | 62:4763f2aa486c | 16 | : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) |
titi9211 | 62:4763f2aa486c | 17 | { |
titi9211 | 62:4763f2aa486c | 18 | TSL2561_addr = TSL2561_ADDRESS_GND; |
titi9211 | 62:4763f2aa486c | 19 | init(); |
titi9211 | 62:4763f2aa486c | 20 | } |
titi9211 | 62:4763f2aa486c | 21 | |
titi9211 | 62:4763f2aa486c | 22 | TSL2561::TSL2561 (PinName p_sda, PinName p_scl, uint8_t addr) |
titi9211 | 62:4763f2aa486c | 23 | : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) |
titi9211 | 62:4763f2aa486c | 24 | { |
titi9211 | 62:4763f2aa486c | 25 | TSL2561_addr = addr; |
titi9211 | 62:4763f2aa486c | 26 | init(); |
titi9211 | 62:4763f2aa486c | 27 | } |
titi9211 | 62:4763f2aa486c | 28 | |
titi9211 | 62:4763f2aa486c | 29 | TSL2561::TSL2561 (I2C& p_i2c) |
titi9211 | 62:4763f2aa486c | 30 | : _i2c(p_i2c) |
titi9211 | 62:4763f2aa486c | 31 | { |
titi9211 | 62:4763f2aa486c | 32 | TSL2561_addr = TSL2561_ADDRESS_GND; |
titi9211 | 62:4763f2aa486c | 33 | init(); |
titi9211 | 62:4763f2aa486c | 34 | } |
titi9211 | 62:4763f2aa486c | 35 | |
titi9211 | 62:4763f2aa486c | 36 | TSL2561::TSL2561 (I2C& p_i2c, uint8_t addr) |
titi9211 | 62:4763f2aa486c | 37 | : _i2c(p_i2c) |
titi9211 | 62:4763f2aa486c | 38 | { |
titi9211 | 62:4763f2aa486c | 39 | TSL2561_addr = addr; |
titi9211 | 62:4763f2aa486c | 40 | init(); |
titi9211 | 62:4763f2aa486c | 41 | } |
titi9211 | 62:4763f2aa486c | 42 | |
titi9211 | 62:4763f2aa486c | 43 | /////////////// Read Lux from sensor ////////////////////// |
titi9211 | 62:4763f2aa486c | 44 | /* |
titi9211 | 62:4763f2aa486c | 45 | For 0 < CH1/CH0 < 0.50 Lux = 0.0304 x CH0-0.062 x CH0 x ((CH1/CH0)1.4) |
titi9211 | 62:4763f2aa486c | 46 | For 0.50 < CH1/CH0 < 0.61 Lux = 0.0224 x CH0-0.031 x CH1 |
titi9211 | 62:4763f2aa486c | 47 | For 0.61 < CH1/CH0 < 0.80 Lux = 0.0128 x CH0-0.0153 x CH1 |
titi9211 | 62:4763f2aa486c | 48 | For 0.80 < CH1/CH0 < 1.30 Lux = 0.00146 x CH0-0.00112x CH1 |
titi9211 | 62:4763f2aa486c | 49 | For CH1/CH0 > 1.30 Lux = 0 |
titi9211 | 62:4763f2aa486c | 50 | */ |
titi9211 | 62:4763f2aa486c | 51 | float TSL2561::lux() |
titi9211 | 62:4763f2aa486c | 52 | { |
titi9211 | 62:4763f2aa486c | 53 | double lux0, lux1; |
titi9211 | 62:4763f2aa486c | 54 | double ratio; |
titi9211 | 62:4763f2aa486c | 55 | double dlux; |
titi9211 | 62:4763f2aa486c | 56 | |
titi9211 | 62:4763f2aa486c | 57 | dt[0] = CMD_MULTI + TSL2561_DATA0LOW; |
titi9211 | 62:4763f2aa486c | 58 | _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); |
titi9211 | 62:4763f2aa486c | 59 | _i2c.read(TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 60 | ch0 = dt[1] << 8 | dt[0]; |
titi9211 | 62:4763f2aa486c | 61 | dt[0] = CMD_MULTI + TSL2561_DATA1LOW; |
titi9211 | 62:4763f2aa486c | 62 | _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); |
titi9211 | 62:4763f2aa486c | 63 | _i2c.read(TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 64 | ch1 = dt[1] << 8 | dt[0]; |
titi9211 | 62:4763f2aa486c | 65 | if (ch0 == 0xFFFF) { |
titi9211 | 62:4763f2aa486c | 66 | return 2500.0; |
titi9211 | 62:4763f2aa486c | 67 | } |
titi9211 | 62:4763f2aa486c | 68 | lux0 = (double)ch0; |
titi9211 | 62:4763f2aa486c | 69 | lux1 = (double)ch1; |
titi9211 | 62:4763f2aa486c | 70 | ratio = lux1 / lux0; |
titi9211 | 62:4763f2aa486c | 71 | read_timing_reg(); |
titi9211 | 62:4763f2aa486c | 72 | lux0 *= (402.0/integ_time); |
titi9211 | 62:4763f2aa486c | 73 | lux1 *= (402.0/integ_time); |
titi9211 | 62:4763f2aa486c | 74 | lux0 /= gain; |
titi9211 | 62:4763f2aa486c | 75 | lux1 /= gain; |
titi9211 | 62:4763f2aa486c | 76 | if (ratio <= 0.5) { |
titi9211 | 62:4763f2aa486c | 77 | dlux = 0.03040 * lux0 - 0.06200 * lux0 * pow(ratio,1.4); |
titi9211 | 62:4763f2aa486c | 78 | } else if (ratio <= 0.61) { |
titi9211 | 62:4763f2aa486c | 79 | dlux = 0.02240 * lux0 - 0.03100 * lux1; |
titi9211 | 62:4763f2aa486c | 80 | } else if (ratio <= 0.80) { |
titi9211 | 62:4763f2aa486c | 81 | dlux = 0.01280 * lux0 - 0.01530 * lux1; |
titi9211 | 62:4763f2aa486c | 82 | } else if (ratio <= 1.30) { |
titi9211 | 62:4763f2aa486c | 83 | dlux = 0.00146 * lux0 - 0.00112 * lux1; |
titi9211 | 62:4763f2aa486c | 84 | } else { |
titi9211 | 62:4763f2aa486c | 85 | dlux = 0; |
titi9211 | 62:4763f2aa486c | 86 | } |
titi9211 | 62:4763f2aa486c | 87 | return (float)dlux; |
titi9211 | 62:4763f2aa486c | 88 | } |
titi9211 | 62:4763f2aa486c | 89 | |
titi9211 | 62:4763f2aa486c | 90 | /////////////// Initialize //////////////////////////////// |
titi9211 | 62:4763f2aa486c | 91 | void TSL2561::init() |
titi9211 | 62:4763f2aa486c | 92 | { |
titi9211 | 62:4763f2aa486c | 93 | _i2c.frequency(100000); |
titi9211 | 62:4763f2aa486c | 94 | power_up(); |
titi9211 | 62:4763f2aa486c | 95 | set_timing_reg(TIMING_DEFAULT); |
titi9211 | 62:4763f2aa486c | 96 | } |
titi9211 | 62:4763f2aa486c | 97 | |
titi9211 | 62:4763f2aa486c | 98 | /////////////// Timing Register /////////////////////////// |
titi9211 | 62:4763f2aa486c | 99 | uint8_t TSL2561::set_timing_reg(uint8_t parameter) |
titi9211 | 62:4763f2aa486c | 100 | { |
titi9211 | 62:4763f2aa486c | 101 | dt[0] = CMD_SINGLE + TSL2561_TIMING; |
titi9211 | 62:4763f2aa486c | 102 | dt[1] = parameter; |
titi9211 | 62:4763f2aa486c | 103 | _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 104 | dt[0] = CMD_SINGLE + TSL2561_TIMING; |
titi9211 | 62:4763f2aa486c | 105 | _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); |
titi9211 | 62:4763f2aa486c | 106 | _i2c.read(TSL2561_addr, (char *)dt, 1, false); |
titi9211 | 62:4763f2aa486c | 107 | return dt[0]; |
titi9211 | 62:4763f2aa486c | 108 | } |
titi9211 | 62:4763f2aa486c | 109 | |
titi9211 | 62:4763f2aa486c | 110 | uint8_t TSL2561::read_timing_reg(void) |
titi9211 | 62:4763f2aa486c | 111 | { |
titi9211 | 62:4763f2aa486c | 112 | uint8_t i; |
titi9211 | 62:4763f2aa486c | 113 | |
titi9211 | 62:4763f2aa486c | 114 | dt[0] = CMD_SINGLE + TSL2561_TIMING; |
titi9211 | 62:4763f2aa486c | 115 | _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); |
titi9211 | 62:4763f2aa486c | 116 | _i2c.read(TSL2561_addr, (char *)dt, 1, false); |
titi9211 | 62:4763f2aa486c | 117 | if (dt[0] & TIMING_GAIN_16){ |
titi9211 | 62:4763f2aa486c | 118 | gain = 16; |
titi9211 | 62:4763f2aa486c | 119 | } else { |
titi9211 | 62:4763f2aa486c | 120 | gain = 1; |
titi9211 | 62:4763f2aa486c | 121 | } |
titi9211 | 62:4763f2aa486c | 122 | i = dt[0] & 0x3; |
titi9211 | 62:4763f2aa486c | 123 | switch (i) { |
titi9211 | 62:4763f2aa486c | 124 | case 0: |
titi9211 | 62:4763f2aa486c | 125 | integ_time = 13.7; |
titi9211 | 62:4763f2aa486c | 126 | break; |
titi9211 | 62:4763f2aa486c | 127 | case 1: |
titi9211 | 62:4763f2aa486c | 128 | integ_time = 101.0; |
titi9211 | 62:4763f2aa486c | 129 | break; |
titi9211 | 62:4763f2aa486c | 130 | case 2: |
titi9211 | 62:4763f2aa486c | 131 | integ_time = 402.0; |
titi9211 | 62:4763f2aa486c | 132 | break; |
titi9211 | 62:4763f2aa486c | 133 | default: |
titi9211 | 62:4763f2aa486c | 134 | integ_time = 0; |
titi9211 | 62:4763f2aa486c | 135 | break; |
titi9211 | 62:4763f2aa486c | 136 | } |
titi9211 | 62:4763f2aa486c | 137 | return dt[0]; |
titi9211 | 62:4763f2aa486c | 138 | } |
titi9211 | 62:4763f2aa486c | 139 | |
titi9211 | 62:4763f2aa486c | 140 | /////////////// ID //////////////////////////////////////// |
titi9211 | 62:4763f2aa486c | 141 | uint16_t TSL2561::read_ID() |
titi9211 | 62:4763f2aa486c | 142 | { |
titi9211 | 62:4763f2aa486c | 143 | dt[0] = CMD_SINGLE + TSL2561_ID; |
titi9211 | 62:4763f2aa486c | 144 | _i2c.write((int)TSL2561_addr, (char *)dt, 1, true); |
titi9211 | 62:4763f2aa486c | 145 | _i2c.read(TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 146 | id_number = dt[0] << 8 | dt[1]; |
titi9211 | 62:4763f2aa486c | 147 | return id_number; |
titi9211 | 62:4763f2aa486c | 148 | } |
titi9211 | 62:4763f2aa486c | 149 | |
titi9211 | 62:4763f2aa486c | 150 | uint8_t TSL2561::who_am_i() |
titi9211 | 62:4763f2aa486c | 151 | { |
titi9211 | 62:4763f2aa486c | 152 | read_ID(); |
titi9211 | 62:4763f2aa486c | 153 | if ((id_number >> 4) == I_AM_TSL2561) { |
titi9211 | 62:4763f2aa486c | 154 | return 1; |
titi9211 | 62:4763f2aa486c | 155 | } else { |
titi9211 | 62:4763f2aa486c | 156 | return 0; |
titi9211 | 62:4763f2aa486c | 157 | } |
titi9211 | 62:4763f2aa486c | 158 | } |
titi9211 | 62:4763f2aa486c | 159 | |
titi9211 | 62:4763f2aa486c | 160 | /////////////// Power ON/OFF ////////////////////////////// |
titi9211 | 62:4763f2aa486c | 161 | void TSL2561::power_up() |
titi9211 | 62:4763f2aa486c | 162 | { |
titi9211 | 62:4763f2aa486c | 163 | dt[0] = CMD_SINGLE + TSL2561_CONTROL; |
titi9211 | 62:4763f2aa486c | 164 | dt[1] = 3; |
titi9211 | 62:4763f2aa486c | 165 | _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 166 | } |
titi9211 | 62:4763f2aa486c | 167 | |
titi9211 | 62:4763f2aa486c | 168 | void TSL2561::power_down() |
titi9211 | 62:4763f2aa486c | 169 | { |
titi9211 | 62:4763f2aa486c | 170 | dt[0] = CMD_SINGLE + TSL2561_CONTROL; |
titi9211 | 62:4763f2aa486c | 171 | dt[1] = 0; |
titi9211 | 62:4763f2aa486c | 172 | _i2c.write((int)TSL2561_addr, (char *)dt, 2, false); |
titi9211 | 62:4763f2aa486c | 173 | } |
titi9211 | 62:4763f2aa486c | 174 | |
titi9211 | 62:4763f2aa486c | 175 | /////////////// I2C Freq. ///////////////////////////////// |
titi9211 | 62:4763f2aa486c | 176 | void TSL2561::frequency(int hz) |
titi9211 | 62:4763f2aa486c | 177 | { |
titi9211 | 62:4763f2aa486c | 178 | _i2c.frequency(hz); |
titi9211 | 62:4763f2aa486c | 179 | } |
titi9211 | 62:4763f2aa486c | 180 | |
titi9211 | 62:4763f2aa486c | 181 | |
titi9211 | 62:4763f2aa486c | 182 |