Senzorul detecție culoare TCS230 și Arduino
Detecția culorii RGB cu senzorul TCS230 și afișarea pe un LCD
Cod:
//–––––––
/* Definire pini TCS230*/
#define S0 2 //SO pin to arduino D2 pin
#define S1 3 //S1 pin to arduino D3 pin
#define S2 4 //S2 pin to arduino D4 pin
#define S3 5 //S3 pin to arduino D5 pin
#define OP 6 //Output pin to arduino D6 pin
/*Initialling the value of variable to 0*/
int R = 0; //Initial value of RED Color is 0
int B = 0; //Initial value of BLUE Color is 0
int G = 0; //Initial value of GREEN Color is 0
unsigned int frequency1 = 0; //Initial frequency for RED is 0
unsigned int frequency2 = 0; //Initial frequency for BLUE is 0
unsigned int frequency3 = 0; //Initial frequency for GREEN is 0
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//RS,EN,D4,D5,D6,D7
void setup()
{
lcd.begin(16, 2);
pinMode(S0, OUTPUT); //Assigning arduino pin D2 as output
pinMode(S1, OUTPUT); //Assigning arduino pin D3 as output
pinMode(S2, OUTPUT); //Assigning arduino pin D4 as output
pinMode(S3, OUTPUT); //Assigning arduino pin D5 as output
pinMode(OP, INPUT); //Assigning arduino pin D6 as input
/*Frequency is set for 20% so according to truth table
SO pin must be at high potential and S1 pin at low potential*/
digitalWrite(S0,HIGH); //Making arduino pin D2 HIGH (+5V)
digitalWrite(S1,LOW); //Making arduino pin D3 LOW (GND)
Serial.begin(9600);
lcd.setCursor(0,0);
lcd.print(„Arduino Color”);
lcd.setCursor(0,1);
lcd.print(” Detector „);
delay(2000);
lcd.clear();
}
void loop()
{
/*checking for red color*/
digitalWrite(S2,LOW); //Making arduino pin D4 LOW (GND)
digitalWrite(S3,LOW); //Making arduino pin D5 LOW (GND)
frequency1 = pulseIn(OP, LOW); //Reading frequency for RED using pulseIN function
Serial.print(„R=”);
Serial.println(frequency1); //Displaying frequency of RED on serial monitr
R = frequency1; //assigning value of Red frequiency to R
delay(50); // 50 milli seconds delay
/*checking for blue color*/
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);// setting for BLUE color sensor
frequency2 = pulseIn(OP, LOW);//Reading frequency for BLUE using pulseIN function
Serial.print(„B=”);
Serial.println(frequency2); //Displaying frequency of BLUE on serial monitr
B = frequency2; //assigning value of BLUE frequiency to B
delay(50); // 50 milli seconds delay
/*checking for green color*/
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);// setting for GREEN color sensor
frequency3 = pulseIn(OP, LOW); //Reading frequency for GREEN using pulseIN function
Serial.print(„G=”);
Serial.println(frequency3); //Displaying frequency of GREEN on serial monitr
G = frequency3; //assigning value of GREEN frequiency to G
delay(50); // 50 milli seconds delay
Serial.println(„stop”);
/*Change the value of R, B and G with the value you have measured */
/*Checking for RED color if the value of R and G lies between below defined value
LCD display RED color*/
if(R<90 & R>45 & G<185 & G>130)
{
lcd.setCursor(0,0);
lcd.print(” RED „);
}
/*Checking for ORANGE color if the value of B and G lies between below defined value
LCD display ORANGE color*/
if(G<155 & G>120 & B<155 &B>115)
{
lcd.setCursor(0,0);
lcd.print(„ORANGE”);
}
/*Checking for GREEN color if the value of R and G lies between below defined value
LCD display GREEN color*/
if(R<150 & R>110 & G<160 & G>140)
{
lcd.setCursor(0,0);
lcd.print(” GREEN”);
}
/*Checking for YELLOW color if the value of R and G lies between below defined value
LCD display YELLOW color*/
if(R<80 & R>40 & G<120 & G>80)
{
lcd.setCursor(0,0);
lcd.print(„YELLOW”);
}
/*Checking for VOILET color if the value of R and G lies between below defined value
LCD display VOILET color*/
if(R<90 & R>60 & B<110 & B>75)
{
lcd.setCursor(0,0);
lcd.print(„VOILET”);
}
/*Checking for MAGENTA color if the value of R and G lies between below defined value
LCD display MAGENTA color*/
if(G<115 & G>80 & B<100 & B>50)
{
lcd.setCursor(0,0);
lcd.print(„MAGENTA”);
}
/*Checking for BLUE color if the value of B and G lies between below defined value
LCD display BLUE color*/
if (G<235 & G>165 & B<190 &B>110)
{
lcd.setCursor(0,0);
lcd.print(” BLUE „);
}
/*Checking for BLACK color if the value of B and G lies between below defined value
LCD display BLACK color*/
if (R<200 & R>150 & G<270 &G>210)
{
lcd.setCursor(0,0);
lcd.print(” BLACK „);
}
delay(2000); //2 second delay only for pause the screen
lcd.clear(); // Clear the screen
}
//–––––––––
Sau alt cod pentru SerialMonitor:
//–––––––––
int s0=3,s1=4,s2=5,s3=6,LED=8;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(9600);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
digitalWrite(LED,HIGH);
}
void TCS()
{
digitalWrite(s1,HIGH);
digitalWrite(s0,LOW);
flag=0;
attachInterrupt(0, ISR_INTO, CHANGE);
timer2_init();
}
void ISR_INTO()
{
counter++;
}
void timer2_init(void)
{
TCCR2A=0x00;
TCCR2B=0x07;
TCNT2= 100;
TIMSK2 = 0x01;
}
int i=0;
ISR(TIMER2_OVF_vect)
{
TCNT2=100;
flag++;
if(flag==1)
{
counter=0;
}
else if(flag==2)
{
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
countR=counter/1.051;
Serial.print("red=");
Serial.println(countR,DEC);
digitalWrite(s2,HIGH);
digitalWrite(s3,HIGH);
}
else if(flag==3)
{
countG=counter/1.0157;
Serial.print("green=");
Serial.println(countG,DEC);
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
}
else if(flag==4)
{
countB=counter/1.114;
Serial.print("blue=");
Serial.println(countB,DEC);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
}
else
{
flag=0;
TIMSK2 = 0x00;
}
counter=0;
delay(2);
}
void loop()
{
delay(10);
TCS();
if((countR>10)||(countG>10)||(countB>10))
{
if((countR>countG)&&(countR>countB))
{
Serial.print("red");
Serial.print("\n");
delay(1000);
}
else if((countG>=countR)&&(countG>countB))
{
Serial.print("green");
Serial.print("\n");
delay(1000);
}
else if((countB>countG)&&(countB>countR))
{
Serial.print("blue");
Serial.print("\n");
delay(1000);
}
}
else
{
delay(1000);
}
}
//-----------------------

