si1145 library

Dependents:   FRDM_ApplicationShield_GroveSensors

Committer:
jelord
Date:
Mon Jan 18 22:06:40 2016 +0000
Revision:
9:daf5ed7c7c3e
Parent:
8:4511725f06b2
Child:
10:ba32b0098ee8
Line 48 commented out.  Had to be done for MicroChip to work... All references to "Serial pc" object removed...No printfs can be done to the terminal.  Does this affect all paths?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ngood 0:0490a77adbc5 1 /**
ngood 0:0490a77adbc5 2 * SI1145 Digital UV Index / IR / Visible Light Sensor library
ngood 0:0490a77adbc5 3 * @author N Good
ngood 0:0490a77adbc5 4 * @date 5-May-2015
ngood 0:0490a77adbc5 5 * Library for "SI1145 Digital UV Index / IR / Visible Light Sensor" from adafruit
ngood 0:0490a77adbc5 6 * https://www.adafruit.com/products/1777
ngood 0:0490a77adbc5 7 */
ngood 0:0490a77adbc5 8
ngood 0:0490a77adbc5 9 #include "mbed.h"
ngood 0:0490a77adbc5 10 #include "SI1145.h"
ngood 0:0490a77adbc5 11
ngood 0:0490a77adbc5 12 SI1145::SI1145(PinName sda, PinName scl, char slave_adr)
ngood 0:0490a77adbc5 13 :
ngood 0:0490a77adbc5 14 i2c_p(new I2C(sda, scl)),
ngood 0:0490a77adbc5 15 i2c(*i2c_p),
ngood 0:0490a77adbc5 16 address(slave_adr),
ngood 0:0490a77adbc5 17 t_fine(0)
ngood 0:0490a77adbc5 18 {
ngood 0:0490a77adbc5 19 initalize();
ngood 0:0490a77adbc5 20 }
ngood 0:0490a77adbc5 21
ngood 0:0490a77adbc5 22 SI1145::SI1145(I2C &i2c_obj, char slave_adr)
ngood 0:0490a77adbc5 23 :
ngood 0:0490a77adbc5 24 i2c_p(NULL),
ngood 0:0490a77adbc5 25 i2c(i2c_obj),
ngood 0:0490a77adbc5 26 address(slave_adr),
ngood 0:0490a77adbc5 27 t_fine(0)
ngood 0:0490a77adbc5 28 {
ngood 0:0490a77adbc5 29 initalize();
ngood 0:0490a77adbc5 30 }
ngood 0:0490a77adbc5 31
ngood 0:0490a77adbc5 32 //SI1145::~SI1145()
ngood 0:0490a77adbc5 33 //{
ngood 0:0490a77adbc5 34 // if (NULL != i2c_p)
ngood 0:0490a77adbc5 35 // delete i2c_p;
ngood 0:0490a77adbc5 36 //}
ngood 0:0490a77adbc5 37
ngood 0:0490a77adbc5 38 void SI1145::initalize(void) {
ngood 0:0490a77adbc5 39 uint16_t idu;
ngood 0:0490a77adbc5 40 //i2c.frequency(100000);
ngood 0:0490a77adbc5 41 char id[1] = {0x00};
ngood 0:0490a77adbc5 42 i2c.write(address,id,1);
ngood 0:0490a77adbc5 43 char data[1] = {0};
ngood 0:0490a77adbc5 44 i2c.read(address,data,1);
ngood 0:0490a77adbc5 45 float idf;
ngood 0:0490a77adbc5 46 idu = data[0];
ngood 0:0490a77adbc5 47 idf = (float)idu;
jelord 9:daf5ed7c7c3e 48 // pc.printf("%4.0f ID\n",idf); COMMENTED OUT B/C only one Serial object can exist in main...???
ngood 0:0490a77adbc5 49 // reset______________________________________________
ngood 0:0490a77adbc5 50 //write MEASRATE0
ngood 0:0490a77adbc5 51 char MEASRATE0[2] = {0x08,0x0};
ngood 0:0490a77adbc5 52 i2c.write(address,MEASRATE0,2);
ngood 0:0490a77adbc5 53 //write MEASRATE1
ngood 0:0490a77adbc5 54 char MEASRATE1[2] = {0x09,0x0};
ngood 0:0490a77adbc5 55 i2c.write(address,MEASRATE1,2);
ngood 0:0490a77adbc5 56 //write visQEN
ngood 0:0490a77adbc5 57 char visQEN[2] = {0x04,0x0};
ngood 0:0490a77adbc5 58 i2c.write(address,visQEN,2);
ngood 0:0490a77adbc5 59 // visQMODE1
ngood 0:0490a77adbc5 60 char visQMODE1[2] = {0x05,0x0};
ngood 0:0490a77adbc5 61 i2c.write(address,visQMODE1,2);
ngood 0:0490a77adbc5 62 //write visQMODE2
ngood 0:0490a77adbc5 63 char visQMODE2[2] = {0x06,0x0};
ngood 0:0490a77adbc5 64 i2c.write(address,visQMODE2,2);
ngood 0:0490a77adbc5 65 //write INTCFG
ngood 0:0490a77adbc5 66 char INTCFG[2] = {0x03,0x0};
ngood 0:0490a77adbc5 67 i2c.write(address,INTCFG,2);
ngood 0:0490a77adbc5 68 //write visQSTAT
ngood 0:0490a77adbc5 69 char visQSTAT[2] = {0x21,0xFF};
ngood 0:0490a77adbc5 70 i2c.write(address,visQSTAT,2);
ngood 0:0490a77adbc5 71 //write COMMAND
ngood 0:0490a77adbc5 72 char COMMAND[2] = {0x18,0x01};
ngood 0:0490a77adbc5 73 i2c.write(address,COMMAND,2);
ngood 0:0490a77adbc5 74 // wait
ngood 0:0490a77adbc5 75 wait(100/1000);
ngood 0:0490a77adbc5 76 //write HWKEY
ngood 0:0490a77adbc5 77 char HWKEY[2] = {0x07, 0x17};
ngood 0:0490a77adbc5 78 i2c.write(address,HWKEY,2);
ngood 0:0490a77adbc5 79 // wait
ngood 0:0490a77adbc5 80 wait(100/1000);
ngood 0:0490a77adbc5 81 //__________________________________________________________
ngood 0:0490a77adbc5 82 // enable UVindex measurement coefficients!
ngood 0:0490a77adbc5 83 char REG_UCOEFF0[2] = {0x13,0x29};
ngood 0:0490a77adbc5 84 i2c.write(address, REG_UCOEFF0, 2);
ngood 0:0490a77adbc5 85 char REG_UCOEFF1[2] = {0x14,0x89};
ngood 0:0490a77adbc5 86 i2c.write(address, REG_UCOEFF1, 2);
ngood 0:0490a77adbc5 87 char REG_UCOEFF2[2] = {0x15,0x02};
ngood 0:0490a77adbc5 88 i2c.write(address, REG_UCOEFF2, 2);
ngood 0:0490a77adbc5 89 char REG_UCOEFF3[2] = {0x16,0x00};
ngood 0:0490a77adbc5 90 i2c.write(address, REG_UCOEFF3, 2);
ngood 0:0490a77adbc5 91 //__________________________________________________________
ngood 0:0490a77adbc5 92
ngood 0:0490a77adbc5 93 // enable UV sensor
ngood 0:0490a77adbc5 94 char PARAM_CHLIST[2] = {0x17, 0x80 | 0x20 | 0x10 | 0x01};
ngood 0:0490a77adbc5 95 i2c.write(address, PARAM_CHLIST, 2);
ngood 0:0490a77adbc5 96 char COMMD_CHLIST[2] = {0x18, 0x01 | 0xA0};
ngood 0:0490a77adbc5 97 i2c.write(address, COMMD_CHLIST, 2);
ngood 0:0490a77adbc5 98 // enable interrupt on every sample
ngood 0:0490a77adbc5 99 char REG_INTCFG[2] = {0x03,0x01};
ngood 0:0490a77adbc5 100 i2c.write(address, REG_INTCFG, 2);
ngood 0:0490a77adbc5 101 char REG_visQEN[2] = {0x04,0x01};
ngood 0:0490a77adbc5 102 i2c.write(address, REG_visQEN, 2);
ngood 0:0490a77adbc5 103 // program proximity sensor LED current
ngood 0:0490a77adbc5 104 char REG_PSLED21[2] = {0x0F,0x03};
ngood 0:0490a77adbc5 105 i2c.write(address, REG_PSLED21, 2); // 20mA for LED 1 only
ngood 0:0490a77adbc5 106 char PARAM_ADCMUX_LARGEvis[2] = {0x17, 0x03};
ngood 0:0490a77adbc5 107 i2c.write(address, PARAM_ADCMUX_LARGEvis, 2);
ngood 0:0490a77adbc5 108 char PARAM_PS1ADCMUX[2] = {0x18, 0x07 | 0xA0};
ngood 0:0490a77adbc5 109 i2c.write(address, PARAM_PS1ADCMUX, 2);
ngood 0:0490a77adbc5 110 // prox sensor #1 uses LED #1
ngood 0:0490a77adbc5 111 char PARAM_PSLED12SEL_PS1LED1[2] = {0x17, 0x01};
ngood 0:0490a77adbc5 112 i2c.write(address, PARAM_PSLED12SEL_PS1LED1, 2);
ngood 0:0490a77adbc5 113 char PARAM_PSLED12SEL[2] = {0x18, 0x02 | 0xA0};
ngood 0:0490a77adbc5 114 i2c.write(address, PARAM_PSLED12SEL, 2);
ngood 0:0490a77adbc5 115 // fastest clocks, clock div 1
ngood 0:0490a77adbc5 116 char PARAM_0[2] = {0x17, 0x0 | 0xA0};
ngood 0:0490a77adbc5 117 i2c.write(address, PARAM_0, 2);
ngood 0:0490a77adbc5 118 char PARAM_PSADCGAIN[2] = {0x18, 0x0B};
ngood 0:0490a77adbc5 119 i2c.write(address, PARAM_PSADCGAIN, 2);
ngood 0:0490a77adbc5 120 // take 511 clocks to measure
ngood 0:0490a77adbc5 121 char PARAM_ADCCOUNTER_511CLK[2] = {0x17, 0x70};
ngood 0:0490a77adbc5 122 i2c.write(address, PARAM_ADCCOUNTER_511CLK, 2);
ngood 0:0490a77adbc5 123 char PARAM_PSADCOUNTER[2] = {0x18, 0x0A | 0xA0};
ngood 0:0490a77adbc5 124 i2c.write(address, PARAM_PSADCOUNTER, 2);
ngood 0:0490a77adbc5 125 // in prox mode, high range
ngood 0:0490a77adbc5 126 char PARAM_PSADCMISC_RANGE_PARAM_PSADCMISC_PSMODE[2] = {0x17, 0x20 | 0x04};
ngood 0:0490a77adbc5 127 i2c.write(address, PARAM_PSADCMISC_RANGE_PARAM_PSADCMISC_PSMODE, 2);
ngood 0:0490a77adbc5 128 char PARAM_PSADCMISC[2] = {0x18, 0x0C | 0xA0};
ngood 0:0490a77adbc5 129 i2c.write(address, PARAM_PSADCMISC, 2);
ngood 0:0490a77adbc5 130 //
ngood 0:0490a77adbc5 131 char PARAM_ADCMUX_SMALLvis[2] = {0x17, 0x00};
ngood 0:0490a77adbc5 132 i2c.write(address, PARAM_ADCMUX_SMALLvis, 2);
ngood 0:0490a77adbc5 133 char PARAM_ALSvisADCMUX[2] = {0x18, 0x0E | 0xA0};
ngood 0:0490a77adbc5 134 i2c.write(address, PARAM_ALSvisADCMUX, 2);
ngood 0:0490a77adbc5 135 // fastest clocks, clock div 1
ngood 0:0490a77adbc5 136 i2c.write(address, PARAM_0, 2);
ngood 0:0490a77adbc5 137 char PARAM_ALSvisADCGAIN[2] = {0x18, 0x1E | 0xA0};
ngood 0:0490a77adbc5 138 i2c.write(address, PARAM_ALSvisADCGAIN, 2);
ngood 0:0490a77adbc5 139 // take 511 clocks to measure
ngood 0:0490a77adbc5 140 i2c.write(address, PARAM_ADCCOUNTER_511CLK, 2);
ngood 0:0490a77adbc5 141 char PARAM_ALSvisADCOUNTER[2] = {0x18, 0x1D | 0xA0};
ngood 0:0490a77adbc5 142 i2c.write(address, PARAM_ALSvisADCOUNTER, 2);
ngood 0:0490a77adbc5 143 // in high range mode
ngood 0:0490a77adbc5 144 char PARAM_ALSvisADCMISC_RANGE[2] = {0x17, 0x20};
ngood 0:0490a77adbc5 145 i2c.write(address, PARAM_ALSvisADCMISC_RANGE, 2);
ngood 0:0490a77adbc5 146 char PARAM_ALSvisADCMISC[2] = {0x18, 0x1F | 0xA0};
ngood 0:0490a77adbc5 147 i2c.write(address, PARAM_ALSvisADCMISC, 2);
ngood 0:0490a77adbc5 148 // fastest clocks, clock div 1
ngood 0:0490a77adbc5 149 char PARAM_000[2] = {0x17, 0x0};
ngood 0:0490a77adbc5 150 i2c.write(address, PARAM_000, 2);
ngood 0:0490a77adbc5 151 char PARAM_ALSuvADCGAIN[2] = {0x18, 0x11 | 0xA0};
ngood 0:0490a77adbc5 152 i2c.write(address, PARAM_ALSuvADCGAIN, 2);
ngood 0:0490a77adbc5 153 // take 511 clocks to measure
ngood 0:0490a77adbc5 154 i2c.write(address, PARAM_ADCCOUNTER_511CLK, 2);
ngood 0:0490a77adbc5 155 char PARAM_ALSuvADCOUNTER[2] = {0x18, 0x10 | 0xA0};
ngood 0:0490a77adbc5 156 i2c.write(address, PARAM_ALSuvADCOUNTER, 2);
ngood 0:0490a77adbc5 157 // in high range mode (not normal signal)
ngood 0:0490a77adbc5 158 char PARAM_ALSuvADCMISC_uvRANGE[2] = {0x17, 0x20};
ngood 0:0490a77adbc5 159 i2c.write(address, PARAM_ALSuvADCMISC_uvRANGE, 2);
ngood 0:0490a77adbc5 160 char PARAM_ALSuvADCMISC[2] = {0x18, 0x12 | 0xA0};
ngood 0:0490a77adbc5 161 i2c.write(address, PARAM_ALSuvADCMISC, 2);
ngood 0:0490a77adbc5 162 // measurement rate for auto
ngood 0:0490a77adbc5 163 char REG_MEASRATE0[2] = {0x08,0xFF};
ngood 0:0490a77adbc5 164 i2c.write(address, REG_MEASRATE0, 2);// 255 * 31.25uS = 8ms
ngood 0:0490a77adbc5 165 // auto run
ngood 0:0490a77adbc5 166 char REG_COMMAND[2] = {0x18,0x0F};
ngood 0:0490a77adbc5 167 i2c.write(address, REG_COMMAND, 2);
ngood 0:0490a77adbc5 168 }
ngood 0:0490a77adbc5 169
caseyquinn 8:4511725f06b2 170 uint16_t SI1145::getUV()
ngood 0:0490a77adbc5 171 {
ngood 0:0490a77adbc5 172 // Variables
caseyquinn 1:8587b5583343 173 //float valf; // uv value
ngood 0:0490a77adbc5 174 char reg[1]; // register
ngood 0:0490a77adbc5 175 char data[2] = {0,0}; // data 2 x 8 bits
ngood 0:0490a77adbc5 176 uint16_t vali; // uv value
ngood 0:0490a77adbc5 177 // Set register
ngood 0:0490a77adbc5 178 reg[0] = 0x2C;
ngood 0:0490a77adbc5 179 // Read registers
ngood 0:0490a77adbc5 180 i2c.write(address, reg, 1);
ngood 0:0490a77adbc5 181 i2c.read(address, data, 2);
ngood 0:0490a77adbc5 182 // Merge bytes
ngood 0:0490a77adbc5 183 vali = data[0] | (data[1] << 8); // int
caseyquinn 1:8587b5583343 184 //valf = (float)vali; // convert to float
ngood 0:0490a77adbc5 185 // Return value
caseyquinn 1:8587b5583343 186 return vali;
ngood 0:0490a77adbc5 187 }
ngood 0:0490a77adbc5 188
caseyquinn 8:4511725f06b2 189 uint16_t SI1145::getVIS()
ngood 0:0490a77adbc5 190 {
ngood 0:0490a77adbc5 191 // Variables
caseyquinn 6:642ece0fad39 192 //float valf; // vis (IR+UV) value
ngood 0:0490a77adbc5 193 char reg[1]; // register
ngood 0:0490a77adbc5 194 char data[2] = {0,0}; // data 2 x 8 bits
caseyquinn 8:4511725f06b2 195 uint16_t vali; // vis value
ngood 0:0490a77adbc5 196 // Set register
ngood 0:0490a77adbc5 197 reg[0] = 0x22;
ngood 0:0490a77adbc5 198 // Read registers
ngood 0:0490a77adbc5 199 i2c.write(address, reg, 1);
ngood 0:0490a77adbc5 200 i2c.read(address, data, 2);
ngood 0:0490a77adbc5 201 // Merge bytes
ngood 0:0490a77adbc5 202 vali = data[0] | (data[1] << 8); // int
caseyquinn 6:642ece0fad39 203 //valf = (float)vali; // convert to float
ngood 0:0490a77adbc5 204 // Return value
caseyquinn 6:642ece0fad39 205 return vali;
ngood 0:0490a77adbc5 206 }
ngood 0:0490a77adbc5 207
caseyquinn 8:4511725f06b2 208 uint16_t SI1145::getIR()
ngood 0:0490a77adbc5 209 {
ngood 0:0490a77adbc5 210 // Variables
caseyquinn 1:8587b5583343 211 //float valf; // ir value
ngood 0:0490a77adbc5 212 char reg[1]; // register
ngood 0:0490a77adbc5 213 char data[2] = {0,0}; // data 2 x 8 bits
caseyquinn 8:4511725f06b2 214 uint16_t vali; // ir value
ngood 0:0490a77adbc5 215 // Set register
ngood 0:0490a77adbc5 216 reg[0] = 0x24;
ngood 0:0490a77adbc5 217 // Read registers
ngood 0:0490a77adbc5 218 i2c.write(address, reg, 1);
ngood 0:0490a77adbc5 219 i2c.read(address, data, 2);
ngood 0:0490a77adbc5 220 // Merge bytes
ngood 0:0490a77adbc5 221 vali = data[0] | (data[1] << 8); // int
caseyquinn 1:8587b5583343 222 //valf = (float)vali; // convert to float
ngood 0:0490a77adbc5 223 // Return value
caseyquinn 1:8587b5583343 224 return vali;
ngood 0:0490a77adbc5 225 }
ngood 0:0490a77adbc5 226
caseyquinn 8:4511725f06b2 227 uint16_t SI1145::getPROX()
ngood 0:0490a77adbc5 228 {
ngood 0:0490a77adbc5 229 // Variables
caseyquinn 1:8587b5583343 230 //float valf; // prox value
ngood 0:0490a77adbc5 231 char reg[1]; // register
ngood 0:0490a77adbc5 232 char data[2] = {0,0}; // data 2 x 8 bits
caseyquinn 8:4511725f06b2 233 uint16_t vali; // prox value
ngood 0:0490a77adbc5 234 // Set register
ngood 0:0490a77adbc5 235 reg[0] = 0x26;
ngood 0:0490a77adbc5 236 // Read registers
ngood 0:0490a77adbc5 237 i2c.write(address, reg, 1);
ngood 0:0490a77adbc5 238 i2c.read(address, data, 2);
ngood 0:0490a77adbc5 239 // Merge bytes
ngood 0:0490a77adbc5 240 vali = data[0] | (data[1] << 8); // int
caseyquinn 1:8587b5583343 241 //valf = (float)vali; // convert to float
ngood 0:0490a77adbc5 242 // Return value
caseyquinn 1:8587b5583343 243 return vali;
ngood 0:0490a77adbc5 244 }
ngood 0:0490a77adbc5 245