Basic library for the TCS34725, based off of several example programs and the Adafruit Arduino library

Dependents:   MF_FUJIKO_BASE STEM_2019 STEM_2020

TCS34725.cpp

Committer:
mwilkens241
Date:
2017-01-25
Revision:
2:cc2c0831a763
Parent:
1:06c9bbbdb8b0
Child:
3:afb107db7994

File content as of revision 2:cc2c0831a763:

#include "TCS34725.h"

I2C i2c(SDA, SCL);

uint8_t t_intTime;
uint8_t t_gain;

void i2cWrite8(uint8_t addr, char reg, char data){
    char packet[2] = {reg | COMMAND_BIT ,data & 0xFF}; 
    i2c.write(addr,packet,2,false);
    wait(0.01);
}

uint8_t i2cRead8(uint8_t addr, char reg){
    char packet[1] = {reg | COMMAND_BIT};
    char data[1] = {0};
    i2c.write(addr,packet,1, true);
    i2c.read(addr,data,1,false);
    return (uint8_t)data[0];
}

uint16_t i2cRead16(uint8_t addr, char reg){
    char packet[1] = {reg | COMMAND_BIT};
    char data[2] = {0,0};
    i2c.write(addr,packet,1, true);
    i2c.read(addr,data,2, false);
    return ((uint16_t)data[1] << 8) | (uint16_t)data[0];
}

bool TCS34725_init(char intTime, char gain){
    i2c.frequency(400000);
    
    uint8_t id = i2cRead8(SENSOR_ADDR, TCS34725_ID);
    if(id != 0x44)return false;
    
    i2cWrite8(SENSOR_ADDR,TCS34725_ATIME, intTime);
    t_intTime = intTime;
    i2cWrite8(SENSOR_ADDR,TCS34725_CONTROL, gain);
    t_gain = gain;
    i2cWrite8(SENSOR_ADDR,TCS34725_ENABLE, TCS34725_ENABLE_PON);
    wait(0.003);
    i2cWrite8(SENSOR_ADDR,TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
    return true;
}

void TCS34725_config(char intTime, char gain){
    uint8_t reg = i2cRead8(SENSOR_ADDR, TCS34725_ENABLE);
    i2cWrite8(SENSOR_ADDR,TCS34725_ENABLE, reg | ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN));
    TCS34725_init(intTime,gain);
}

void TCS34725_getColor(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c){
    *c = i2cRead16(SENSOR_ADDR, TCS34725_CDATAL);
    *r = i2cRead16(SENSOR_ADDR, TCS34725_RDATAL);
    *g = i2cRead16(SENSOR_ADDR, TCS34725_GDATAL);
    *b = i2cRead16(SENSOR_ADDR, TCS34725_BDATAL);
    switch(t_intTime){
        case TCS34725_INTEGRATIONTIME_2_4MS:
            wait(0.003);
            break;
        case TCS34725_INTEGRATIONTIME_24MS:
            wait(0.024);
            break;
        case TCS34725_INTEGRATIONTIME_50MS:
            wait(0.05);
            break;
        case TCS34725_INTEGRATIONTIME_101MS:
            wait(0.101);
            break;
        case TCS34725_INTEGRATIONTIME_154MS:
            wait(0.154);
            break;
        case TCS34725_INTEGRATIONTIME_700MS:
            wait(0.7);
            break;
    }
}

void TCS34725_DEBUG(Serial * deb){
    deb->printf("ATIME:%d ENABLE:%d CONTROL:%d ID:%d\n",
    i2cRead8(SENSOR_ADDR, TCS34725_ATIME),
    i2cRead8(SENSOR_ADDR, TCS34725_ENABLE),
    i2cRead8(SENSOR_ADDR, TCS34725_CONTROL),
    i2cRead16(SENSOR_ADDR, TCS34725_ID));
}