-
سنسور تشخیص رنگ
سلام در کد سنسور tcs320 یه مشکلی دارم . وقتی که سنسور رنگ قرمز رو تشخیص بده یه جای led قرمز تمام led ها روشن می شن . و برای رنگ سبز و آب هم همین طوره همه ی led ها روشن می شن مشکل از کجاست ؟؟؟؟؟
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int redLed = 10;
int greenLed = 11;
int blueLed = 12;
int red = 0;
int green = 0;
int blue = 0;
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(blueLed, OUTPUT);
// Setting frequency-scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
Serial.begin(9600);
}
void loop() {
// Setting red filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
if( frequency = map(frequency, 25,72,255,0));
// Printing the value on the serial monitor
Serial.print("RED= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
digitalWrite(redLed, HIGH); // Turn RED LED ON
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
delay(1000);
// Setting Green filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
else if (frequency = map(frequency, 30,90,255,0));
// Printing the value on the serial monitor
Serial.print("GREEN= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH); // Turn GREEN LED ON
digitalWrite(blueLed, LOW);
delay(1000);
// Setting Blue filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
else if ( frequency = map(frequency, 25,70,255,0));
// Printing the value on the serial monitor
Serial.print("BLUE= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.println(" ");
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, HIGH); // Turn BLUE LED ON
delay(1000);
}
ممنون میشم اگه مشکلم رو حل کنید .....
-
دوست عزیز چند تا مشکل دارید.
اول اینکه شما سه بار سه جای مختلف داری دیتای سنسور رو میخونی که اصلا نیازی به این کار نیست
شما یه بار داده سنسور رو بخون
رو همون یک بار شرطاتو بنویس
مشکل دوم اینه که کلا به پرانتز برای if هات اعتقاد نداری
این کد رو تست بگیر:
کد:
const int s0 = 8;
const int s1 = 9;
const int s2 = 12;
const int s3 = 11;
const int out = 10;
//Pinos dos leds
int pinoledverm = 2;
int pinoledverd = 3;
int pinoledazul = 4;
//Variaveis que armazenam o valor das cores
int red = 0;
int green = 0;
int blue = 0;
void setup()
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
pinMode(pinoledverm, OUTPUT);
pinMode(pinoledverd, OUTPUT);
pinMode(pinoledazul, OUTPUT);
Serial.begin(9600);
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
}
void loop()
{
color(); //Chama a rotina que le as cores
//Mostra no serial monitor os valores detectados
Serial.print("Vermelho :");
Serial.print(red, DEC);
Serial.print(" Verde : ");
Serial.print(green, DEC);
Serial.print(" Azul : ");
Serial.print(blue, DEC);
Serial.println();
//Verifica se a cor vermelha foi detectada
if (red < blue && red < green && red < 100)
{
Serial.println("Vermelho");
digitalWrite(pinoledverm, HIGH); //Acende o led vermelho
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, LOW);
}
//Verifica se a cor azul foi detectada
else if (blue < red && blue < green)
{
Serial.println("Azul");
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, HIGH); //Acende o led azul
}
//Verifica se a cor verde foi detectada
else if (green < red && green < blue)
{
Serial.println("Verde");
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, HIGH); //Acende o led verde
digitalWrite(pinoledazul, LOW);
}
Serial.println();
//Aguarda 2 segundos, apaga os leds e reinicia o processo
delay(2000);
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, LOW);
}
void color()
{
//Rotina que le o valor das cores
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
//count OUT, pRed, RED
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
//count OUT, pBLUE, BLUE
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
//count OUT, pGreen, GREEN
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
-
-
یه سوال دیگه تو کدی که فرستادم کدوم خط رو باید تو دستور if بزارم ؟؟؟؟
-
تو این کد می خوام led قرمز دو ثانیه یک بار چشمک بزنه و led سبز یک ثانیه یک بار و led ابی سه ثانیه یک بار باید چیکار کنم ؟؟؟
[QUOTE][/
int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
int redLed = 10;
int greenLed = 11;
int blueLed = 12;
int red = 0;
int green = 0;
int blue = 0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(blueLed, OUTPUT);
}
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; //the clock frequency source 1024 points
TCNT2= 100; //10 ms overflow again
TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
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");
digitalWrite(redLed, HIGH); // Turn RED LED ON
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
delay(1000);
}
else if((countG<=countR)&&(countG<countB))
{
Serial.print("green");
Serial.print("\n");
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH); // Turn GREEN LED ON
digitalWrite(blueLed, LOW);
delay(1000);
}
else if((countB>countG)&&(countB>countR))
{
Serial.print("blue");
Serial.print("\n");
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, HIGH);
delay(1000);
}
}
else
{
delay(1000);
}
}
QUOTE]
SEO by vBSEO