My Project

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }