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); } } //-----------------------