【Gravity:AS7341测评】+ 色彩检测器的设计 (兼结题报告)
[复制链接]
将可见光传感器的检测值送往串口来输出显示,在使用上总有些不方便的感觉,若为它配上一个小巧的显示屏将会为之改观,图1至图3就是配置OLED显示屏后的显示效果。
图1 起始界面
图2 前4个通道值显示
图3 后4个通道值显示
要实现这样的显示功能,无非是在原来的色彩检测基础上再添加一个OLED 屏的显示驱动功能。
为此,我们可以令OLED屏的2个I2C引脚与MCU建立如下的连接关系:
SCL1---12
SDA1---11
用I/O来模拟I2C通讯所输出高低电平的语句定义为:
#define SCL1_high digitalWrite(SCL1, HIGH)
#define SCL1_low digitalWrite(SCL1,LOW)
#define SDA1_high digitalWrite(SDA1, HIGH)
#define SDA1_low digitalWrite(SDA1,LOW)
设置2个引脚为输出功能的语句为:
pinMode(SCL1, OUTPUT);
pinMode(SDA1, OUTPUT);
辅助数据传输的相关函数为:
void IIC_Start()
{
SCL1_high;
SDA1_high;
SDA1_low;
SCL1_low;
}
void IIC_Stop()
{
SCL1_low;
SDA1_low;
SCL1_high;
SDA1_high;
}
void IIC_Wait_Ack()
{
SCL1_high;
SCL1_low;
}
实现显示效果的关键程序为:
void setup(void)
{
Serial.begin(115200);
while (as7341.begin() != 0) {
Serial.println("IIC init failed, please check if the wire connection is correct");
delay(1000);
}
pinMode(SCL1, OUTPUT);
pinMode(SDA1, OUTPUT);
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AS7341 TEST",16);
OLED_ShowString(0,2,"jinglixixi",16);
delay(1000);
delay(1000);
OLED_Clear();
OLED_ShowString(0,0,"F1=0 F2=0",16);
OLED_ShowString(0,2,"F3=0 F4=0",16);
delay(1000);
delay(1000);
OLED_ShowString(0,0,"F5=0 F6=0",16);
OLED_ShowString(0,2,"F7=0 F8=0",16);
}
void loop(void)
{
DFRobot_AS7341::sModeOneData_t data1;
DFRobot_AS7341::sModeTwoData_t data2;
as7341.startMeasure(as7341.eF1F4ClearNIR);
data1 = as7341.readSpectralDataOne();
OLED_Clear();
OLED_ShowString(0,0,"F1= F2=",16);
OLED_ShowString(0,2,"F3= F4=",16);
OLED_ShowNum(24,0,data1.ADF1,4,16);
OLED_ShowNum(88,0,data1.ADF2,4,16);
OLED_ShowNum(24,2,data1.ADF3,4,16);
OLED_ShowNum(88,2,data1.ADF4,4,16);
as7341.startMeasure(as7341.eF5F8ClearNIR);
data2 = as7341.readSpectralDataTwo();
delay(1000);
delay(1000);
OLED_Clear();
OLED_ShowString(0,0,"F5= F6=",16);
OLED_ShowString(0,2,"F7= F8=",16);
OLED_ShowNum(24,0,data2.ADF5,4,16);
OLED_ShowNum(88,0,data2.ADF6,4,16);
OLED_ShowNum(24,2,data2.ADF7,4,16);
OLED_ShowNum(88,2,data2.ADF8,4,16);
delay(1000);
delay(1000);
}
图4 是色彩分布的区间,进行相应色彩的检测,特提取了相应的色彩样本以供显示屏来显示,参见图5所示。

图4 色彩分布的区间
图5 色彩样本(F3)
以可见光传感器对色彩样本检测的结果如下:
1)F1色彩样本
RGB(888)色彩值:
0x8B3DC5=( 10001011,00111101,11000101)B
RGB(565)色彩值:
0x89F8
实测值:
F1=3
|
F2=42(1)
|
F3=13
|
F4=12
|
F5=16
|
F6=25(2)
|
F7=18(3)
|
F8=9
|
2)F3色彩样本
RGB(888)色彩值:
0x01 B0 F1=( 00000001,10110000,11110001)B
RGB(565)色彩值:
0x059E
实测值:
F1=4
|
F2=57(1)
|
F3=20
|
F4=27(3)
|
F5=29(2)
|
F6=12
|
F7=5
|
F8=3
|
3)F5色彩样本
RGB(888)色彩值:
0x00AF50=( 00000000,10101111,01010000)B
RGB(565)色彩值:
0x056A
实测值:
F1=2
|
F2=12
|
F3=8
|
F4=19(2)
|
F5=33(1)
|
F6=13(3)
|
F7=4
|
F8=2
|
4)F7色彩样本
RGB(888)色彩值:
0x FF C0 00=(11111111,11000000,00000000)B
RGB(565)色彩值:
0xFE00
实测值:
F1=5
|
F2=9
|
F3=11
|
F4=32
|
F5=41(3)
|
F6=69(1)
|
F7=48(2)
|
F8=22
|
5)F6色彩样本
RGB(888)色彩值:
0x FF FF 01=( 11111111,11111111,00000001)B
RGB(565)色彩值:
0xFFE0
实测值:
F1=4
|
F2=7
|
F3=11
|
F4=42
|
F5=88(2)
|
F6=92(1)
|
F7=54(3)
|
F8=26
|
6)F8色彩样本
RGB(888)色彩值:
0x C1 00 03=(11000001,00000000,00000011)B
RGB(565)色彩值:
0xC000
实测值:
F1=1
|
F2=4
|
F3=3
|
F4=2
|
F5=7
|
F6=29 (1)
|
F7=23(2)
|
F8=9(3)
|
7)F2色彩样本
RGB(888)色彩值:
0x02 51 8C =( 00000010,01010000,10001100)B
RGB(565)色彩值:
0x0291
实测值:
F1=2
|
F2=34(1)
|
F3=12(2)
|
F4=12(3)
|
F5=11
|
F6=5
|
F7=3
|
F8=1
|
8)F4色彩样本
RGB(888)色彩值:
0x02 FE CD =(00000010,11111110,11001101)B
RGB(565)色彩值:
0x0291
实测值:
F1=7
|
F2=67(3)
|
F3=30
|
F4=73(2)
|
F5=74(1)
|
F6=22
|
F7=7
|
F8=4
|
经实际测评,可见光传感器AS7341的性能是比较出色,尤其是在对黄色的识别上,它能够独立识别,而不是以2个色彩的和来识别。比较遗憾的是本想以彩色OLED屏来完成色彩识别仪的设计,怎奈ArduinoUNO开发板的程序存储空间稍小些,无法支撑该设想的实现,尽管单独驱动彩色OLED来完成显示输出是没有问题的,但在加上色彩传感器后,就只有显示起始界面的份儿了,传感器也无法在有限的程序空间内运转。其解决之道就是将ArduinoUNO的程序功能移植到程序存储空间比较大的MCU开发板上,当然这是需要较多时间的。
|