// Avago ADJD-S311-CR999 Color Sensor demo // by Musashinodenpa (tf@musashinodenpa.com) #include #define I2C_ADDRESS 0x74 // 7bit #define REG_CAP_RED 0x06 #define REG_CAP_GREEN 0x07 #define REG_CAP_BLUE 0x08 #define REG_CAP_CLEAR 0x09 #define REG_INT_RED_LO 0x0A #define REG_INT_RED_HI 0x0B #define REG_INT_GREEN_LO 0x0C #define REG_INT_GREEN_HI 0x0D #define REG_INT_BLUE_LO 0x0E #define REG_INT_BLUE_HI 0x0F #define REG_INT_CLEAR_LO 0x10 #define REG_INT_CLEAR_HI 0x11 #define REG_DATA_RED_LO 0x40 #define REG_DATA_RED_HI 0x41 #define REG_DATA_GREEN_LO 0x42 #define REG_DATA_GREEN_HI 0x43 #define REG_DATA_BLUE_LO 0x44 #define REG_DATA_BLUE_HI 0x45 #define REG_DATA_CLEAR_LO 0x46 #define REG_DATA_CLEAR_HI 0x47 void set_register(unsigned char r, unsigned char v) { Wire.beginTransmission(I2C_ADDRESS); Wire.send(r); Wire.send(v); Wire.endTransmission(); } unsigned char read_register(unsigned char r) { unsigned char v; Wire.beginTransmission(I2C_ADDRESS); Wire.send(r); // register to read Wire.endTransmission(); Wire.requestFrom(I2C_ADDRESS, 1); // read a byte while(!Wire.available()) { // waiting } v = Wire.receive(); return v; } void setup(void) { Wire.begin(); Serial.begin(9600); // sensor gain setting (Avago app note 5330) // CAPs are 4bit (higher value will result in lower output) set_register(REG_CAP_RED, 0x03); set_register(REG_CAP_GREEN, 0x03); set_register(REG_CAP_BLUE, 0x03); set_register(REG_CAP_CLEAR, 0x08); // INTs are 12bit (higher value will result in higher sensor value) set_register(REG_INT_RED_LO, 0xC4); set_register(REG_INT_RED_HI, 0x09); set_register(REG_INT_GREEN_LO, 0xC4); set_register(REG_INT_GREEN_HI, 0x09); set_register(REG_INT_BLUE_LO, 0xC4); set_register(REG_INT_BLUE_HI, 0x09); set_register(REG_INT_CLEAR_LO, 0xC4); set_register(REG_INT_CLEAR_HI, 0x09); } void loop() { int r, g, b, c; set_register(0x00,0x01); // start sensing while(read_register(0x00) != 0) { // waiting for a result } // 10bit results c = read_register(REG_DATA_CLEAR_LO) + (read_register(REG_DATA_CLEAR_HI)<<8); r = read_register(REG_DATA_RED_LO) + (read_register(REG_DATA_RED_HI)<<8); g = read_register(REG_DATA_GREEN_LO) + (read_register(REG_DATA_GREEN_HI)<<8); b = read_register(REG_DATA_BLUE_LO) + (read_register(REG_DATA_BLUE_HI)<<8); Serial.print("crgb="); Serial.print(c ,DEC); Serial.print(","); Serial.print(r ,DEC); Serial.print(","); Serial.print(g ,DEC); Serial.print(","); Serial.println(b ,DEC); delay(999); }