1、概述
通过手上现有的模块,做一个颜色识别感应灯。当周围环境颜色改变,RGB灯同时跟随环境颜色改变灯的颜色。适用氛围灯、卧室小夜灯等
对于模块不了解的,可以先看一下我们的模块教程[传送门],了解掌握模块使用方法后,再尝试本小实验。因为综合实验一般涉及多个模块,我们仅对全部使用我司产品的客户做技术支持,若只是部分使用我司产品的,我们只对我司产品部分是否有故障进行排查。
2、所需材料
1、UNO主控板:官方板 或者 国产板
2、辅助配件:面包板、杜邦线
3、传感器和模块:RGB LED模块、颜色识别传感器
3、接线
RGB LED模块 | Arduino |
---|---|
GND | GND |
R | D3 |
G | D5 |
B | D6 |
颜色识别传感器 | Arduino |
---|---|
GND | GND |
S0 | D8 |
S1 | D9 |
S2 | D10 |
S3 | D11 |
OUT | D2 |
OE | GND |
4、示例程序
#include <Metro.h> // 函数库
#include <math.h>
Metro ledlightup = Metro(60,true);
Metro processdata = Metro(50,true);
Metro TcsTrigger = Metro(10,true);
int s0=8,s1=9,s2=10,s3=11; // 颜色传感器端口定义
int out=2;
int flag=0; //变量初始化
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
analogWrite(3,0);
analogWrite(5,0);
analogWrite(6,0);
}
void TCS()
{
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
attachInterrupt(0, ISR_INTO, CHANGE);
}
void ISR_INTO()
{
counter++;
}
int Raverage = 0;
int Baverage = 0;
int Gaverage = 0;
void loop() // 函数调用
{
TCS();
if(TcsTrigger.check()){
Tcstrigger();
}
if(processdata.check()){
procedata();
}
if(ledlightup.check()){
ledup();
}
}
void Tcstrigger() // 数据采集
{
flag++;
if(flag==1){
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
countR=counter;
digitalWrite(s2,HIGH);
digitalWrite(s3,HIGH);
}
else if(flag==2){
countG=counter;
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
}
else if(flag==3){
countB=counter;
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
flag=0;
}
counter=0;
}
void procedata() // 数据处理
{
static int Rinput[5] ={
0,0,0,0,0 }
,Binput[5] ={
0,0,0,0,0 }
,Ginput[5] ={
0,0,0,0,0 };
for(int i = 4;i > 0;i--){
Rinput[i] = Rinput[i-1];
Binput[i] = Binput[i-1];
Ginput[i] = Ginput[i-1];
}
if(countR < 2500)
Rinput[0] = countR;
else
Rinput[0] = Rinput[1];
if(countB < 2500)
Binput[0] = countB;
else
Binput[0] = Binput[1];
if(countG < 2500)
Ginput[0] = countG;
else
Ginput[0] = Ginput[1];
Raverage = 0;
0
Baverage = 0;
Gaverage = 0;
for(int i = 0;i <= 4;i++){
Raverage += Rinput[i];
Baverage += Binput[i];
Gaverage += Ginput[i];
}
Raverage /= 5;
Baverage /= 5;
Gaverage /= 5;
}
void ledup() //数据输出
{
int ledvalueR = Raverage;
int ledvalueG = Gaverage;
int ledvalueB = Baverage;
ledvalueR = constrain(ledvalueR,350,1700);
ledvalueB = constrain(ledvalueB,350,1500);
ledvalueG = constrain(ledvalueG,350,1650);
Serial.print("R:");
Serial.print(Raverage,DEC);
Serial.print(" ");
Serial.print(ledvalueR,DEC);
Serial.print("B:");
Serial.print(Baverage,DEC);
Serial.print(" ");
Serial.print(ledvalueB,DEC);
Serial.print("G:");
Serial.print(Gaverage,DEC);
Serial.print(" ");
Serial.println(ledvalueG,DEC);
ledvalueR = map(ledvalueR,350,1700,0,255);
ledvalueB = map(ledvalueB,350,1500,0,255);
ledvalueG = map(ledvalueG,350,1650,0,255);
analogWrite(3,ledvalueR);
analogWrite(6,ledvalueB);
analogWrite(5,ledvalueG);
}
#include <math.h>
Metro ledlightup = Metro(60,true);
Metro processdata = Metro(50,true);
Metro TcsTrigger = Metro(10,true);
int s0=8,s1=9,s2=10,s3=11; // 颜色传感器端口定义
int out=2;
int flag=0; //变量初始化
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
analogWrite(3,0);
analogWrite(5,0);
analogWrite(6,0);
}
void TCS()
{
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
attachInterrupt(0, ISR_INTO, CHANGE);
}
void ISR_INTO()
{
counter++;
}
int Raverage = 0;
int Baverage = 0;
int Gaverage = 0;
void loop() // 函数调用
{
TCS();
if(TcsTrigger.check()){
Tcstrigger();
}
if(processdata.check()){
procedata();
}
if(ledlightup.check()){
ledup();
}
}
void Tcstrigger() // 数据采集
{
flag++;
if(flag==1){
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
countR=counter;
digitalWrite(s2,HIGH);
digitalWrite(s3,HIGH);
}
else if(flag==2){
countG=counter;
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
}
else if(flag==3){
countB=counter;
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
flag=0;
}
counter=0;
}
void procedata() // 数据处理
{
static int Rinput[5] ={
0,0,0,0,0 }
,Binput[5] ={
0,0,0,0,0 }
,Ginput[5] ={
0,0,0,0,0 };
for(int i = 4;i > 0;i--){
Rinput[i] = Rinput[i-1];
Binput[i] = Binput[i-1];
Ginput[i] = Ginput[i-1];
}
if(countR < 2500)
Rinput[0] = countR;
else
Rinput[0] = Rinput[1];
if(countB < 2500)
Binput[0] = countB;
else
Binput[0] = Binput[1];
if(countG < 2500)
Ginput[0] = countG;
else
Ginput[0] = Ginput[1];
Raverage = 0;
0
Baverage = 0;
Gaverage = 0;
for(int i = 0;i <= 4;i++){
Raverage += Rinput[i];
Baverage += Binput[i];
Gaverage += Ginput[i];
}
Raverage /= 5;
Baverage /= 5;
Gaverage /= 5;
}
void ledup() //数据输出
{
int ledvalueR = Raverage;
int ledvalueG = Gaverage;
int ledvalueB = Baverage;
ledvalueR = constrain(ledvalueR,350,1700);
ledvalueB = constrain(ledvalueB,350,1500);
ledvalueG = constrain(ledvalueG,350,1650);
Serial.print("R:");
Serial.print(Raverage,DEC);
Serial.print(" ");
Serial.print(ledvalueR,DEC);
Serial.print("B:");
Serial.print(Baverage,DEC);
Serial.print(" ");
Serial.print(ledvalueB,DEC);
Serial.print("G:");
Serial.print(Gaverage,DEC);
Serial.print(" ");
Serial.println(ledvalueG,DEC);
ledvalueR = map(ledvalueR,350,1700,0,255);
ledvalueB = map(ledvalueB,350,1500,0,255);
ledvalueG = map(ledvalueG,350,1650,0,255);
analogWrite(3,ledvalueR);
analogWrite(6,ledvalueB);
analogWrite(5,ledvalueG);
}
在颜色传感器前放置不同的颜色,RGB灯对应的显示不同颜色。
请先
!