Adafruit AS726x Arduino Library
Adafruit_AS726x.h
Go to the documentation of this file.
1 
17 #ifndef LIB_ADAFRUIT_AS276X
18 #define LIB_ADAFRUIT_AS276X
19 
20 #if (ARDUINO >= 100)
21 #include "Arduino.h"
22 #else
23 #include "WProgram.h"
24 #endif
25 
26 #include <Adafruit_I2CDevice.h>
27 
28 /*=========================================================================
29  I2C ADDRESS/BITS
30  -----------------------------------------------------------------------*/
31 #define AS726x_ADDRESS (0x49)
32 /*=========================================================================*/
33 
34 /**************************************************************************/
38 /**************************************************************************/
39 enum {
40  AS726X_HW_VERSION = 0x00,
41  AS726X_FW_VERSION = 0x02,
42  AS726X_CONTROL_SETUP = 0x04,
43  AS726X_INT_T = 0x05,
44  AS726X_DEVICE_TEMP = 0x06,
45  AS726X_LED_CONTROL = 0x07,
46 
47  // for reading sensor data
48  AS7262_V_HIGH = 0x08,
49  AS7262_V_LOW = 0x09,
50  AS7262_B_HIGH = 0x0A,
51  AS7262_B_LOW = 0x0B,
52  AS7262_G_HIGH = 0x0C,
53  AS7262_G_LOW = 0x0D,
54  AS7262_Y_HIGH = 0x0E,
55  AS7262_Y_LOW = 0x0F,
56  AS7262_O_HIGH = 0x10,
57  AS7262_O_LOW = 0x11,
58  AS7262_R_HIGH = 0x12,
59  AS7262_R_LOW = 0x13,
60 
61  AS7262_V_CAL = 0x14,
62  AS7262_B_CAL = 0x18,
63  AS7262_G_CAL = 0x1C,
64  AS7262_Y_CAL = 0x20,
65  AS7262_O_CAL = 0x24,
66  AS7262_R_CAL = 0x28
67 };
68 
69 /**************************************************************************/
73 /**************************************************************************/
74 enum {
75  AS726X_SLAVE_STATUS_REG = 0x00,
76  AS726X_SLAVE_WRITE_REG = 0x01,
77  AS726X_SLAVE_READ_REG = 0x02,
78  AS726X_SLAVE_TX_VALID = 0x02,
79  AS726X_SLAVE_RX_VALID = 0x01,
80 };
81 
82 /**************************************************************************/
86 /**************************************************************************/
87 enum {
88  AS7262_VIOLET = 0x08,
89  AS7262_BLUE = 0x0A,
90  AS7262_GREEN = 0x0C,
91  AS7262_YELLOW = 0x0E,
92  AS7262_ORANGE = 0x10,
93  AS7262_RED = 0x12,
94  AS7262_VIOLET_CALIBRATED = 0x14,
95  AS7262_BLUE_CALIBRATED = 0x18,
96  AS7262_GREEN_CALIBRATED = 0x1C,
97  AS7262_YELLOW_CALIBRATED = 0x20,
98  AS7262_ORANGE_CALIBRATED = 0x24,
99  AS7262_RED_CALIBRATED = 0x28,
100 };
101 
102 /**************************************************************************/
106 /**************************************************************************/
108  MODE_0 = 0b00,
109  MODE_1 = 0b01,
110  MODE_2 = 0b10, // default
111  ONE_SHOT = 0b11,
112 };
113 
114 /**************************************************************************/
118 /**************************************************************************/
120  GAIN_1X = 0b00, // default
121  GAIN_3X7 = 0b01,
122  GAIN_16X = 0b10,
123  GAIN_64X = 0b11,
124 };
125 
126 /**************************************************************************/
130 /**************************************************************************/
132  LIMIT_1MA = 0b00, // default
133  LIMIT_2MA = 0b01,
134  LIMIT_4MA = 0b10,
135  LIMIT_8MA = 0b11,
136 };
137 
138 /**************************************************************************/
142 /**************************************************************************/
144  LIMIT_12MA5 = 0b00, // default
145  LIMIT_25MA = 0b01,
146  LIMIT_50MA = 0b10,
147  LIMIT_100MA = 0b11,
148 };
149 
150 /*=========================================================================*/
151 
152 #define AS726x_INTEGRATION_TIME_MULT 2.8
153 #define AS726x_NUM_CHANNELS 6
154 
155 /**************************************************************************/
159 /**************************************************************************/
160 enum {
161  AS726x_VIOLET = 0,
162  AS726x_BLUE,
163  AS726x_GREEN,
164  AS726x_YELLOW,
165  AS726x_ORANGE,
166  AS726x_RED,
167 };
168 
169 /**************************************************************************/
174 /**************************************************************************/
176 public:
182  Adafruit_AS726x(int8_t addr = AS726x_ADDRESS) { _i2caddr = addr; };
183  ~Adafruit_AS726x(void);
184 
185  bool begin(TwoWire *theWire = &Wire);
186 
187  /*========= LED STUFF =========*/
188 
189  // Set indicator LED current
190  void setIndicateCurrent(uint8_t current);
191  // turn on/off indicator
192  void indicateLED(boolean on);
193 
194  // turn on the drv led
195  void drvOn();
196  // turn off the drv led
197  void drvOff();
198 
199  // set current through drv led
200  void setDrvCurrent(uint8_t current);
201 
202  /*===== END LED STUFF ======*/
203 
204  void setConversionType(uint8_t type);
205  void setGain(uint8_t gain);
206  void setIntegrationTime(uint8_t time);
207  void enableInterrupt();
208  void disableInterrupt();
209 
210  /*====== MEASUREMENTS ========*/
211 
212  // read sensor data
213  void startMeasurement();
214 
219  bool dataReady() { return virtualRead(AS726X_CONTROL_SETUP) & 0x02; }
220 
225  uint8_t readTemperature() { return virtualRead(AS726X_DEVICE_TEMP); }
226  uint16_t readChannel(uint8_t channel);
227 
232  uint16_t readViolet() { return (readChannel(AS7262_VIOLET)); }
237  uint16_t readBlue() { return (readChannel(AS7262_BLUE)); }
242  uint16_t readGreen() { return (readChannel(AS7262_GREEN)); }
247  uint16_t readYellow() { return (readChannel(AS7262_YELLOW)); }
252  uint16_t readOrange() { return (readChannel(AS7262_ORANGE)); }
257  uint16_t readRed() { return (readChannel(AS7262_RED)); }
258 
259  void readRawValues(uint16_t *buf, uint8_t num = AS726x_NUM_CHANNELS);
260 
261  float readCalibratedValue(uint8_t channel);
262 
268  return (readCalibratedValue(AS7262_VIOLET_CALIBRATED));
269  }
275  return (readCalibratedValue(AS7262_BLUE_CALIBRATED));
276  }
282  return (readCalibratedValue(AS7262_GREEN_CALIBRATED));
283  }
289  return (readCalibratedValue(AS7262_YELLOW_CALIBRATED));
290  }
296  return (readCalibratedValue(AS7262_ORANGE_CALIBRATED));
297  }
303  return (readCalibratedValue(AS7262_RED_CALIBRATED));
304  }
305 
306  void readCalibratedValues(float *buf, uint8_t num = AS726x_NUM_CHANNELS);
307 
308  /*==== END MEASUREMENTS =====*/
309 
310 private:
311  Adafruit_I2CDevice *i2c_dev = NULL;
312  uint8_t _i2caddr;
313 
314  void write8(byte reg, byte value);
315  uint8_t read8(byte reg);
316 
317  uint8_t virtualRead(uint8_t addr);
318  void virtualWrite(uint8_t addr, uint8_t value);
319 
320  void read(uint8_t reg, uint8_t *buf, uint8_t num);
321  void write(uint8_t reg, uint8_t *buf, uint8_t num);
322  void _i2c_init();
323 
324  struct control_setup {
325 
326  uint8_t unused : 1;
327 
328  /* 1: data ready to be read, sets int active if int is enabled */
329  uint8_t DATA_RDY : 1;
330 
331  /* conversion type
332  * 0b00 = Mode 0
333  * 0b01 = Mode 1
334  * 0b10 = Mode 2
335  * 0b11 = Mode 3 One shot
336  */
337  uint8_t BANK : 2;
338 
339  /* Channel gain setting (all channels)
340  * 0b00 = 1x
341  * 0b01 = 3.7x
342  * 0b10 = 16x
343  * 0b11 = 64x
344  */
345  uint8_t GAIN : 2;
346 
347  /* enable or disable interrupt */
348  uint8_t INT : 1;
349  uint8_t RST : 1;
350 
351  uint8_t get() {
352  return ((DATA_RDY << 1) | (BANK << 2) | (GAIN << 4) | (INT << 6) |
353  (RST << 7));
354  };
355  };
356  control_setup _control_setup;
357 
358  struct int_time {
359 
360  // integration time (multiplied by INTEGRATION_TIME_MULT) in ms
361  uint8_t INT_T : 8;
362 
363  uint8_t get() { return INT_T; };
364  };
365  int_time _int_time;
366 
367  struct led_control {
368  // enable or disable indicator LED
369  uint8_t LED_IND : 1;
370 
371  // indicator led current limit
372  uint8_t ICL_IND : 2;
373 
374  // enable or disable led_drv
375  uint8_t LED_DRV : 1;
376 
377  uint8_t ICL_DRV : 2;
378 
379  uint8_t get() {
380  return (LED_IND | (ICL_IND << 1) | (LED_DRV << 3) | (ICL_DRV << 4));
381  };
382  };
383  led_control _led_control;
384 };
385 
386 #endif
void drvOn()
turn on the driver LED
Definition: Adafruit_AS726x.cpp:82
float readCalibratedOrange()
Read calibrated orange color value (AS7262 only)
Definition: Adafruit_AS726x.h:295
void startMeasurement()
begin a measurement. This sets the conversion mode to ONE_SHOT.
Definition: Adafruit_AS726x.cpp:193
float readCalibratedViolet()
Read calibrated violet color value (AS7262 only)
Definition: Adafruit_AS726x.h:267
uint16_t readChannel(uint8_t channel)
read an individual raw spectral channel
Definition: Adafruit_AS726x.cpp:207
uint8_t readTemperature()
Read the on-board temperature sensor.
Definition: Adafruit_AS726x.h:225
void setGain(uint8_t gain)
Set the sensor gain.
Definition: Adafruit_AS726x.cpp:151
float readCalibratedBlue()
Read calibrated blue color value (AS7262 only)
Definition: Adafruit_AS726x.h:274
float readCalibratedRed()
Read calibrated red color value (AS7262 only)
Definition: Adafruit_AS726x.h:302
void readRawValues(uint16_t *buf, uint8_t num=AS726x_NUM_CHANNELS)
read the raw channels
Definition: Adafruit_AS726x.cpp:219
bool dataReady()
Check if the sensor is ready to return data.
Definition: Adafruit_AS726x.h:219
float readCalibratedValue(uint8_t channel)
read an individual calibrated spectral channel
Definition: Adafruit_AS726x.cpp:288
float readCalibratedGreen()
Read calibrated green color value (AS7262 only)
Definition: Adafruit_AS726x.h:281
float readCalibratedYellow()
Read calibrated yellow color value (AS7262 only)
Definition: Adafruit_AS726x.h:288
uint16_t readViolet()
Read raw violet color value (AS7262 only)
Definition: Adafruit_AS726x.h:232
drv_led_current_limits
Driver LED current limit settings. Default is 12.5 mA.
Definition: Adafruit_AS726x.h:143
uint16_t readRed()
Read raw red color value (AS7262 only)
Definition: Adafruit_AS726x.h:257
void drvOff()
turn off the driver LED
Definition: Adafruit_AS726x.cpp:92
void disableInterrupt()
disable the device interrupt
Definition: Adafruit_AS726x.cpp:183
Class that stores state and functions for interacting with AS726x spectral sensors.
Definition: Adafruit_AS726x.h:175
#define AS726x_ADDRESS
default I2C address
Definition: Adafruit_AS726x.h:31
void setConversionType(uint8_t type)
Set the conversion mode.
Definition: Adafruit_AS726x.cpp:139
void enableInterrupt()
enable the device interrupt
Definition: Adafruit_AS726x.cpp:173
uint16_t readGreen()
Read raw green color value (AS7262 only)
Definition: Adafruit_AS726x.h:242
uint16_t readOrange()
Read raw orange color value (AS7262 only)
Definition: Adafruit_AS726x.h:252
void setDrvCurrent(uint8_t current)
set the current limit for the driver LED.
Definition: Adafruit_AS726x.cpp:104
uint16_t readBlue()
Read raw blue color value (AS7262 only)
Definition: Adafruit_AS726x.h:237
void readCalibratedValues(float *buf, uint8_t num=AS726x_NUM_CHANNELS)
read the calibrated channels
Definition: Adafruit_AS726x.cpp:254
conversion_types
conversion modes. Default is Mode 2
Definition: Adafruit_AS726x.h:107
channel_gain
gain settings. Default is 1x gain
Definition: Adafruit_AS726x.h:119
uint16_t readYellow()
Read raw yellow color value (AS7262 only)
Definition: Adafruit_AS726x.h:247
void indicateLED(boolean on)
turn on/off the indicator LED
Definition: Adafruit_AS726x.cpp:115
#define AS726x_NUM_CHANNELS
number of sensor channels
Definition: Adafruit_AS726x.h:153
ind_led_current_limits
indicator LED current limit settings. Default is 1mA
Definition: Adafruit_AS726x.h:131
void setIndicateCurrent(uint8_t current)
set the current limit for the driver LED.
Definition: Adafruit_AS726x.cpp:127
Adafruit_AS726x(int8_t addr=AS726x_ADDRESS)
Class constructor.
Definition: Adafruit_AS726x.h:182
bool begin(TwoWire *theWire=&Wire)
Set up hardware and begin communication with the sensor.
Definition: Adafruit_AS726x.cpp:41
void setIntegrationTime(uint8_t time)
Set the integration time for the sensor.
Definition: Adafruit_AS726x.cpp:163