grove_digital_light
grove_digital_light.cpp@0:54ed8f245631, 2015-06-09 (annotated)
- Committer:
- JackyZhangFromSeeed
- Date:
- Tue Jun 09 10:17:49 2015 +0000
- Revision:
- 0:54ed8f245631
grove_digital_light
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JackyZhangFromSeeed | 0:54ed8f245631 | 1 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 2 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 3 | #include "suli2.h" |
JackyZhangFromSeeed | 0:54ed8f245631 | 4 | #include "grove_digital_light.h" |
JackyZhangFromSeeed | 0:54ed8f245631 | 5 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 6 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 7 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 8 | //local functions |
JackyZhangFromSeeed | 0:54ed8f245631 | 9 | static void grove_digital_light_getlux(I2C_T *i2c); |
JackyZhangFromSeeed | 0:54ed8f245631 | 10 | static unsigned long grove_digital_light_calculatelux(unsigned int iGain, unsigned int tInt, int iType); |
JackyZhangFromSeeed | 0:54ed8f245631 | 11 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 12 | //local variables |
JackyZhangFromSeeed | 0:54ed8f245631 | 13 | static unsigned char cmdbuf[2]; |
JackyZhangFromSeeed | 0:54ed8f245631 | 14 | static uint16_t ch0, ch1; |
JackyZhangFromSeeed | 0:54ed8f245631 | 15 | static unsigned long chScale; |
JackyZhangFromSeeed | 0:54ed8f245631 | 16 | static unsigned long channel1; |
JackyZhangFromSeeed | 0:54ed8f245631 | 17 | static unsigned long channel0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 18 | static unsigned long ratio1; |
JackyZhangFromSeeed | 0:54ed8f245631 | 19 | static unsigned int b; |
JackyZhangFromSeeed | 0:54ed8f245631 | 20 | static unsigned int m; |
JackyZhangFromSeeed | 0:54ed8f245631 | 21 | static unsigned long temp; |
JackyZhangFromSeeed | 0:54ed8f245631 | 22 | static unsigned long lux; |
JackyZhangFromSeeed | 0:54ed8f245631 | 23 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 24 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 25 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 26 | void grove_digital_light_init(I2C_T *i2c, int pinsda, int pinscl) |
JackyZhangFromSeeed | 0:54ed8f245631 | 27 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 28 | suli_i2c_init(i2c, pinsda, pinscl); |
JackyZhangFromSeeed | 0:54ed8f245631 | 29 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 30 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 31 | bool grove_digital_light_write_setup(I2C_T *i2c) |
JackyZhangFromSeeed | 0:54ed8f245631 | 32 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 33 | cmdbuf[0] = TSL2561_Control; |
JackyZhangFromSeeed | 0:54ed8f245631 | 34 | cmdbuf[1] = 0x03; |
JackyZhangFromSeeed | 0:54ed8f245631 | 35 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); // POWER UP |
JackyZhangFromSeeed | 0:54ed8f245631 | 36 | cmdbuf[0] = TSL2561_Timing; |
JackyZhangFromSeeed | 0:54ed8f245631 | 37 | cmdbuf[1] = 0x00; |
JackyZhangFromSeeed | 0:54ed8f245631 | 38 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); //No High Gain (1x), integration time of 13ms |
JackyZhangFromSeeed | 0:54ed8f245631 | 39 | cmdbuf[0] = TSL2561_Interrupt; |
JackyZhangFromSeeed | 0:54ed8f245631 | 40 | cmdbuf[1] = 0x00; |
JackyZhangFromSeeed | 0:54ed8f245631 | 41 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); |
JackyZhangFromSeeed | 0:54ed8f245631 | 42 | cmdbuf[0] = TSL2561_Control; |
JackyZhangFromSeeed | 0:54ed8f245631 | 43 | cmdbuf[1] = 0x00; |
JackyZhangFromSeeed | 0:54ed8f245631 | 44 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); // POWER Down |
JackyZhangFromSeeed | 0:54ed8f245631 | 45 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 46 | return true; |
JackyZhangFromSeeed | 0:54ed8f245631 | 47 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 48 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 49 | static void grove_digital_light_getlux(I2C_T *i2c) |
JackyZhangFromSeeed | 0:54ed8f245631 | 50 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 51 | uint8_t CH0_LOW = 0, CH0_HIGH = 0, CH1_LOW = 0, CH1_HIGH = 0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 52 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 53 | cmdbuf[0] = TSL2561_Channal0L; |
JackyZhangFromSeeed | 0:54ed8f245631 | 54 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 55 | suli_i2c_read(i2c, TSL2561_Address, &CH0_LOW, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 56 | cmdbuf[0] = TSL2561_Channal0H; |
JackyZhangFromSeeed | 0:54ed8f245631 | 57 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 58 | suli_i2c_read(i2c, TSL2561_Address, &CH0_HIGH, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 59 | cmdbuf[0] = TSL2561_Channal1L; |
JackyZhangFromSeeed | 0:54ed8f245631 | 60 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 61 | suli_i2c_read(i2c, TSL2561_Address, &CH1_LOW, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 62 | cmdbuf[0] = TSL2561_Channal1H; |
JackyZhangFromSeeed | 0:54ed8f245631 | 63 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 64 | suli_i2c_read(i2c, TSL2561_Address, &CH1_HIGH, 1); |
JackyZhangFromSeeed | 0:54ed8f245631 | 65 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 66 | ch0 = (CH0_HIGH<<8) | CH0_LOW; |
JackyZhangFromSeeed | 0:54ed8f245631 | 67 | ch1 = (CH1_HIGH<<8) | CH1_LOW; |
JackyZhangFromSeeed | 0:54ed8f245631 | 68 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 69 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 70 | static unsigned long grove_digital_light_calculatelux(unsigned int iGain, unsigned int tInt, int iType) |
JackyZhangFromSeeed | 0:54ed8f245631 | 71 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 72 | switch (tInt) |
JackyZhangFromSeeed | 0:54ed8f245631 | 73 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 74 | case 0: // 13.7 msec |
JackyZhangFromSeeed | 0:54ed8f245631 | 75 | chScale = CHSCALE_TINT0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 76 | break; |
JackyZhangFromSeeed | 0:54ed8f245631 | 77 | case 1: // 101 msec |
JackyZhangFromSeeed | 0:54ed8f245631 | 78 | chScale = CHSCALE_TINT1; |
JackyZhangFromSeeed | 0:54ed8f245631 | 79 | break; |
JackyZhangFromSeeed | 0:54ed8f245631 | 80 | default: // assume no scaling |
JackyZhangFromSeeed | 0:54ed8f245631 | 81 | chScale = (1 << CH_SCALE); |
JackyZhangFromSeeed | 0:54ed8f245631 | 82 | break; |
JackyZhangFromSeeed | 0:54ed8f245631 | 83 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 84 | if (!iGain) chScale = chScale << 4; // scale 1X to 16X |
JackyZhangFromSeeed | 0:54ed8f245631 | 85 | // scale the channel values |
JackyZhangFromSeeed | 0:54ed8f245631 | 86 | channel0 = (ch0 * chScale) >> CH_SCALE; |
JackyZhangFromSeeed | 0:54ed8f245631 | 87 | channel1 = (ch1 * chScale) >> CH_SCALE; |
JackyZhangFromSeeed | 0:54ed8f245631 | 88 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 89 | ratio1 = 0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 90 | if (channel0!= 0) ratio1 = (channel1 << (RATIO_SCALE+1))/channel0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 91 | // round the ratio value |
JackyZhangFromSeeed | 0:54ed8f245631 | 92 | unsigned long ratio = (ratio1 + 1) >> 1; |
JackyZhangFromSeeed | 0:54ed8f245631 | 93 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 94 | switch (iType) |
JackyZhangFromSeeed | 0:54ed8f245631 | 95 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 96 | case 0: // T package |
JackyZhangFromSeeed | 0:54ed8f245631 | 97 | if ((ratio >= 0) && (ratio <= K1T)) |
JackyZhangFromSeeed | 0:54ed8f245631 | 98 | {b=B1T; m=M1T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 99 | else if (ratio <= K2T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 100 | {b=B2T; m=M2T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 101 | else if (ratio <= K3T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 102 | {b=B3T; m=M3T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 103 | else if (ratio <= K4T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 104 | {b=B4T; m=M4T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 105 | else if (ratio <= K5T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 106 | {b=B5T; m=M5T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 107 | else if (ratio <= K6T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 108 | {b=B6T; m=M6T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 109 | else if (ratio <= K7T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 110 | {b=B7T; m=M7T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 111 | else if (ratio > K8T) |
JackyZhangFromSeeed | 0:54ed8f245631 | 112 | {b=B8T; m=M8T;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 113 | break; |
JackyZhangFromSeeed | 0:54ed8f245631 | 114 | case 1:// CS package |
JackyZhangFromSeeed | 0:54ed8f245631 | 115 | if ((ratio >= 0) && (ratio <= K1C)) |
JackyZhangFromSeeed | 0:54ed8f245631 | 116 | {b=B1C; m=M1C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 117 | else if (ratio <= K2C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 118 | {b=B2C; m=M2C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 119 | else if (ratio <= K3C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 120 | {b=B3C; m=M3C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 121 | else if (ratio <= K4C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 122 | {b=B4C; m=M4C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 123 | else if (ratio <= K5C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 124 | {b=B5C; m=M5C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 125 | else if (ratio <= K6C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 126 | {b=B6C; m=M6C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 127 | else if (ratio <= K7C) |
JackyZhangFromSeeed | 0:54ed8f245631 | 128 | {b=B7C; m=M7C;} |
JackyZhangFromSeeed | 0:54ed8f245631 | 129 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 130 | temp=((channel0*b)-(channel1*m)); |
JackyZhangFromSeeed | 0:54ed8f245631 | 131 | if(temp<0) temp=0; |
JackyZhangFromSeeed | 0:54ed8f245631 | 132 | temp+=(1<<(LUX_SCALE-1)); |
JackyZhangFromSeeed | 0:54ed8f245631 | 133 | // strip off fractional portion |
JackyZhangFromSeeed | 0:54ed8f245631 | 134 | lux=temp>>LUX_SCALE; |
JackyZhangFromSeeed | 0:54ed8f245631 | 135 | return (lux); |
JackyZhangFromSeeed | 0:54ed8f245631 | 136 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 137 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 138 | bool grove_digital_light_readvisiblelux(I2C_T *i2c, uint32_t *lux) |
JackyZhangFromSeeed | 0:54ed8f245631 | 139 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 140 | cmdbuf[0] = TSL2561_Control; |
JackyZhangFromSeeed | 0:54ed8f245631 | 141 | cmdbuf[1] = 0x03; |
JackyZhangFromSeeed | 0:54ed8f245631 | 142 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); // POWER UP |
JackyZhangFromSeeed | 0:54ed8f245631 | 143 | suli_delay_ms(14); |
JackyZhangFromSeeed | 0:54ed8f245631 | 144 | grove_digital_light_getlux(i2c); |
JackyZhangFromSeeed | 0:54ed8f245631 | 145 | |
JackyZhangFromSeeed | 0:54ed8f245631 | 146 | cmdbuf[0] = TSL2561_Control; |
JackyZhangFromSeeed | 0:54ed8f245631 | 147 | cmdbuf[1] = 0x00; |
JackyZhangFromSeeed | 0:54ed8f245631 | 148 | suli_i2c_write(i2c, TSL2561_Address, cmdbuf, 2); // POWER Down |
JackyZhangFromSeeed | 0:54ed8f245631 | 149 | if(ch0/ch1 < 2 && ch0 > 4900) |
JackyZhangFromSeeed | 0:54ed8f245631 | 150 | { |
JackyZhangFromSeeed | 0:54ed8f245631 | 151 | return -1; //ch0 out of range, but ch1 not. the lux is not valid in this situation. |
JackyZhangFromSeeed | 0:54ed8f245631 | 152 | } |
JackyZhangFromSeeed | 0:54ed8f245631 | 153 | *lux = grove_digital_light_calculatelux(0, 0, 0); //T package, no gain, 13ms |
JackyZhangFromSeeed | 0:54ed8f245631 | 154 | return true; |
JackyZhangFromSeeed | 0:54ed8f245631 | 155 | } |