grove_digital_light

Committer:
JackyZhangFromSeeed
Date:
Tue Jun 09 10:17:49 2015 +0000
Revision:
0:54ed8f245631
grove_digital_light

Who changed what in which revision?

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