Plant Monitoring CS

Dependencies:   HTS221

Committer:
titi9211
Date:
Thu Mar 26 10:01:31 2020 +0000
Revision:
62:4763f2aa486c
TSL2561

Who changed what in which revision?

UserRevisionLine numberNew 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