arduino下不用定时器的TCS3200颜色传感器

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章