简介
您对颜色了解多少?您想了解真正的颜色吗?眼睛可能会欺骗您,但是传感器不会。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或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

