Daniel Vilela
/
TCS34725_
My Project
Revision 1:b6c2c1dec5bc, committed 2019-10-16
- Comitter:
- daniwestside
- Date:
- Wed Oct 16 22:40:54 2019 +0000
- Parent:
- 0:139238e5829c
- Commit message:
- My project;
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 139238e5829c -r b6c2c1dec5bc main.cpp --- a/main.cpp Sat May 09 08:27:06 2015 +0000 +++ b/main.cpp Wed Oct 16 22:40:54 2019 +0000 @@ -1,81 +1,149 @@ -// Example program connecting to the TCS34725 Color Sensor to the K64F using I2C +#include "mbed.h" +//QUITAR TICKER e implementarlo fuera -#include "mbed.h" +I2C i2c(PB_7, PB_6); //pins for I2C communication (SDA, SCL) +Serial pc(USBTX, USBRX, 9600); //9600 baudios - used to print some values +DigitalOut ledColour(PB_15); // TCS34725 led +DigitalOut ledR(PA_4); //RGB led - red light +DigitalOut ledG(PH_1); //RGB led - green light +DigitalOut ledB(PA_14); //RGB led - blue light -I2C i2c(I2C_SDA, I2C_SCL); //pins for I2C communication (SDA, SCL) -Serial pc(USBTX, USBRX); +// We set the sensor address. For TCS34725 is 0x29 = 0010 1001 (bin) ->> 0101 0010 (bin) = 0x52 +// We shift 1 bit to the left because in I2C protocol slave address is 7-bit. So we discard the 8th bit +int sensor_addr = 0x29 << 1; +//Variable for ISR +bool readColour = false; -int sensor_addr = 41 << 1; +Ticker t; -DigitalOut green(LED_GREEN); +//ISR code +void read_colour (void) +{ + readColour = true; +} -int main() { - pc.baud(9600); - green = 1; // off - - // Connect to the Color sensor and verify whether we connected to the correct sensor. - - i2c.frequency(200000); - - char id_regval[1] = {146}; - char data[1] = {0}; - i2c.write(sensor_addr,id_regval,1, true); - i2c.read(sensor_addr,data,1,false); - - if (data[0]==68) { - green = 0; - wait (2); - green = 1; - } else { - green = 1; +//Get max value (r,g,b) function +char getMax(int r, int g, int b) +{ + char result; + int max; + if (r < g) { + max = g; + result = 'g'; + } else { + max= r; + result = 'r'; + } + if (max < b) { + result = 'b'; } - + return result; +} + +int main() +{ + + t.attach(read_colour, 1.0); // Every second the ticker triggers an interruption + green = 1; // LED of B-L072Z-LRWAN1 board on + + // Connect to the Color sensor and verify whether we connected to the correct sensor. + + // i2c.frequency(200000); + /******************************************************* + * id_regval contains command register value: 1001 0010 * + * COMMAND REGISTER structure * + * 7 | 6 5 | 4 3 2 1 0 * + * CMD TYPE ADDR/SF * + * * + * CMD=1 * + * TYPE=00 -> repeated byte protocol transaction * + * ADDR/SF= 10010 -> ADDR 0x12 - Device ID * + ********************************************************/ + + + + // Initialize color sensor - - char timing_register[2] = {129,0}; + + // Timing register address 0x01 (0000 0001). We set 1st bit to 1 -> 1000 0001 + char timing_register[2] = {0x81,0x50}; //0x50 ~ 400ms i2c.write(sensor_addr,timing_register,2,false); - - char control_register[2] = {143,0}; + + // Control register address 0x0F (0000 1111). We set 1st bit to 1 -> 1000 1111 + char control_register[2] = {0x8F,0}; //{0x8F, 0x00}, {1000 1111, 0000 0000} -> 1x gain i2c.write(sensor_addr,control_register,2,false); - - char enable_register[2] = {128,3}; + + // Enable register address 0x00 (0000 0000). We set 1st bit to 1 -> 1000 0000 + char enable_register[2] = {0x80,0x03}; //{0x80, 0x03}, {1000 0000, 0000 0011} -> AEN = PON = 1 i2c.write(sensor_addr,enable_register,2,false); - + // Read data from color sensor (Clear/Red/Green/Blue) - - while (true) { - char clear_reg[1] = {148}; - char clear_data[2] = {0,0}; - i2c.write(sensor_addr,clear_reg,1, true); - i2c.read(sensor_addr,clear_data,2, false); - - int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; - - char red_reg[1] = {150}; - char red_data[2] = {0,0}; - i2c.write(sensor_addr,red_reg,1, true); - i2c.read(sensor_addr,red_data,2, false); - - int red_value = ((int)red_data[1] << 8) | red_data[0]; - - char green_reg[1] = {152}; - char green_data[2] = {0,0}; - i2c.write(sensor_addr,green_reg,1, true); - i2c.read(sensor_addr,green_data,2, false); - - int green_value = ((int)green_data[1] << 8) | green_data[0]; - - char blue_reg[1] = {154}; - char blue_data[2] = {0,0}; - i2c.write(sensor_addr,blue_reg,1, true); - i2c.read(sensor_addr,blue_data,2, false); - - int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; - - // print sensor readings - - pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n", clear_value, red_value, green_value, blue_value); - wait(0.5); + char clear_reg[1] = {0x94}; // {1001 0100} -> 0x14 and we set 1st bit to 1 + char clear_data[2] = {0,0}; + char red_reg[1] = {0x96}; // {1001 0110} -> 0x16 and we set 1st bit to 1 + char red_data[2] = {0,0}; + char green_reg[1] = {0x98}; // {1001 1000} -> 0x18 and we set 1st bit to 1 + char green_data[2] = {0,0}; + char blue_reg[1] = {0x9A}; // {1001 1010} -> 0x1A and we set 1st bit to 1 + char blue_data[2] = {0,0}; + + // Turn on the led in the sensor + ledColour = 1; + + while (true) { + //If ISR has been executed, we read clear & RGB values + if (readColour) { + readColour = 0; //readColour = false + //Reads clear value + i2c.write(sensor_addr,clear_reg,1, true); + i2c.read(sensor_addr,clear_data,2, false); + + //We store in clear_value the concatenation of clear_data[1] and clear_data[0] + int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; + + //Reads red value + i2c.write(sensor_addr,red_reg,1, true); + i2c.read(sensor_addr,red_data,2, false); + + //We store in red_value the concatenation of red_data[1] and red_data[0] + int red_value = ((int)red_data[1] << 8) | red_data[0]; + + //Reads green value + i2c.write(sensor_addr,green_reg,1, true); + i2c.read(sensor_addr,green_data,2, false); + + //We store in green_value the concatenation of green_data[1] and green_data[0] + int green_value = ((int)green_data[1] << 8) | green_data[0]; + + //Reads blue value + i2c.write(sensor_addr,blue_reg,1, true); + i2c.read(sensor_addr,blue_data,2, false); + + //We store in blue_value the concatenation of blue_data[1] and blue_data[0] + int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; + + // print sensor readings + + pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n\r", clear_value, red_value, green_value, blue_value); + + //Obtains which one is the greatest - red, green or blue + char max = getMax(red_value, green_value, blue_value); + + //Switchs the color of the greatest value. First, we switch off all of them + ledR.write(1); + ledG.write(1); + ledB.write(1); + if (max == 'r') { + ledR.write(0); + pc.printf("R\r\n"); + } else if(max == 'g') { + pc.printf("G\r\n"); + ledG.write(0); + } else { + pc.printf("B\r\n"); + ledB.write(0); + } + + } } - }
diff -r 139238e5829c -r b6c2c1dec5bc mbed.bld --- a/mbed.bld Sat May 09 08:27:06 2015 +0000 +++ b/mbed.bld Wed Oct 16 22:40:54 2019 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/433970e64889 \ No newline at end of file +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file