Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器系列实验(64)---TCS3200D颜色识别传感器

[复制链接]
 楼主| 发表于 2022-4-18 20:48 | 显示全部楼层
程序七:Arduino 颜色检测器
1)实验接线示意图(具体有调整)

5.14-40.jpg

 楼主| 发表于 2022-4-18 20:49 | 显示全部楼层
2Arduino参考开源代码(主程序)

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序七:Arduino 颜色检测器(主程序)
  4. */

  5. #include "stationDefines.h"//导入驱动库

  6. /* 液晶显示器 */
  7. #include <Wire.h>
  8. #include <LiquidCrystal_I2C.h>
  9. // 设置 LCD 地址为 0x27; 16个字符2行(使用I2C扫描确认地址)
  10. LiquidCrystal_I2C lcd(0x27, 16, 2);

  11. void setup() {
  12.   pinMode(s0, OUTPUT);
  13.   pinMode(s1, OUTPUT);
  14.   pinMode(s2, OUTPUT);
  15.   pinMode(s3, OUTPUT);
  16.   pinMode(outPin, INPUT); //从传感器输出成为arduino的输入

  17.   // 将频率缩放设置为 100%
  18.   digitalWrite(s0, HIGH);
  19.   digitalWrite(s1, HIGH);

  20.   Serial.begin(9600);
  21.   //lcd.begin();
  22.   //lcd.noBacklight();
  23.   lcd.init();//初始化LCD屏
  24.   lcd.backlight();
  25.   lcd.setCursor(0, 0);
  26.   lcd.print("MJRoBot ColorDet");
  27.   Serial.println("MJRoBot Color Detector");
  28.   startTiming = millis();
  29. }

  30. void loop(){
  31.   getColor();
  32.   if (DEBUG) printData();
  33.   elapsedTime = millis() - startTiming;
  34.   if (elapsedTime > 1000)
  35.   {
  36.     showDataLCD();
  37.     startTiming = millis();
  38.   }
  39.   delay(1000); // 在读数之间等待一秒钟
  40. }
复制代码


 楼主| 发表于 2022-4-18 20:50 | 显示全部楼层
(2)Arduino参考开源代码(副程序之一,保存文件名RGB_Defines

  1. /* 基于 RGB 分量 ==> 确定颜色 */
  2. void getColor(){  
  3.   readRGB();
  4.   
  5.         if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE";
  6.   else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK";
  7.   else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED";
  8.   else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN";
  9.   else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW";
  10.   else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE";
  11.   else  color = "NO_COLOR";
  12. }

  13. /* 读取 RGB 分量 */
  14. void readRGB() {
  15.   red = 0;
  16.   grn = 0;
  17.   blu = 0;
  18.   int n = 10;
  19.   for (int i = 0; i < n; ++i)
  20.   {
  21.     //读取红色组件
  22.     digitalWrite(s2, LOW);
  23.     digitalWrite(s3, LOW);
  24.     red = red + pulseIn(outPin, LOW);
  25.   
  26.     //读取绿色组件
  27.     digitalWrite(s2, HIGH);
  28.     digitalWrite(s3, HIGH);
  29.     grn = grn + pulseIn(outPin, LOW);
  30.    
  31.     //让我们读取蓝色组件
  32.     digitalWrite(s2, LOW);
  33.     digitalWrite(s3, HIGH);
  34.     blu = blu + pulseIn(outPin, LOW);
  35.   }
  36.   red = red/n;
  37.   grn = grn/n;
  38.   blu = blu/n;
  39. }
复制代码


 楼主| 发表于 2022-4-18 20:51 | 显示全部楼层
4Arduino参考开源代码(副程序之二,保存文件名printsplayFunctions

  1. /***************************************************
  2. 在串行监视器上显示捕获的数据
  3. ****************************************************/
  4. void showDataLCD(void)
  5. {
  6.   lcd.clear();
  7.   lcd.setCursor (0,0);
  8.   lcd.print("R");
  9.   lcd.setCursor (1,0);
  10.   lcd.print("    ");
  11.   lcd.setCursor (1,0);
  12.   lcd.print(red);
  13.   lcd.setCursor (5,0);
  14.   lcd.print(" G");
  15.   lcd.setCursor (7,0);
  16.   lcd.print("    ");
  17.   lcd.setCursor (7,0);
  18.   lcd.print(grn);
  19.   lcd.setCursor (12,0);
  20.   lcd.print("B");
  21.   lcd.setCursor (13,0);
  22.   lcd.print("    ");
  23.   lcd.setCursor (13,0);
  24.   lcd.print(blu);
  25.   
  26.   lcd.setCursor (0,1);
  27.   lcd.print("Color: ");
  28.   lcd.setCursor (7,1);
  29.   lcd.print("        ");
  30.   lcd.setCursor (7,1);  
  31.   lcd.print(color);
  32.   
  33. }

  34. /***************************************************
  35. * 在串行监视器上显示捕获的数据
  36. ****************************************************/
  37. void printData(void)
  38. {
  39.   Serial.print("red= ");
  40.   Serial.print(red);
  41.   Serial.print("   green= ");
  42.   Serial.print(grn);
  43.   Serial.print("   blue= ");
  44.   Serial.print(blu);
  45.   Serial.print (" - ");
  46.   Serial.print (color);
  47.   Serial.println (" detected!");
  48. }
复制代码


 楼主| 发表于 2022-4-18 20:53 | 显示全部楼层
5Arduino参考开源代码(相关库文件,保存文件名stationDefines.h

  1. // TCS230 or TCS3200 pins wiring to Arduino
  2. #define s0 4
  3. #define s1 5
  4. #define s2 6
  5. #define s3 7
  6. #define outPin 8

  7. boolean DEBUG = true;

  8. // Variables
  9. int red;
  10. int grn;
  11. int blu;
  12. String color ="";
  13. int count = 0;
  14. long startTiming = 0;
  15. long elapsedTime =0;
复制代码


 楼主| 发表于 2022-4-18 20:55 | 显示全部楼层
6)上述四个文件需要放在一个文件夹内,打开是这样

5.14-41.jpg

 楼主| 发表于 2022-4-18 20:56 | 显示全部楼层
7)实验串口返回情况
5.14-42.jpg

 楼主| 发表于 2022-4-18 20:56 | 显示全部楼层
(8)实验场景图

5.14-43.jpg

 楼主| 发表于 2022-4-18 20:57 | 显示全部楼层
5.14-44.jpg
 楼主| 发表于 2022-4-19 05:58 | 显示全部楼层
颜色传感器简介:
我们看到的颜色实际上是反射光的波长,实际上并不存在,但我们被操纵以这种方式看到它。例如,我们看到的红色在整个可见光谱中具有大约 620 到 750 nm 的特定波长。类似地,蓝色具有大约 450 到 495 nm 的波长。另外,请记住,我们看到的颜色实际上是从表面反射的颜色,而其余颜色则被该特定表面吸收。例如,我们看到一个苹果的红色,因为它是从它身上反射出来的颜色。

当我们看一个物体时,实际发生的是彩色表面反射的光到达我们眼睛后部的视网膜。我们的视网膜有许多感光细胞,它们对光做出反应,并在大脑中启动一个化学过程,将光感知为一种特定的颜色。

在计算机中,传感器有助于区分光线。例如,如果我们使用一个简单的光敏电阻(LDR)来检测两个不同颜色表面上的颜色;比如让我们说,红色和蓝色。我们将首先在两个表面上照射红光,红色表面会反射光线,而蓝色表面会吸收光线。因此,对于 LDR,红色表面会显得很亮。同样,当我们照射蓝光时,红色表面会吸收它,而蓝色表面会反射它,蓝色表面看起来很亮。



33.jpg

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-11-29 23:01 , Processed in 0.072724 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表