Датчик цвета

Fanrin
Offline
Зарегистрирован: 07.12.2014

Пришед датчик цвета tcs3200, сразу стал подключать и столкнулся с одной проблемой

Не могу заставить его выдавать цвет в RGB, вот код:

int s0 = 6, s1 = 7, s2 = 8, s3 = 9;
int out = 5;

int red = 0, blue = 0, green = 0;

void setup() {
	pinMode(s0, OUTPUT);
	pinMode(s1, OUTPUT);
	pinMode(s2, OUTPUT);
	pinMode(s3, OUTPUT);
	pinMode(out, INPUT);

	Serial.begin(9600);
	digitalWrite(s0, HIGH);
	digitalWrite(s1, HIGH);
}

void loop() {
	color();

	Serial.print(red, DEC);

	Serial.print(" : ");
	Serial.print(green, DEC);
	Serial.print(" : ");

	Serial.println(blue, DEC);

	delay(2000);
}

void color() {
	// Rotina que le o valor das cores  
	digitalWrite(s2, LOW);
	digitalWrite(s3, LOW);

	// RED  
	red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
	digitalWrite(s3, HIGH);

	// BLUE  
	blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
	digitalWrite(s2, HIGH);

	// GREEN  
	green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}

Терминал выдает что-то типо: 40 : 22 : 27 (это если подключены светодиоды для освещения)

Без светодиодов тот же цвет будет выглядеть так: 1883 : 3824 : 5554

Как можно это преобразовать в RGB формат?

vov4ik
Offline
Зарегистрирован: 10.09.2013

Попробуйте другой пример, использования датчика.

int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
 {
 Serial.begin(115200);
 pinMode(s0,OUTPUT);
 pinMode(s1,OUTPUT); 
 pinMode(s2,OUTPUT);
 pinMode(s3,OUTPUT);

 }
void TCS()
 {
 flag=0;  
 digitalWrite(s1,HIGH);
 digitalWrite(s0,HIGH);
 digitalWrite(s2,LOW);
 digitalWrite(s3,LOW);
 attachInterrupt(0, ISR_INTO, LOW);
 timer0_init();

 }
void ISR_INTO()
 {
 counter++;
 }
 void timer0_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)
  {
    countR=counter;
    Serial.print("red=");
    Serial.println(countR,DEC);
    digitalWrite(s2,HIGH);
    digitalWrite(s3,HIGH);
  }
  else if(flag==2)
   {
    countG=counter;
    Serial.print("green=");
    Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);
   }
   else if(flag==3)
    {
    countB=counter;
    Serial.print("blue=");
    Serial.println(countB,DEC);
    Serial.println("\n"); 
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
   
    }
    else if(flag==4)
     {
     flag=0;
     }
       counter=0;
}
void loop()
 {
  TCS();
while(1);
 }

 

Fanrin
Offline
Зарегистрирован: 07.12.2014

Интересно то, что выход out как бы очень важен, его даже надо указывать в коде, но он там не используеться

И это решение не рабочее, я уже его пробовал х)

maksim
Offline
Зарегистрирован: 12.02.2012

А еще интереснее то, что для ардуины out это вход. А то что он не используется это вам только кажется attachInterrupt(). Если у вас не Uno или Mega и вы 2-вывод меняете на тот, который вам удобно, естественно, что у вас ничего не работает.