// 2017/02/9
// Faya-Nugget 範例程式 (ColorSensor_1.ino)
// 單元: 模組介紹:faya 顏色感測模組
// 網址:https://fayalab.blogspot.com/2018/02/colorsensor.html
// 目標: (1) 利用顏色感應模組測出物體的RGB值
//       (2) 將測出的RGB值顯示在RGB LED模組
// 接線: Arduino ==> faya RGB LED模組
//            12 ==> R
//            11 ==> G
//            10 ==> B
// 接線: Arduino ==> faya 色彩感應模組
//            9 ==> S0
//            8 ==> S1
//            7 ==> S2
//            6 ==> S3
//            5 ==> LED
//            2 ==> OUT

//定義腳位
#define LED_R 12
#define LED_G 11
#define LED_B 10
#define S0 9       
#define S1 8
#define S2 7
#define S3 6
#define LED 5
#define OUT 2

//預設RGB的輸出頻率為0
int frequencyR = 0;
int frequencyG = 0;
int frequencyB = 0;

void setup() {
  //設定腳位輸出為INPUT或OUTPUT
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(OUT, INPUT);
  // 設定頻率縮放到2%
  digitalWrite(S0,LOW); // setting output frequency scalingx
  digitalWrite(S1,HIGH);  // 00 = power down ; 01 = 2%; 10=20%; 11=100%
  //開啟通訊阜
  Serial.begin(9600);
}

void loop() {
  digitalWrite(LED,HIGH);      //開啟LED燈
  R_detect();     //偵測紅光成份
  G_detect();     //偵測綠光成份
  B_detect();     //偵測藍光成份
  digitalWrite(LED,LOW);      //關閉LED燈
  Color_show();   // 判斷顏色並在RGB LED上顯示
  delay(500);
}    
  
void R_detect()  //偵測紅光成份
{
  digitalWrite(S2,LOW);    //開啟紅色濾光器
  digitalWrite(S3,LOW);
  frequencyR = 1000000/pulseIn(OUT, LOW);   // 讀取輸出頻率
  Serial.print("R= ");     // 印出數值在通訊阜上
  Serial.print(frequencyR);
  Serial.print("  ");
}

void G_detect()  //偵測綠光成份
{
  digitalWrite(S2,HIGH);    //開啟綠色濾光器
  digitalWrite(S3,HIGH);
  frequencyG = 1000000/pulseIn(OUT, LOW);    // 讀取輸出頻率
  Serial.print("G= ");   // 印出數值在通訊阜上
  Serial.print(frequencyG);
  Serial.print("  ");
}

void B_detect()   //偵測藍光成份
{
  digitalWrite(S2,LOW);   //開啟藍色濾光器
  digitalWrite(S3,HIGH);
  frequencyB = 1000000/pulseIn(OUT, LOW);   // 讀取輸出頻率
  Serial.print("B= ");   // 印出數值在通訊阜上
  Serial.print(frequencyB);
  Serial.println("  ");
}

void Color_show()  // 判斷顏色並在RGB LED上顯示
{
  if(frequencyR > frequencyG && frequencyR > frequencyB)   //判斷紅色待測物
       {  
         digitalWrite(LED_R,HIGH); }
  else {
         digitalWrite(LED_R,LOW); }

  if(frequencyG > frequencyR && frequencyG > frequencyB)   //判斷綠色待測物
       {
         digitalWrite(LED_G,HIGH); }
  else {
         digitalWrite(LED_G,LOW);}
  
  if(frequencyB > frequencyR && frequencyB > frequencyG)    //判斷藍色待測物
       {
         digitalWrite(LED_B,HIGH); }
  else {
         digitalWrite(LED_B,LOW); }
  
  if(frequencyR > frequencyB && frequencyG > frequencyB && frequencyB < 2000)    //判斷黃色待測物
       {
         digitalWrite(LED_R,HIGH);
         digitalWrite(LED_G,HIGH);
       }

  if(frequencyR > 3000 && frequencyG > 3000 && frequencyB > 3000)    //判斷白色待測物
       {
         digitalWrite(LED_R,HIGH);
         digitalWrite(LED_G,HIGH);
         digitalWrite(LED_B,HIGH);
       }
  
    if(frequencyR < 1000 && frequencyG < 1000 && frequencyB < 1000)    //判斷黑色待測物
       {
         digitalWrite(LED_R,LOW);
         digitalWrite(LED_G,LOW);
         digitalWrite(LED_B,LOW);
       }
}