参考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;
}
}