AS7341可见光传感器

简介

您对颜色了解多少?您想了解真正的颜色吗?眼睛可能会欺骗您,但是传感器不会。AS7341可见光传感器可以告诉您最真实的颜色。
AS7341可见光传感器采用业内知名的ams公司推出的新一代AS7341光谱传感IC。该传感器有8个可见光通道、1个闪烁通道、1个NIR通道和1个未加滤光片的通道。该传感器拥有6个独立的16位ADC通道,可以并行的处理数据。该传感器板载了两颗高亮LED,可在暗光环境下进行补光。

RGB颜色传感器和AS7341可见光传感器对比(以黄色为例)

黄色LED WS2812模拟黄色
RGB颜色传感器识别结果 红色+绿色 红色+绿色
AS7341可见光传感器识别结果 黄色 红色+绿色

您可以在此了解一些有关可见光的知识

特性

应用场景

技术规格

引脚说明

序号 丝印 功能描述
1 VCC 电源正极
2 GND 电源负极
3 SCL I2C时钟线
4 SDA I2C数据线
5 INT 中断引脚:低电平有效
6 GPIO 通用输入输出

使用教程

准备

关于如何安装库文件,点击链接

  /**
   * @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 (http://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);
}

结果

SEN0364result1

样例代码2 - 测量光源闪烁频率

此代码可以测量环境光的闪烁频率是否为50HZ或60HZ,可用代码2.1和代码2.2模仿50Hz或60H环境光闪烁

/*!
 * @file getFlicker.ino
 * @brief 读取光源的闪烁频率
 * 
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://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");
  }
}

结果

SEN0364result2

样例代码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 (http://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);
  }
}

结果

SEN0364result3

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接