Arduino 白平衡系数计算程序与颜色识别程序(五色:黑白蓝绿红)
程序员文章站
2022-03-27 21:55:11
白平衡系数计算程序:/********************************* 功能:用于白平衡系数的整定和物料颜色检测调试 输出: RED_COE:红色白平衡系数 GREEN_COE:绿色白平衡系数 BLUE_COE:蓝色白平衡系数 r_convert:红色转换值 g_convert:绿色转换值 b_convert:蓝色转换值**********************************///颜色...
白平衡系数计算程序:
/*********************************
功能:用于白平衡系数的整定和物料颜色检测调试
输出:
RED_COE:红色白平衡系数
GREEN_COE:绿色白平衡系数
BLUE_COE:蓝色白平衡系数
r_convert:红色转换值
g_convert:绿色转换值
b_convert:蓝色转换值
**********************************/
//颜色识别传感器
#define S0 14
#define S1 15
#define S2 16
#define S3 17
#define OUT 21
//#define OE 3
volatile float color_count=0; //脉冲计数器 (中断函数变量声明为volatile型)
//颜色返回值定义
#define GREEN_COLOR 1
#define WHITE_COLOR 2
#define RED_COLOR 3
#define BLACK_COLOR 4
#define BLUE_COLOR 5
//初始化函数
void setup() {
// put your setup code here, to run once:
//颜色传感器初始化
pinMode(S0,OUTPUT);
pinMode(S1,OUTPUT);
pinMode(S2,OUTPUT);
pinMode(S3,OUTPUT);
pinMode(OUT,INPUT);
//缩放输出率为20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
//不选择滤波器
digitalWrite(S2,HIGH);
digitalWrite(S3,LOW),
Serial.begin(9600);//串口输出初始化
}
void loop(){
Color_Test();
delay(2000);//等待串口输出
}
/**************************************************************************
函数功能:白平衡系数计算
入口参数:无
返回类型:int
输出:串口输出白平衡系数
***************************************************************************/
int Color_Test(){
float rcount=0,gcount=0,bcount=0; //脉冲计数
float r_coe=0,g_coe=0,b_coe=0; //白平衡系数
unsigned long nowtime=0;
for(int i=0;i<3;i++){ //检测三次降低偶然误差
//红色脉冲
color_count=0;
/***************************************
LOW:低电平触发;
CHANGE:电平变化触发;
RISING :上升沿触发(由LOW变为HIGH);
FALLING:下降沿触发(由HIGH变为LOW);
HIGH:高电平触发(该中断模式仅适用于Arduino due);
*****************************************/
digitalWrite(S2,LOW);//开启红色滤波器
digitalWrite(S3,LOW);
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
rcount=rcount+color_count;
detachInterrupt(2);//关中断
//绿色脉冲
color_count=0;
digitalWrite(S2,HIGH);//开启绿色滤波器
digitalWrite(S3,HIGH);
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
gcount=gcount+color_count;
detachInterrupt(2);//关中断
//蓝色脉冲
color_count=0;
digitalWrite(S2,LOW);//开启蓝色滤波器
digitalWrite(S3,HIGH);
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
bcount=bcount+color_count;
detachInterrupt(2);//关中断
}
//计算白平衡系数
rcount=rcount/3;//取脉冲平均值
gcount=gcount/3;
bcount=bcount/3;
r_coe=255/rcount;//将白色的三色脉冲压缩到255区间。
g_coe=255/gcount;
b_coe=255/bcount;
//输出白平衡系数
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.print("RED_COE:");
Serial.println(r_coe);
Serial.print("GREEN_COE:");
Serial.println(g_coe);
Serial.print("BLUE_COE:");
Serial.println(b_coe);
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
/**************************************************************************
函数功能:脉冲计数(中断函数)
入口参数:无
返回类型:void
返回 值:无
**************************************************************************/
void Color_Count(){
color_count++;
}
颜色识别程序:
/*********************************
功能:用于白平衡系数的整定和物料颜色检测调试
输出:
RED_COE:红色白平衡系数
GREEN_COE:绿色白平衡系数
BLUE_COE:蓝色白平衡系数
r_convert:红色转换值
g_convert:绿色转换值
b_convert:蓝色转换值
**********************************/
//颜色识别传感器
#define S0 14
#define S1 15
#define S2 16
#define S3 17
#define OUT 21
//#define OE 3
volatile float color_count=0; //脉冲计数器 (中断函数变量声明为volatile型)
float r_coe=0.11,g_coe=0.11,b_coe=0.08; //白平衡系数(需要用白平衡系数计算小程序事先计算后填入)
//颜色返回值定义
#define GREEN_COLOR 1
#define WHITE_COLOR 2
#define RED_COLOR 3
#define BLACK_COLOR 4
#define BLUE_COLOR 5
//初始化函数
void setup() {
// put your setup code here, to run once:
//颜色传感器初始化
pinMode(S0,OUTPUT);
pinMode(S1,OUTPUT);
pinMode(S2,OUTPUT);
pinMode(S3,OUTPUT);
pinMode(OUT,INPUT);
//缩放输出率为20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
//不选择滤波器
digitalWrite(S2,HIGH);
digitalWrite(S3,LOW),
Serial.begin(9600);//串口输出初始化
}
void loop(){
switch(Color_Test()){
case GREEN_COLOR:
Serial.println("GREEN");
break;
case WHITE_COLOR:
Serial.println("WHITE");
break;
case RED_COLOR:
Serial.println("RED");
break;
case BLACK_COLOR:
Serial.println("BLACK");
break;
case BLUE_COLOR:
Serial.println("BLUE");
break;
default:break;
}
}
/***********************************(调试完成)
函数功能:物料颜色检测
入口参数:无
返回类型:int
返回 值:物料颜色检测值
注意点:
需要事先用白平衡系数计算程序计算出白平衡系数,填入上方的白平衡系数变量中。
************************************/
int Color_Test(){
float rcount=0,gcount=0,bcount=0; //脉冲计数
float r_convert=0,g_convert=0,b_convert=0; //校准结果
unsigned long nowtime=0;
for(int i=0;i<3;i++){
//红色脉冲
color_count=0;
digitalWrite(S2,LOW);//开启红色滤波器
digitalWrite(S3,LOW);
/*******************************
LOW:低电平触发;
CHANGE:电平变化触发;
RISING :上升沿触发(由LOW变为HIGH);
FALLING:下降沿触发(由HIGH变为LOW);
HIGH:高电平触发(该中断模式仅适用于Arduino due);
********************************/
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
rcount=rcount+color_count;
detachInterrupt(digitalPinToInterrupt(OUT));//关中断
/*
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.print("RED:");
Serial.println(color_count);
*/
//绿色脉冲
color_count=0;
digitalWrite(S2,HIGH);//开启绿色滤波器
digitalWrite(S3,HIGH);
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
gcount=gcount+color_count;
detachInterrupt(digitalPinToInterrupt(OUT));//关中断
/*
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.print("GREEN:");
Serial.println(color_count);
*/
//蓝色脉冲
color_count=0;
digitalWrite(S2,LOW);//开启蓝色滤波器
digitalWrite(S3,HIGH);
attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
nowtime=millis()+200;
while(millis()<nowtime); //检测0.2秒
bcount=bcount+color_count;
detachInterrupt(digitalPinToInterrupt(OUT));//关中断
/*
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.print("BLUE:");
Serial.println(color_count);
*/
}
//用白平衡系数转换脉冲值
r_convert=r_coe*(rcount/3);
g_convert=g_coe*(gcount/3);
b_convert=b_coe*(bcount/3);
/*
//输出物料颜色检测值
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.print("RED:");
Serial.println(r_convert);
Serial.print("GREEN:");
Serial.println(g_convert);
Serial.print("BLUE:");
Serial.println(b_convert);
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
*/
//这部分的判断要自己实验找出白色和黑色的分界点
if((r_convert>180)&&(g_convert>180)&&(b_convert>180)){
//三个值都大于180是白色
return WHITE_COLOR;
}else if((r_convert<80)&&(g_convert<80)&&(b_convert<80)){
//三个值都小于80是黑色
return BLACK_COLOR;
}else if((r_convert > g_convert)&&(r_convert > b_convert)){
//红色值最大就是红色
return RED_COLOR;
}else if((b_convert > r_convert)&&(b_convert > g_convert)){
//蓝色值最大就是蓝色
return BLUE_COLOR;
}else{
//一共五种,剩下就是绿色
return GREEN_COLOR;
}
}
/**************************************************************************
函数功能:脉冲计数(中断函数)
入口参数:无
返回类型:void
返回 值:无
**************************************************************************/
void Color_Count(){
color_count++;
}
本文地址:https://blog.csdn.net/C1664510416/article/details/107966754
上一篇: AWS市场也存安全问题
下一篇: 让你的云更有效的十种方法