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

}

 

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