简介
您对颜色了解多少?您想了解真正的颜色吗?眼睛可能会欺骗您,但是传感器不会。AS7341可见光传感器可以告诉您最真实的颜色。
AS7341可见光传感器采用业内知名的ams公司推出的新一代AS7341光谱传感IC。该传感器有8个可见光通道、1个闪烁通道、1个NIR通道和1个未加滤光片的通道。该传感器拥有6个独立的16位ADC通道,可以并行的处理数据。该传感器板载了两颗高亮LED,可在暗光环境下进行补光。
RGB颜色传感器和AS7341可见光传感器对比(以黄色为例)
黄色LED | WS2812模拟黄色 | |
---|---|---|
RGB颜色传感器识别结果 | 红色+绿色 | 红色+绿色 |
AS7341可见光传感器识别结果 | 黄色 | 红色+绿色 |
您可以在此了解一些有关可见光的知识。
特性
- 8个可见光通道
- 50Hz或60Hz的环境光闪烁检测
- 6个独立的16位ADC通道
应用场景
- 高准度色彩检测与匹配
- 颜色混合效果检测
- 灯光色温调节
- 灯光氛围控制
- 植物养殖
技术规格
- 供电电压:3.3V~5V
- 可见光测量范围:F1(405-425nm)、F2(435-455nm)、F3(470-490nm)、F4(505-525nm)、F5(545-565nm)、F6(580-600nm)、F7(620-640nm)、F8(670-690nm)
- 工作电流(不打开LED):<5mA
- LED驱动电流:1-20等级(4-42mA)
- I2C地址:0x39
- 工作温度范围:-30℃~85℃
- 工作湿度范围:5%RH~85%RH
- 产品尺寸:18*14mm
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | VCC | 电源正极 |
2 | GND | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | INT | 中断引脚:低电平有效 |
6 | GPIO | 通用输入输出 |
使用教程
准备
- 硬件
- 1 x Arduino UNO控制板
- 1 x AS7341可见光传感器
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
- AS7341库文件和示例程序
关于如何安装库文件,点击链接
- 主要API接口函数列表
/**
* @brief 设置增益值(0~10对应 X0.5,X1,X2,X4,X8,X16,X32,X64,X128,X256,X512)
* @param CFG1寄存器的值.
*/
void setAGAIN(uint8_t value);
/**
* @brief 开始光谱的测量.
* @param 通道映射的模式 :1.eF1F4ClearNIR,2.eF5F8ClearNIR
*/
void startMeasure(eChChoose_t mode);
/**
* @brief 读取传感器数据通道0~5的值,eF1F4ClearNIR模式下.
* @return sModeOneData_t 的数据
*/
sModeOneData_t readSpectralDataOne();
/**
* @brief 读取传感器数据通道0~5的值,eF5F8ClearNIR模式下.
* @return sModeTwoData_t 的数据
*/
sModeTwoData_t readSpectralDataTwo();
/**
* @brief 读取flicker寄存器的值,可据此预计光源的闪烁频率
* @return flicker寄存器的数据.
*/
uint8_t readFlickerData();
/**
* @brief 打开或关闭LED
* @param true or false
*/
void enableLed(bool on);
/**
* @brief 设置引脚电流控制亮度(1~20对应电流 4mA,6mA,8mA,10mA,12mA,......,42mA)
* @param 1~20
*/
void controlLed(uint8_t current);
接线图
样例代码1 - 读取数据
读取光谱传感器10个光通道的数值,光源的某波长的光越多,对应通道的数值越大
LED可以在暗光或无光环境下对物体进行补光
/*!
* @file getData.ino
* @brief 读取光谱传感器10个光通道的数值,光源的某波长的光越多,对应通道的数值越大
*
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [fengli](li.feng@dfrobot.com)
* @version V1.0
* @date 2020-07-16
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_AS7341
*/
#include "DFRobot_AS7341.h"
/*!
* @brief Construct the function
* @param pWire IC bus pointer object and construction device, can both pass or not pass parameters, Wire in default.
*/
DFRobot_AS7341 as7341;
void setup(void)
{
Serial.begin(115200);
//检测IIC是否能正常通信
while (as7341.begin() != 0) {
Serial.println("IIC初始化失败,请检测连线是否正确");
delay(1000);
}
// //Integration time = (ATIME + 1) x (ASTEP + 1) x 2.78µs
// //设置寄存器ATIME的值(1-255),通过该值可计算Integration time的值,该值表示读取数据过程中必须要消耗的时间
// as7341.setAtime(29);
// //设置ASTEP寄存器的值(0-65534),通过该值可计算Integration time的值,该值表示读取数据过程中必须要消耗的时间
// as7341.setAstep(599);
// //设置增益(0~10对应 X0.5,X1,X2,X4,X8,X16,X32,X64,X128,X256,X512)
// as7341.setAGAIN(7);
// //使能LED
// //as7341.enableLed(true);
// //设置引脚电流控制亮度(1~20对应电流 4mA,6mA,8mA,10mA,12mA,......,42mA)
// //as7341.controlLed(10);
}
void loop(void)
{
DFRobot_AS7341::sModeOneData_t data1;
DFRobot_AS7341::sModeTwoData_t data2;
//开始光谱的测量.
//通道映射的模式 :1.eF1F4ClearNIR,2.eF5F8ClearNIR
as7341.startMeasure(as7341.eF1F4ClearNIR);
//读取传感器数据通道0~5的值,eF1F4ClearNIR模式下.
data1 = as7341.readSpectralDataOne();
Serial.print("F1(405-425nm):");
Serial.println(data1.ADF1);
Serial.print("F2(435-455nm):");
Serial.println(data1.ADF2);
Serial.print("F3(470-490nm):");
Serial.println(data1.ADF3);
Serial.print("F4(505-525nm):");
Serial.println(data1.ADF4);
//Serial.print("Clear:");
//Serial.println(data1.ADCLEAR);
//Serial.print("NIR:");
//Serial.println(data1.ADNIR);
as7341.startMeasure(as7341.eF5F8ClearNIR);
//读取传感器数据通道0~5的值,eF5F8ClearNIR模式下.
data2 = as7341.readSpectralDataTwo();
Serial.print("F5(545-565nm):");
Serial.println(data2.ADF5);
Serial.print("F6(580-600nm):");
Serial.println(data2.ADF6);
Serial.print("F7(620-640nm):");
Serial.println(data2.ADF7);
Serial.print("F8(670-690nm):");
Serial.println(data2.ADF8);
Serial.print("Clear:");
Serial.println(data2.ADCLEAR);
Serial.print("NIR:");
Serial.println(data2.ADNIR);
delay(1000);
}
结果
样例代码2 - 测量光源闪烁频率
此代码可以测量环境光的闪烁频率是否为50HZ或60HZ,可用代码2.1和代码2.2模仿50Hz或60H环境光闪烁
/*!
* @file getFlicker.ino
* @brief 读取光源的闪烁频率
*
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [fengli](li.feng@dfrobot.com)
* @version V1.0
* @date 2020-07-16
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_AS7341
*/
#include "DFRobot_AS7341.h"
/*!
* @brief Construct the function
* @param pWire IC bus pointer object and construction device, can both pass or not pass parameters, Wire in default.
*/
DFRobot_AS7341 as7341;
void setup(void)
{
Serial.begin(115200);
//检测IIC是否能正常通信
while (as7341.begin() != 0) {
Serial.println("IIC初始化失败,请检测连线是否正确");
delay(1000);
}
}
void loop(void){
uint8_t freq = 0;
//读取flicker寄存器的值,可据此预计光源的闪烁频率
freq = as7341.readFlickerData();
if (freq == 1) {
Serial.println("Unknown frequency");
} else if (freq == 0) {
Serial.println("No flicker");
} else {
Serial.print(freq);
Serial.println("Hz");
}
}
结果
样例代码2.1 - 模拟50HZ环境光闪烁
请将此代码烧录到另一块主控上,在数字10引脚上接上LED灯,模拟50HZ的环境光源
//50HZ
//请将此代码烧录到另一块主控上,在数字10引脚上接上LED灯,为getFlicker.ino提供50HZ的环境光源
void setup() {
pinMode(10, OUTPUT);
}
void loop() {
digitalWrite(10, HIGH); // turn the LED on (HIGH is the voltage level)
delay(5);
digitalWrite(10, LOW); // turn the LED on (HIGH is the voltage level)
delay(5);
}
样例代码2.2 - 模拟60HZ环境光闪烁
请将此代码烧录到另一块主控上,在数字10引脚上接上LED灯,模拟60HZ的环境光源
//60HZ
//请将此代码烧录到另一块主控上,在数字10引脚上接上LED灯,为getFlicker.ino提供60HZ的环境光源
void setup() {
pinMode(10, OUTPUT);
}
void loop() {
digitalWrite(10, HIGH); // turn the LED on (HIGH is the voltage level)
delayMicroseconds(4167);
digitalWrite(10, LOW); // turn the LED on (HIGH is the voltage level)
delayMicroseconds(4167);
}
样例代码3 - SYNS模式测量
在SYNS模式下,需要给传感器的GPIO引脚一个下降沿信号才能触发测量。测量完成后,芯片会进入idle模式,这样可以节省功耗。
/*!
* @file synsMode.ino
* @brief Read spectrum data by syns mode. The chip's measurement function needs to be activated by a level pulse for each measurement.
The chip will enter idle mode when the measurement is done, which could save power.
*
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [fengli](li.feng@dfrobot.com)
* @version V1.0
* @date 2020-07-16
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_AS7341
*/
#include "DFRobot_AS7341.h"
/*!
* @brief Construct the function
* @param pWire IC bus pointer object and construction device, can both pass or not pass parameters, Wire in default.
*/
DFRobot_AS7341 as7341;
void setup(void)
{
Serial.begin(115200);
//Detect if IIC can communicate properly
while (as7341.begin(as7341.eSyns) != 0) {
Serial.println("IIC init failed, please check if the wire connection is correct");
delay(1000);
}
//Integration time = (ATIME + 1) x (ASTEP + 1) x 2.78µs
//设置寄存器ATIME的值,通过该值可计算Integration time的值,该值表示读取数据过程中必须要消耗的时间
as7341.setAtime(29);
//设置ASTEP寄存器的值,通过该值可计算Integration time的值,该值表示读取数据过程中必须要消耗的时间
as7341.setAstep(599);
//设置增益(0~10对应 X0.5,X1,X2,X4,X8,X16,X32,X64,X128,X256,X512)
as7341.setAGAIN(7);
as7341.startMeasure(as7341.eF1F4ClearNIR);
}
DFRobot_AS7341::sModeOneData_t data1;
void loop(void)
{
//如果传感器有数据可读则读取数据并打印
if(as7341.measureComplete()){
//读取传感器数据通道0~5的值,eF1F4ClearNIR模式下.
data1 = as7341.readSpectralDataOne();
Serial.print("F1(405-425nm):");
Serial.println(data1.ADF1);
Serial.print("F2(435-455nm):");
Serial.println(data1.ADF2);
Serial.print("F3(470-490nm):");
Serial.println(data1.ADF3);
Serial.print("F4(505-525nm):");
Serial.println(data1.ADF4);
Serial.print("Clear:");
Serial.println(data1.ADCLEAR);
Serial.print("NIR:");
Serial.println(data1.ADNIR);
}
}
结果
常见问题
板载LED光谱曲线
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。