參考dfrobot官方示例:http://wiki.dfrobot.com.cn/index.php?title=(SKU:SEN0101)TCS3200%E9%A2%9C%E8%89%B2%E4%BC%A0%E6%84%9F%E5%99%A8
TCS3200顏色傳感器是一款全綵的顏色檢測器,包括了一塊TAOS TCS3200RGB感應芯片和4個白色LED燈,TCS3200能在一定的範圍內檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個都有紅綠藍和清除4種濾光器。每6種顏色濾光器均勻地按數組分佈來清除顏色中偏移位置的顏色分量。內置的振盪器能輸出方波,其頻率與所選擇的光的強度成比例關係。
代碼接法如上圖
代碼主要使用millis()函數來切換不同的濾波器,用以下形式控制切換頻率
if (millis() > nextTime1) {
nextTime1 = millis() + 30;
}
通過上述形式 實現了求取讀取到五次以後的平均值,並實現白平衡的效果
代碼可修改爲只使用一次上述形式 通過一個變量計數來實現後續代碼的同樣效果。
int s0 = 3, s1 = 4, s2 = 5, s3 = 6;//接口定義
int out = 2;//接口定義
int flag = 0;//濾波器切換變量
unsigned long counter = 0;//中斷計數
unsigned long countR = 0, countG = 0, countB = 0;//RGB分量計數
unsigned long nextTime = 0;//頻率控制變量
unsigned long nextTime1 = 10;//頻率控制變量
unsigned long nextTime2 = 50;//頻率控制變量
int Rinput[5] = {0};//儲存五次頻率
int Ginput[5] = {0};//儲存五次頻率
int Binput[5] = {0};//儲存五次頻率
int Raverage = 0;//頻率的平均值
int Baverage = 0;//頻率的平均值
int Gaverage = 0;//頻率的平均值
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
flag = 0;
digitalWrite(s1, HIGH);//設置輸出頻率定標
digitalWrite(s0, HIGH);//設置輸出頻率定標
attachInterrupt(0, ISR_INTO, CHANGE);//中斷計數
}
void ISR_INTO()//中斷計數
{
counter++;
}
void readColor()// 每10ms間隔的電平變化次數
if (flag == 0)
{
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
counter = 0;
}
if (flag == 1)
{
countR = counter;
// Serial.print(millis());
// Serial.print("red=");
// Serial.println(countR);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
}
else if (flag == 2)
{
countG = counter;
// Serial.print(millis());
// Serial.print("green=");
// Serial.println(countG);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
}
else if (flag == 3)
{
countB = counter;
// Serial.print(millis());
// Serial.print("blue=");
// Serial.println(countB);
// Serial.println("\n");
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
}
flag += 1;
if (flag == 4)
{
flag = 1;
}
counter = 0;
}
int num = 0;
void loop() {
// put your main code here, to run repeatedly:
if (millis() > nextTime) {
readColor();
nextTime = millis() + 10;
}
if (millis() > nextTime1) {//每30ms讀取全部RGB
Rinput[num] = countR;
Ginput[num] = countG;
Binput[num] = countB;
num++;
if (num == 5)
num = 0;
nextTime1 = millis() + 30;
}
if (millis() > nextTime2) {//每150ms進行一次求平均值
for (int i = 0; i <= 4; i++) {
Raverage += Rinput[i];
Baverage += Binput[i];
Gaverage += Ginput[i];
}
Raverage = Raverage / 5;
Baverage = Baverage / 5;
Gaverage = Gaverage / 5;
Serial.print("Raverage ");
Serial.print(Raverage);
Serial.print(" Gaverage ");
Serial.print(Gaverage);
Serial.print(" Baverage ");
Serial.println(Baverage );
// float Raverage_rate = 255.0 / Raverage;//測量白平衡 在白色物體上測量
// float Gaverage_rate = 255.0 / Gaverage;
// float Baverage_rate = 255.0 / Baverage;
// Serial.print("Raverage_rate ");//測量白平衡 在白色物體上測量 打印
// Serial.print(Raverage_rate);
// Serial.print(" Gaverage_rate ");
// Serial.print(Gaverage_rate);
// Serial.print(" Baverage_rate ");
// Serial.println(Baverage_rate );
float Raverage_rate = 0.2;//白平衡
float Gaverage_rate = 0.2;
float Baverage_rate = 0.15;
Serial.print("R ");
Serial.print(Raverage * Raverage_rate);//顯示RGB值
Serial.print(" G ");
Serial.print(Gaverage * Gaverage_rate);
Serial.print(" B ");
Serial.println(Baverage * Baverage_rate );
nextTime2 = millis() + 150;
}
}