Daniel Vilela
/
TCS34725_
My Project
main.cpp@1:b6c2c1dec5bc, 2019-10-16 (annotated)
- Committer:
- daniwestside
- Date:
- Wed Oct 16 22:40:54 2019 +0000
- Revision:
- 1:b6c2c1dec5bc
- Parent:
- 0:139238e5829c
My project;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniwestside | 1:b6c2c1dec5bc | 1 | #include "mbed.h" |
daniwestside | 1:b6c2c1dec5bc | 2 | //QUITAR TICKER e implementarlo fuera |
HannesTschofenig | 0:139238e5829c | 3 | |
daniwestside | 1:b6c2c1dec5bc | 4 | I2C i2c(PB_7, PB_6); //pins for I2C communication (SDA, SCL) |
daniwestside | 1:b6c2c1dec5bc | 5 | Serial pc(USBTX, USBRX, 9600); //9600 baudios - used to print some values |
daniwestside | 1:b6c2c1dec5bc | 6 | DigitalOut ledColour(PB_15); // TCS34725 led |
daniwestside | 1:b6c2c1dec5bc | 7 | DigitalOut ledR(PA_4); //RGB led - red light |
daniwestside | 1:b6c2c1dec5bc | 8 | DigitalOut ledG(PH_1); //RGB led - green light |
daniwestside | 1:b6c2c1dec5bc | 9 | DigitalOut ledB(PA_14); //RGB led - blue light |
HannesTschofenig | 0:139238e5829c | 10 | |
daniwestside | 1:b6c2c1dec5bc | 11 | // We set the sensor address. For TCS34725 is 0x29 = 0010 1001 (bin) ->> 0101 0010 (bin) = 0x52 |
daniwestside | 1:b6c2c1dec5bc | 12 | // We shift 1 bit to the left because in I2C protocol slave address is 7-bit. So we discard the 8th bit |
daniwestside | 1:b6c2c1dec5bc | 13 | int sensor_addr = 0x29 << 1; |
daniwestside | 1:b6c2c1dec5bc | 14 | //Variable for ISR |
daniwestside | 1:b6c2c1dec5bc | 15 | bool readColour = false; |
HannesTschofenig | 0:139238e5829c | 16 | |
daniwestside | 1:b6c2c1dec5bc | 17 | Ticker t; |
HannesTschofenig | 0:139238e5829c | 18 | |
daniwestside | 1:b6c2c1dec5bc | 19 | //ISR code |
daniwestside | 1:b6c2c1dec5bc | 20 | void read_colour (void) |
daniwestside | 1:b6c2c1dec5bc | 21 | { |
daniwestside | 1:b6c2c1dec5bc | 22 | readColour = true; |
daniwestside | 1:b6c2c1dec5bc | 23 | } |
HannesTschofenig | 0:139238e5829c | 24 | |
daniwestside | 1:b6c2c1dec5bc | 25 | //Get max value (r,g,b) function |
daniwestside | 1:b6c2c1dec5bc | 26 | char getMax(int r, int g, int b) |
daniwestside | 1:b6c2c1dec5bc | 27 | { |
daniwestside | 1:b6c2c1dec5bc | 28 | char result; |
daniwestside | 1:b6c2c1dec5bc | 29 | int max; |
daniwestside | 1:b6c2c1dec5bc | 30 | if (r < g) { |
daniwestside | 1:b6c2c1dec5bc | 31 | max = g; |
daniwestside | 1:b6c2c1dec5bc | 32 | result = 'g'; |
daniwestside | 1:b6c2c1dec5bc | 33 | } else { |
daniwestside | 1:b6c2c1dec5bc | 34 | max= r; |
daniwestside | 1:b6c2c1dec5bc | 35 | result = 'r'; |
daniwestside | 1:b6c2c1dec5bc | 36 | } |
daniwestside | 1:b6c2c1dec5bc | 37 | if (max < b) { |
daniwestside | 1:b6c2c1dec5bc | 38 | result = 'b'; |
HannesTschofenig | 0:139238e5829c | 39 | } |
daniwestside | 1:b6c2c1dec5bc | 40 | return result; |
daniwestside | 1:b6c2c1dec5bc | 41 | } |
daniwestside | 1:b6c2c1dec5bc | 42 | |
daniwestside | 1:b6c2c1dec5bc | 43 | int main() |
daniwestside | 1:b6c2c1dec5bc | 44 | { |
daniwestside | 1:b6c2c1dec5bc | 45 | |
daniwestside | 1:b6c2c1dec5bc | 46 | t.attach(read_colour, 1.0); // Every second the ticker triggers an interruption |
daniwestside | 1:b6c2c1dec5bc | 47 | green = 1; // LED of B-L072Z-LRWAN1 board on |
daniwestside | 1:b6c2c1dec5bc | 48 | |
daniwestside | 1:b6c2c1dec5bc | 49 | // Connect to the Color sensor and verify whether we connected to the correct sensor. |
daniwestside | 1:b6c2c1dec5bc | 50 | |
daniwestside | 1:b6c2c1dec5bc | 51 | // i2c.frequency(200000); |
daniwestside | 1:b6c2c1dec5bc | 52 | /******************************************************* |
daniwestside | 1:b6c2c1dec5bc | 53 | * id_regval contains command register value: 1001 0010 * |
daniwestside | 1:b6c2c1dec5bc | 54 | * COMMAND REGISTER structure * |
daniwestside | 1:b6c2c1dec5bc | 55 | * 7 | 6 5 | 4 3 2 1 0 * |
daniwestside | 1:b6c2c1dec5bc | 56 | * CMD TYPE ADDR/SF * |
daniwestside | 1:b6c2c1dec5bc | 57 | * * |
daniwestside | 1:b6c2c1dec5bc | 58 | * CMD=1 * |
daniwestside | 1:b6c2c1dec5bc | 59 | * TYPE=00 -> repeated byte protocol transaction * |
daniwestside | 1:b6c2c1dec5bc | 60 | * ADDR/SF= 10010 -> ADDR 0x12 - Device ID * |
daniwestside | 1:b6c2c1dec5bc | 61 | ********************************************************/ |
daniwestside | 1:b6c2c1dec5bc | 62 | |
daniwestside | 1:b6c2c1dec5bc | 63 | |
daniwestside | 1:b6c2c1dec5bc | 64 | |
daniwestside | 1:b6c2c1dec5bc | 65 | |
HannesTschofenig | 0:139238e5829c | 66 | // Initialize color sensor |
daniwestside | 1:b6c2c1dec5bc | 67 | |
daniwestside | 1:b6c2c1dec5bc | 68 | // Timing register address 0x01 (0000 0001). We set 1st bit to 1 -> 1000 0001 |
daniwestside | 1:b6c2c1dec5bc | 69 | char timing_register[2] = {0x81,0x50}; //0x50 ~ 400ms |
HannesTschofenig | 0:139238e5829c | 70 | i2c.write(sensor_addr,timing_register,2,false); |
daniwestside | 1:b6c2c1dec5bc | 71 | |
daniwestside | 1:b6c2c1dec5bc | 72 | // Control register address 0x0F (0000 1111). We set 1st bit to 1 -> 1000 1111 |
daniwestside | 1:b6c2c1dec5bc | 73 | char control_register[2] = {0x8F,0}; //{0x8F, 0x00}, {1000 1111, 0000 0000} -> 1x gain |
HannesTschofenig | 0:139238e5829c | 74 | i2c.write(sensor_addr,control_register,2,false); |
daniwestside | 1:b6c2c1dec5bc | 75 | |
daniwestside | 1:b6c2c1dec5bc | 76 | // Enable register address 0x00 (0000 0000). We set 1st bit to 1 -> 1000 0000 |
daniwestside | 1:b6c2c1dec5bc | 77 | char enable_register[2] = {0x80,0x03}; //{0x80, 0x03}, {1000 0000, 0000 0011} -> AEN = PON = 1 |
HannesTschofenig | 0:139238e5829c | 78 | i2c.write(sensor_addr,enable_register,2,false); |
daniwestside | 1:b6c2c1dec5bc | 79 | |
HannesTschofenig | 0:139238e5829c | 80 | // Read data from color sensor (Clear/Red/Green/Blue) |
daniwestside | 1:b6c2c1dec5bc | 81 | char clear_reg[1] = {0x94}; // {1001 0100} -> 0x14 and we set 1st bit to 1 |
daniwestside | 1:b6c2c1dec5bc | 82 | char clear_data[2] = {0,0}; |
daniwestside | 1:b6c2c1dec5bc | 83 | char red_reg[1] = {0x96}; // {1001 0110} -> 0x16 and we set 1st bit to 1 |
daniwestside | 1:b6c2c1dec5bc | 84 | char red_data[2] = {0,0}; |
daniwestside | 1:b6c2c1dec5bc | 85 | char green_reg[1] = {0x98}; // {1001 1000} -> 0x18 and we set 1st bit to 1 |
daniwestside | 1:b6c2c1dec5bc | 86 | char green_data[2] = {0,0}; |
daniwestside | 1:b6c2c1dec5bc | 87 | char blue_reg[1] = {0x9A}; // {1001 1010} -> 0x1A and we set 1st bit to 1 |
daniwestside | 1:b6c2c1dec5bc | 88 | char blue_data[2] = {0,0}; |
daniwestside | 1:b6c2c1dec5bc | 89 | |
daniwestside | 1:b6c2c1dec5bc | 90 | // Turn on the led in the sensor |
daniwestside | 1:b6c2c1dec5bc | 91 | ledColour = 1; |
daniwestside | 1:b6c2c1dec5bc | 92 | |
daniwestside | 1:b6c2c1dec5bc | 93 | while (true) { |
daniwestside | 1:b6c2c1dec5bc | 94 | //If ISR has been executed, we read clear & RGB values |
daniwestside | 1:b6c2c1dec5bc | 95 | if (readColour) { |
daniwestside | 1:b6c2c1dec5bc | 96 | readColour = 0; //readColour = false |
daniwestside | 1:b6c2c1dec5bc | 97 | //Reads clear value |
daniwestside | 1:b6c2c1dec5bc | 98 | i2c.write(sensor_addr,clear_reg,1, true); |
daniwestside | 1:b6c2c1dec5bc | 99 | i2c.read(sensor_addr,clear_data,2, false); |
daniwestside | 1:b6c2c1dec5bc | 100 | |
daniwestside | 1:b6c2c1dec5bc | 101 | //We store in clear_value the concatenation of clear_data[1] and clear_data[0] |
daniwestside | 1:b6c2c1dec5bc | 102 | int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; |
daniwestside | 1:b6c2c1dec5bc | 103 | |
daniwestside | 1:b6c2c1dec5bc | 104 | //Reads red value |
daniwestside | 1:b6c2c1dec5bc | 105 | i2c.write(sensor_addr,red_reg,1, true); |
daniwestside | 1:b6c2c1dec5bc | 106 | i2c.read(sensor_addr,red_data,2, false); |
daniwestside | 1:b6c2c1dec5bc | 107 | |
daniwestside | 1:b6c2c1dec5bc | 108 | //We store in red_value the concatenation of red_data[1] and red_data[0] |
daniwestside | 1:b6c2c1dec5bc | 109 | int red_value = ((int)red_data[1] << 8) | red_data[0]; |
daniwestside | 1:b6c2c1dec5bc | 110 | |
daniwestside | 1:b6c2c1dec5bc | 111 | //Reads green value |
daniwestside | 1:b6c2c1dec5bc | 112 | i2c.write(sensor_addr,green_reg,1, true); |
daniwestside | 1:b6c2c1dec5bc | 113 | i2c.read(sensor_addr,green_data,2, false); |
daniwestside | 1:b6c2c1dec5bc | 114 | |
daniwestside | 1:b6c2c1dec5bc | 115 | //We store in green_value the concatenation of green_data[1] and green_data[0] |
daniwestside | 1:b6c2c1dec5bc | 116 | int green_value = ((int)green_data[1] << 8) | green_data[0]; |
daniwestside | 1:b6c2c1dec5bc | 117 | |
daniwestside | 1:b6c2c1dec5bc | 118 | //Reads blue value |
daniwestside | 1:b6c2c1dec5bc | 119 | i2c.write(sensor_addr,blue_reg,1, true); |
daniwestside | 1:b6c2c1dec5bc | 120 | i2c.read(sensor_addr,blue_data,2, false); |
daniwestside | 1:b6c2c1dec5bc | 121 | |
daniwestside | 1:b6c2c1dec5bc | 122 | //We store in blue_value the concatenation of blue_data[1] and blue_data[0] |
daniwestside | 1:b6c2c1dec5bc | 123 | int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; |
daniwestside | 1:b6c2c1dec5bc | 124 | |
daniwestside | 1:b6c2c1dec5bc | 125 | // print sensor readings |
daniwestside | 1:b6c2c1dec5bc | 126 | |
daniwestside | 1:b6c2c1dec5bc | 127 | pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n\r", clear_value, red_value, green_value, blue_value); |
daniwestside | 1:b6c2c1dec5bc | 128 | |
daniwestside | 1:b6c2c1dec5bc | 129 | //Obtains which one is the greatest - red, green or blue |
daniwestside | 1:b6c2c1dec5bc | 130 | char max = getMax(red_value, green_value, blue_value); |
daniwestside | 1:b6c2c1dec5bc | 131 | |
daniwestside | 1:b6c2c1dec5bc | 132 | //Switchs the color of the greatest value. First, we switch off all of them |
daniwestside | 1:b6c2c1dec5bc | 133 | ledR.write(1); |
daniwestside | 1:b6c2c1dec5bc | 134 | ledG.write(1); |
daniwestside | 1:b6c2c1dec5bc | 135 | ledB.write(1); |
daniwestside | 1:b6c2c1dec5bc | 136 | if (max == 'r') { |
daniwestside | 1:b6c2c1dec5bc | 137 | ledR.write(0); |
daniwestside | 1:b6c2c1dec5bc | 138 | pc.printf("R\r\n"); |
daniwestside | 1:b6c2c1dec5bc | 139 | } else if(max == 'g') { |
daniwestside | 1:b6c2c1dec5bc | 140 | pc.printf("G\r\n"); |
daniwestside | 1:b6c2c1dec5bc | 141 | ledG.write(0); |
daniwestside | 1:b6c2c1dec5bc | 142 | } else { |
daniwestside | 1:b6c2c1dec5bc | 143 | pc.printf("B\r\n"); |
daniwestside | 1:b6c2c1dec5bc | 144 | ledB.write(0); |
daniwestside | 1:b6c2c1dec5bc | 145 | } |
daniwestside | 1:b6c2c1dec5bc | 146 | |
daniwestside | 1:b6c2c1dec5bc | 147 | } |
HannesTschofenig | 0:139238e5829c | 148 | } |
HannesTschofenig | 0:139238e5829c | 149 | } |