Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MCP23S17 PCF8574 TextLCD eeprom mbed-dev
main.cpp
- Committer:
- jolyon
- Date:
- 2016-08-10
- Revision:
- 0:9d301ae51ecf
- Child:
- 1:d99dad8a1f50
File content as of revision 0:9d301ae51ecf:
#include "mbed.h"
#include "TextLCD.h"
#include "VEML6040.h"
#define FACTOR 1
#define SENSOR_ADDR (41 << 1)
#define WHITE_REG 148
#define SENSOR_RED_REG 148
//-------------------------------------------------------------------------------
//----------- LED's -------------------------------------------------------------
//-------------------------------------------------------------------------------
// Detection LED's use the onboard MBED LED's
// These are all blue on the MBED but on DSE PCB they areas follows
// LED1 = GREEN
// LED2 = BLUE
// LED3 = RED
// LED4 = YELLOW
DigitalOut GreenLed(LED1);
DigitalOut BlueLed(LED2);
DigitalOut RedLed(LED3);
DigitalOut YellowLed(LED4);
//DigitalOut myled(LED1);
//DigitalOut myGreen(p21);
//DigitalOut myYellow(p22);
//DigitalOut myled4(LED4);
//DigitalOut green(LED1);
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//----------- Analogue Inputs ---------------------------------------------------
//-------------------------------------------------------------------------------
//Analogue inputs are used to set thresholds for detector levels
AnalogIn SystemThreshold1(p15);
//AnalogIn SystemThreshold2(p16);
//AnalogIn SystemThreshold3(p17);
//AnalogIn SystemThreshold4(p18);
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//------------ Text display -----------------------------------------------------
//-------------------------------------------------------------------------------
//debug display. Standard display driver set up in 4 bit mode
//final version uses I2C port
TextLCD lcd(p14, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
//set up I2C Communication to LCD
//I2C i2c_lcd(p9,p10); // SDA, SCL
//I2C Portexpander PCF8574 for LCD
//TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//------------ colour sensor Comms Pins -----------------------------------------
//-------------------------------------------------------------------------------
//TMC Sensor: this is the raw I2C Port, the clock like is muxed
I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
typedef struct{
uint16_t White;
uint16_t Red;
uint16_t Green;
uint16_t Blue;
}Colour;
Colour SensorData;
//-------------------------------------------------------------------------------
//------------TSC Stuff----------------
int sensor_addr = 41 << 1;
char TempReg[1] = {0};
char TempData[2] = {0,0};
//------------TSC Stuff----------------
uint16_t Red = 1;
uint16_t Green = 2;
uint16_t Blue = 3;
uint16_t White = 4;
uint32_t AvgRed = 0;
uint32_t AvgGreen = 0;
uint32_t AvgBlue = 0;
uint32_t AvgWhite = 0;
uint32_t Temp = 0;
uint32_t TempR = 0;
uint32_t TempG = 0;
uint32_t TempB = 0;
uint16_t RedProp = 0;
uint16_t GreenProp = 0;
uint16_t BlueProp = 0;
uint16_t myMix = 0;
float MyCCT;
float MyCCTi;
uint8_t DisplayIndex = 0;
uint8_t Config = 0x30;
// bit description setting
// 0 SD, 0 = enabled 0
// 1 AF, 0 = Automode 0
// 2 TRIG, 0 = no trigrer 0
// 3 N/F, 0 0
// 4 IT0 0 0
// 5 IT1 1 = 160ms 1
// 6 IT2 0 0
// 7 N/F 0 0
uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
{
uint32_t Temp = 0;
Temp = *Acc >> factor ;
Temp = *Acc - Temp + NewData;
*Acc = Temp;
return *Acc >> factor;
}
void ConfigureTSC(uint8_t Address)
{
I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
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) {
GreenLed = 0;
wait (2);
GreenLed = 1;
} else {
GreenLed = 1;
}
// Initialize color sensor
char enable_register[2] = {128,3}; //enable the sensor
i2c.write(sensor_addr,enable_register,2,false);
char timing_register[2] = {0x81,0xC0}; //approx 100ms
i2c.write(sensor_addr,timing_register,2,false);
char control_register[2] = {0x8F,2}; //gain = x16
i2c.write(sensor_addr,control_register,2,false);
// Read data from color sensor (Clear/Red/Green/Blue)
//led = 1;
}
int main()
{
//----------------------Initialise My TCS3472--------------------
//Initialise the I2C port
ConfigureTSC(0);
//---------------------- My TCS3472 --------------------
//myled2 = 1;
//myled3 = 1;
//myled4 = 1;
while(1) {
DisplayIndex++;
if(DisplayIndex >= 20) {
DisplayIndex = 0;
}
//myled = 1;
wait(0.1);
//myled = 0;
//wait(0.1);
//get new data
//--------------VEML6040-------------------
// RGBW.getRData(&Red);
// RGBW.getGData(&Green);
// RGBW.getBData(&Blue);
// RGBW.getWData(&White);
//--------------VEML6040-------------------
//----------------------My TCS3472--------------------
//TempReg[0] = 148;
//TempData[0] = 0;
//TempData[1] = 0;
char clear_reg[1] = {148};
char clear_data[2] = {0,0};
i2c.write(SENSOR_ADDR, WHITE_REG,1, true);
i2c.read(sensor_addr,clear_data,2, false);
White = ((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);
Red = ((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);
Green = ((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);
Blue = ((int)blue_data[1] << 8) | blue_data[0];
//----------------------My TCS3472--------------------
//Red filter
//Red = Filter(&AvgRed, Red, FACTOR);
//Green Filter
//Green = Filter(&AvgGreen, Green, FACTOR);
//Blue Filter
//Blue = Filter(&AvgBlue, Blue, FACTOR);
//White Filter
//White = Filter(&AvgWhite, White, FACTOR);
#define USEWHITE //normalised % for each
#ifdef USEWHITE
Temp = (Red+Blue+Green)*10000;
Temp = Temp / White;
TempR = (Red* 10000) / Temp ;
TempG = (Green* 10000) / Temp ;
TempB = (Blue* 10000) / Temp ;
RedProp = (TempR*100) / White;
GreenProp = (TempG*100) / White;
BlueProp = (TempB*100) / White;
#else
// Vn2 without using white....
Temp = (Red+Blue+Green);
RedProp = (Red* 100) / Temp ;
GreenProp = (Green* 100) / Temp ;
BlueProp = (Blue* 100) / Temp ;
//RedProp = (TempR*100) / White;
//GreenProp = (TempG*100) / White;
//BlueProp = (TempB*100) / White;
#endif
//make 12 bit only (display)
Red >>=4;
Green >>=4;
Blue >>=4;
White >>=4;
//lcd.locate(0, 0);
//lcd.printf("%03x %03x %03x %03x",Red,Green,Blue, White);
myMix = GreenProp*1000/RedProp;
lcd.locate(0, 0);
lcd.printf("Mix = %i %i ",myMix, White);
lcd.locate(0, 1);
//lcd.printf("B=%03x W=%03x",Blue,White);
//if(DisplayIndex <=10)
{
//lcd.printf("R %i G %i B %i ",RedProp, GreenProp, BlueProp);
lcd.printf("ADC = %05i ",SystemThreshold1.read_u16()>>4);
}
// else
// {
// MyCCTi = (((float)Red-(float)Blue)/(float)Green) +0.5;
// MyCCT = 4278.6 * pow((double)MyCCTi,(double)-1.2455);
// //lcd.locate(0, 1);
// lcd.printf("CCT = %.2f ",MyCCT);
// }
#define Mix
//guess the colour
//if((Green > 70) && (Red >70)) //looking at intensity somthing is on!
if(White > 15) { //looking at intensity somthing is on!
#ifndef Mix
if((GreenProp <= 30) && (RedProp >=50)) { //pretty sure it's Yellow
myYellow = 1;
myGreen = 0;
} else {
myYellow = 0;
if((GreenProp > 40) && (RedProp <=40)) { //pretty sure it's green
myGreen = 1;
} else {
myGreen = 1;
myYellow = 1;
}
}
#else
//as a single ratio
if((RedProp - GreenProp) > 20) {
//pretty sure it's Yellow
YellowLed = 1;
GreenLed = 0;
} else {
YellowLed = 0;
if((GreenProp - RedProp) > 5) {
//pretty sure it's green
GreenLed = 1;
} else {
GreenLed = 1;
YellowLed = 1;
}
}
/*
if(myMix >1600)
{
myGreen = 1;
myYellow = 0;
}
else
{
if(myMix <1100)
{
myGreen = 0;
myYellow = 1;
}
else
{
myGreen = 1;
myYellow = 1;
}
}
*/
#endif
} else {
//not enough intensity to determine
GreenLed = 0;
YellowLed = 0;
}
}
}
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
//Code for the TCS34725 Part
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
//#include "mbed.h"
//I2C i2c(p9, p10); //pins for I2C communication (SDA, SCL)
//Serial pc(USBTX, USBRX); //Used to view the colors that are read in
//int sensor_addr = 41 << 1;
//DigitalOut green(LED1);
//DigitalOut led(p11);
int TCS3472main()
{
// pc.baud(9600);
GreenLed = 1; // off
// Connect to the Color sensor and verify
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) {
GreenLed = 0;
wait (2);
GreenLed = 1;
} else {
GreenLed = 1;
}
// Initialize color sensor
char timing_register[2] = {129,0};
i2c.write(sensor_addr,timing_register,2,false);
char control_register[2] = {143,0};
i2c.write(sensor_addr,control_register,2,false);
char enable_register[2] = {128,3};
i2c.write(sensor_addr,enable_register,2,false);
// Read data from color sensor (Clear/Red/Green/Blue)
// led = 1;
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);
//The above code displays the red, green, and blue values read in by the color sensor.
wait(0.5);
}
}
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------