【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)

实验六十三: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)

TCS3200D
是TAOS(Texas Advanced Optoelectronic Solutions)公司推出的可编程彩色光到频率的转换器。它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上还集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器。TCS3200D的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其它逻辑电路相连接。由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单。该颜色传感器主要可用于尿液分析仪,生化分析仪,验钞机等需要检测颜色的产品上。

三原色
三原色指色彩中不能再分解的三种基本颜色,我们通常说的三原色,即品红、黄、青(是青不是蓝,蓝是品红和青混合的颜色)  。三原色可以混合出所有的颜色,同时相加为黑色,黑白灰属于无色系。色光三原色是指红、绿、蓝三色,各自对应的波长分别为700nm,546.1nm,435.8nm,光的三原色和物体的三原色是不同的。光的三原色,按一定比例混合可以呈现各种光色。根据托马斯·杨和赫尔姆豪兹的研究结果.这三种原色确定为红、绿、蓝(相当于颜料中的大红、中绿、群青(紫蓝)的色彩感觉)。彩色电视屏幕就是由这红、绿、蓝三种发光的颜色小点组成的。由这三原色按照不同比例和强弱混合.可以产生自然界的各种色彩变化。颜料和其他不发光物体的三原色是品红(相当于玫瑰红、桃红)、品青(相当于较深的天蓝、湖蓝)、浅黄(相当于柠檬黄)。由英国化学家富勃斯特(1781—1868)研究选定的这三原色可以混合出多种多样的颜色,不过不能调配出黑色,只能混合出深灰色。

色相

是色彩的首要特征,是区别各种不同色彩的最准确的标准。事实上任何黑白灰以外的颜色都有色相的属性,而色相也就是由原色、间色和复色来构成的。色相,色彩可呈现出来的质地面貌。自然界中各个不同的色相是无限丰富的,如紫红、银灰、橙黄等。色相即各类色彩的相貌称谓。

 

色相环(color circle)

是指一种圆形排列的色相光谱(SPECTRUM),色彩是按照光谱在自然中出现的顺序来排列的。暖色(WARM COLOR)位于包含红色和黄色的半圆之内,冷色则包含在绿色和紫色的那个半圆内。互补色(COMPLEMENTARY COLOR)出现在彼此相对的位置上。

 

三原色原理

人眼对红、绿、蓝最为敏感,人的眼睛像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样,绝大多数单色光也可以分解成红、绿、蓝三种色光,这是色度学的最基本的原理,也称三原色原理。白光通过棱镜后被分解成多种颜色逐渐过渡的色谱,颜色依次为红、橙、黄、绿、青、蓝、紫,这就是可见光谱。其中人眼对红、绿、蓝最为敏感,人的眼睛就像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样绝大多数单色光也可以分解成红绿蓝三种色光。这是色度学的最基本原理,即三基色原理。三种基色是相互独立的,任何一种基色都不能有其它两种颜色合成。红绿蓝是三基色,这三种颜色合成的颜色范围最为广泛。红绿蓝三基色按照不同的比例相加合成混色称为相加混色。

红色+绿色=黄色

绿色+蓝色=青色

红色+蓝色=品红

红色+绿色+蓝色=白色

TCS3200是TAOS公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器,TCS3200的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其他逻辑电路相连接,由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单,TCS3200的引脚图

TCS3200采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管,这些二极管分为四种类型,其16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器,其余16个不带有任何滤波器,可以透过全部的光信息,这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时,通过两个可编程的引脚来动态选择所需要的滤波器,该传感器的典型输出频率范围从2Hz-500kHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力。例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS3200的输出频率和计数器相匹配。

 

TCS3200识别颜色的原理
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS3200 传感器上的光的颜色。TCS3200这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。

白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于 TCS3200 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS3200 的RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得TCS3200 对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS3200 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的三个调整参数。

 

TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)

主要参数

  • 尺寸:37*37mm
  • 固定孔:3mm
  • 孔距:22.6*22.6mm
  • 电压:5V
  • 芯片:TCS3200D
  • 端口:数字量
  • 输出:10-12KHz,占空比50%
  • 检测距离:10mm
  • 平台:Arduino 单片机


主要特点

    • 输出占空比50%
    • 所有的引脚全部引出
    • 采用TCS3200D,性能优于TCS230D
    • 所有IO全部引出,可控式LED补光灯
    • 通过程序可以读取颜色的RGB值
    • 适用于静态物体颜色的检测
    • 注意:不能检测灯光的颜色
    • 检测距离1厘米最佳
    • 检测有效距离小于等于5厘米
    • 可直接和单片机连接
    • 采用高亮白色LED灯反射光
    • 静态识别物体颜色,不同颜色输出不同频率

模块电原理图

模块接线

Arduino Uno   <----->   TSC3200颜色传感器

Pin 6                <----->                  S0

Pin 5                <----->                  S1                        

Pin 4                <----->                  S2

Pin 3                <----->                  S3

Pin 2                <----->                 OUT

5V                     <----->                 VCC

GND                <----->                 GND

TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白光LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。它适合于色度计测量应用领域。比如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。

    通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。

    由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。

   TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式,如下图。

     TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择,如下图。

白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。

安装程序中的TimerOne.h库文件的二种办法

1、请下载:

https://github.com/PaulStoffregen/TimerOne

2、安装TimerOne库:IDE—工具—管理库—搜索TimerOne—安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
 
【Arduino】168种传感器模块系列实验(63)
 
实验六十三: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
 
安装TimerOne库:IDE—工具—管理库—搜索TimerOne—安装
 
*/
 
  
 
#include <TimerOne.h>//申明库文件
 
//把TCS3200颜色识别传感器各控制引脚连到Arduino数字端口
 
#define S0     6   //物体表面的反射光越强,TCS3200内置震荡器产生的方波频率越高,
 
#define S1    5   //SO和S1的组合决定输出信号频率比例因子,比例因子为2%
 
//比例因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
 
#define S2     4  //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
 
#define S3     3
 
#define OUT    2 //TCS3200颜色传感器输出信号
 
//在中断函数中纪录TCS3200输出信号的脉冲个数
 
int   g_count = 0;    // 计算与反射光相对应TCS3200颜色传感器输出信号的脉冲数
 
int   g_array[3];     // 存储RGB值
 
int   g_flag = 0;     // 滤波器模式选择顺序标志
 
float g_SF[3];        // 从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
 
//初始化TSC3200各控制引脚的输入输出模式
 
//设置TCS3200的内置振荡器方波频率与其输出信号频率的比例因子为2%
 
void TSC_Init()
 
{
 
   pinMode(S0, OUTPUT);
 
   pinMode(S1, OUTPUT);
 
   pinMode(S2, OUTPUT);
 
   pinMode(S3, OUTPUT);
 
   pinMode(OUT, INPUT);
 
   digitalWrite(S0, LOW);
 
  digitalWrite(S1, HIGH);
 
}
 
//选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
 
void TSC_FilterColor(int Level01, int Level02)
 
{
 
   if(Level01 != 0)
 
     Level01 = HIGH;
 
   if(Level02 != 0)
 
     Level02 = HIGH;
 
   digitalWrite(S2, Level01);
 
   digitalWrite(S3, Level02);
 
}
 
//中断函数,计算TCS3200输出信号的脉冲波
 
void TSC_Count()
 
{
 
   g_count ++ ;
 
}
 
//定时器中断函数,每1S中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
 
//TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
 
void TSC_Callback()
 
{
 
   switch(g_flag)
 
   {
 
     case 0:
 
          Serial.println("->WB Start");
 
          TSC_WB(LOW, LOW);              //选择让红色光线通过滤波器的模式
 
  
 
          break;
 
     case 1:
 
          Serial.print("->Frequency R=");
 
          Serial.println(g_count);    //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
 
          g_array[0] = g_count;       //存储1S内的红光通过滤波器时,TCS3200输出的脉冲个数
 
          TSC_WB(HIGH, HIGH);            //选择让绿色光线通过滤波器的模式
 
  
 
          break;
 
     case 2:
 
          Serial.print("->Frequency G=");
 
          Serial.println(g_count);  //打印1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
 
          g_array[1] = g_count;  //存储1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
 
          TSC_WB(LOW, HIGH);             //选择让蓝色光线通过滤波器的模式
 
  
 
          break;
 
     case 3:
 
          Serial.print("->Frequency B=");
 
          Serial.println(g_count);  //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
 
          Serial.println("->WB End");
 
          g_array[2] = g_count;  //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
 
          TSC_WB(HIGH, LOW);             //选择无滤波器的模式 
 
          break;
 
    default:
 
          g_count = 0;  //计数值清零
 
          break;
 
   }
 
}
 
//设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
 
//该函数被TSC_Callback()调用
 
void TSC_WB(int Level0, int Level1)      //White Balance
 
{
 
   g_count = 0; //计数值清零
 
   g_flag ++;  //输出信号计数标志
 
   TSC_FilterColor(Level0, Level1); //滤波器模式
 
   Timer1.setPeriod(1000000);             // 设置输出信号脉冲计数时长1s
 
}
 
//初始化
 
void setup()
 
{
 
   TSC_Init();
 
   Serial.begin(9600);  //启动串口通信
 
   Timer1.initialize();             // defaulte is 1s缺省是1秒
 
   Timer1.attachInterrupt(TSC_Callback);  //设置定时器1的中断,中断调用函数为TSC_Callbace()
 
  
 
//设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
 
   attachInterrupt(0, TSC_Count, RISING); 
 
   delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数
 
  
 
//通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
 
   for(int i=0; i<3; i++)
 
     Serial.println(g_array);
 
   g_SF[0] = 255.0/ g_array[0];     //红色光比例因子
 
   g_SF[1] = 255.0/ g_array[1] ;    //绿色光比例因子
 
   g_SF[2] = 255.0/ g_array[2] ;    //蓝色光比例因子
 
  
 
//打印白平衡后的红、绿、蓝三色的RGB比例因子
 
   Serial.println(g_SF[0]);
 
   Serial.println(g_SF[1]);
 
   Serial.println(g_SF[2]);
 
}
 
//红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
 
//打印被测物体的RGB值
 
void loop()
 
{
 
    g_flag = 0;//每获得一次被测物体的RGB颜色值时需要4s
 
    for(int i=0; i<3; i++)      //打印被测物体的RGB值
 
     Serial.println(int(g_array * g_SF));
 
    delay(4000);
 
}

  识别接近灰白色的串口输出数据

白色的串口数据

 

实验仿真编程(linkboy3.6)


三种原色的波形,都是255一条线的是白色

在具体项目中,您所检测的是某种特定颜色的物体,可能就像前面图片展示的几种颜色类似,绝不会有连续变化颜色的物体。于是,应该以上述程序获得的被测物体颜色R、G、B值为中心,设置一个距离中心值±20的范围值,在任何环境光条件下,再次检测被测物体的RGB值,只要RGB值落在范围内,就可以认为被测物体是那种特定颜色的物体。这样设定颜色值范围的方法,可以有效提高物体颜色的识别率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
  【Arduino】168种传感器模块系列实验(64)
  实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  实验程序之二:实现简单颜色感应
  
  实验模块接线
  Arduino Uno   <----->   TSC3200颜色传感器
  Pin 6                <----->                  S0
  Pin 5                <----->                  S1
  Pin 4                <----->                  S2
  Pin 3                <----->                  S3
  Pin 2                <----->                 OUT
  5V                   <----->                 VCC
  GND                  <----->                 GND
*/
  
#define S0 6
#define S1 5
#define S2 4
#define S3 3
#define sensorOut 2
  
int frequency = 0;
void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
  
  // 将频率缩放设置为20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  
  Serial.begin(9600);
}
void loop() {
  // 设置要读取的红色滤波光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -49, 255, 0);
  // 在串行监视器上打印值
  Serial.print("R= ");//打印名称
  Serial.print(frequency);//打印红色频率
  Serial.print("  ");
  delay(2000);
   
  // 设置要读取的绿色过滤光电二极管
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -50, 255, 0);
  //在串行监视器上打印值
  Serial.print("G= ");//打印名称
  Serial.print(frequency);//打印绿色频率
  Serial.print("  ");
  delay(2000);
   
  // 设置要读取的蓝色滤光光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -41, 255, 0);
  // 在串行监视器上打印值
  Serial.print("B= ");//打印名称
  Serial.print(frequency);//打印蓝色频率
  Serial.println("  ");
  delay(2000);
}

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
  【Arduino】168种传感器模块系列实验(64)
  实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  实验程序之三:颜色识别感应
  
  实验模块接线
  Arduino Uno   <----->   TSC3200颜色传感器
  Pin 6                <----->                  S0
  Pin 5                <----->                  S1
  Pin 4                <----->                  S2
  Pin 3                <----->                  S3
  Pin 2                <----->                 OUT
  5V                   <----->                 VCC
  GND                  <----->                 GND
*/
  
int s0 = 6, s1 = 5, s2 = 4, s3 = 3;
int out = 2;
int flag = 0;
byte counter = 0;
byte countR = 0, countG = 0, countB = 0;
void setup()
{
  Serial.begin(115200);
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  
}
void TCS()
{
  flag = 0;
  digitalWrite(s1, HIGH);
  digitalWrite(s0, HIGH);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer0_init();
  
}
void ISR_INTO()
{
  counter++;
}
void timer0_init(void)
{
  TCCR2A = 0x00;
  TCCR2B = 0x07; //时钟频率源1024点
  TCNT2 = 100;   //10毫秒再次溢出
  TIMSK2 = 0x01; //允许中断
}
int i = 0;
ISR(TIMER2_OVF_vect)
//计时器2,10ms再次中断溢出,内部溢出中断执行功能
{
  TCNT2 = 100;
  flag++;
  if (flag == 1)
  {
    countR = counter;
    Serial.print("red=");
    Serial.println(countR, DEC);
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
  }
  else if (flag == 2)
  {
    countG = counter;
    Serial.print("green=");
    Serial.println(countG, DEC);
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
  }
  else if (flag == 3)
  {
    countB = counter;
    Serial.print("blue=");
    Serial.println(countB, DEC);
    Serial.println("\n");
    digitalWrite(s2, LOW);
    digitalWrite(s3, LOW);
  
  }
  else if (flag == 4)
  {
    flag = 0;
  }
  counter = 0;
}
  
void loop()
{
  TCS();
  while (1);
}

  

posted @   行者花雕  阅读(2750)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示