本帖最后由 wudianjun2001 于 2018-10-30 09:23 编辑
利用颜色传感器分析颜色,用全彩色LED显示我们通过样品对颜色传感器的动作进行确认后,下一步将对其进行具体的应用。首先,为了正确处理颜色数据,我们必须制作一个简单的电路,即通过颜色传感器判别颜色,并将判别的颜色用全彩色LED显示出来。 将颜色传感器的值通过全彩色LED显示的sketch程序
Code-Example
#include <Wire.h>
#include <BH1745NUC.h>
BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);
void setup() {
byte rc;
Serial.begin(9600);
while (!Serial);
Wire.begin();
rc = bh1745nuc.init();
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop() {
byte rc;
unsigned short rgbc[4];
rc = bh1745nuc.get_val(rgbc);
int rVal = 0;
int gVal = 0;
int bVal = 0;
int maxVal = 0;
if (rc == 0) {
for(int i=0;i&lt;3;i++){
if(maxVal &lt; rgbc){
maxVal = rgbc;
}
}
rVal = (float(rgbc[0])/maxVal)*255;
gVal = (float(rgbc[1])/maxVal)*255;
bVal = (float(rgbc[2])/maxVal)*255;
Serial.print(rVal);
Serial.print(",");
Serial.print(gVal);
Serial.print(",");
Serial.print(bVal);
Serial.print(",");
Serial.print(rgbc[3]);
Serial.println(" ");
}
analogWrite(9,rVal);
analogWrite(10,gVal);
analogWrite(11,bVal);
delay(500);
analogWrite(9,LOW);
analogWrite(10,LOW);
analogWrite(11,LOW);
delay(500);
}
for(int i=0;i<3;i++){
if(maxVal < rgbc){
maxVal = rgbc;
}
}
rVal = (float(rgbc[0])/maxVal)*255;
gVal = (float(rgbc[1])/maxVal)*255;
bVal = (float(rgbc[2])/maxVal)*255;
此程序改变了样本程序的一部分。在红色指定的部分,RGB获取最大值,将其作为最大值(maxVal)保存在变量中,然后与该最大值进行比较,计算出RGB各颜色的强度比率(float(rgbc[0])/maxVal部分)。然后,由于AnalogWrite可输出0~255的值,通过颜色强度比率乘以AnalogWrite的最大值255,将检出的颜色大致转换为RGB,输出到全彩色LED中。 由于试用的全彩色LED的特性不同,有时会出现无法正确反映RGB各值的情况,这种情况下可通过调整LED的电阻值、或者忽略程序中的小值等方法,来获取分级的颜色。在以下程序中,我们将红色字符部分小于50的各值忽略不计,将其作为0来处理。
//设定各颜色的阈值
if(rVal < 50){
rVal = 0;
}
if(gVal < 50){
gVal = 0;
}
if(bVal < 50){
bVal = 0;
}
将颜色传感器的值通过全彩色LED显示的sketch程序2
#include <Wire.h>
#include <BH1745NUC.h>
BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);
void setup() {
byte rc;
Serial.begin(9600);
while (!Serial);
Wire.begin();
rc = bh1745nuc.init();
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop() {
byte rc;
unsigned short rgbc[4];
rc = bh1745nuc.get_val(rgbc);
int rVal = 0;
int gVal = 0;
int bVal = 0;
int maxVal = 0;
if (rc == 0) {
for(int i=0;i&lt;3;i++){
if(maxVal &lt; rgbc){
maxVal = rgbc;
}
}
rVal = (float(rgbc[0])/maxVal)*255;
gVal = (float(rgbc[1])/maxVal)*255;
bVal = (float(rgbc[2])/maxVal)*255;
//それぞれの色の閾値を設定
if(rVal &lt; 50){
rVal = 0;
}
if(gVal &lt; 50){
gVal = 0;
}
if(bVal &lt; 50){
bVal = 0;
}
Serial.print(rVal);
Serial.print(",");
Serial.print(gVal);
Serial.print(",");
Serial.print(bVal);
Serial.print(",");
Serial.print(rgbc[3]);
Serial.println(" ");
}
analogWrite(9,rVal);
analogWrite(10,gVal);
analogWrite(11,bVal);
delay(100);
}
这一边的颜色清晰地反映出来了。整体上的印象是比以往的操作更轻松。 总结不同的颜色传感器、使用方法,有时会出现各自十分有趣的情形。下一次,我们将在颜色传感器的基础上将气压传感器、温度传感器等多个传感器组合在一起,制作出更为智能的照明元器件!
|