北方 发表于 2020-12-24 09:29

【Gravity:AS7341测评】色温感知测量之二 Arduino代码和原理简析

<p>&nbsp;</p>

<p>1、拿到模块就开始测试。从官网下载的是一个arduino的开发包。因为最近没有测试arduino开发板,连软件就KAO掉了,这次下载最新版后发现,新增加开发板进入龟速阶段,搞了5天都没有把bsp给搞定,因为选择的arduino 101放到了github的raw data库中,所以,文件小的还ok,大文件就总这样。虽然,很不爽。</p>

<p>不过,看看伊朗码农的github账号直接给封禁,以及哈工大的matlab账户直接被封就知道,包括微微入主以后的github,开放精神是有前提条件的,不用就不用了。总之是github给了gitee发展机会。</p>

<p>&nbsp;</p>

<p>2. 但是代码还是要分析一下的,</p>

<p>加载getflick.ino程序,</p>

<pre>
<code class="language-cpp">#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() != 0) {
    Serial.println("IIC init failed, please check if the wire connection is correct");
    delay(1000);
}
}

void loop(void){
uint8_t freq = 0;
//Read the value of register flicker, through which the flicker frequency of the light source can be predicted
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");
}
}</code></pre>

<p>从上面可以看出arduino封装以后的代码是非常简单直观,可以直接读出LED的频闪频率。</p>

<p>用于测试,还提供了一个50Hz和60Hz频闪的发生工具。</p>

<pre>
<code class="language-cpp">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);
}</code></pre>

<p>3、代码分析</p>

<p>那么在没有资料的情况下,如何不依赖arduino板子搞呢,就需要看一下驱动程序。</p>

<p>可用的外部程序如下;</p>

<pre>
<code>/
uint8_t readFlickerData();
/**
   * @brief Set measurement mode
   * @param mode
   */
void config(eMode_t mode);
bool measureComplete();
void setGpioMode(uint8_t mode);
void enableSpectralMeasure(bool on);
void enableLed(bool on);
void controlLed(uint8_t current);
bool interrupt();
void setThreshold(uint16_t lowTh,uint16_t highTh);
uint16_t getLowThreshold();
uint16_t getHighThreshold();
void enableSpectralInterrupt(bool on);
void setIntChannel(uint8_t channel);
void setAPERS(uint8_t num);
uint8_t getIntSource();

void clearInterrupt();
private:
float getWtime();
float getIntegrationTime();
uint16_t getChannelData(uint8_t channel);


void enableAS7341(bool on);

void enableWait(bool on);
void enableSMUX(bool on);
void enableFlickerDetection(bool on);

void setBank(uint8_t addr);

void setGpio(bool connect);
void setInt(bool connect);

void enableSysInt(bool on);
void enableFIFOInt(bool on);
void enableSpectralInt(bool on);
void enableFlickerInt(bool on);
void F1F4_Clear_NIR();
void F5F8_Clear_NIR();
void FDConfig();
void endSleep();
void clearFIFO();
void spectralAutozero();
bool checkWtime();
</code></pre>

<p>其中的C代码初始化程序如下:</p>

<pre>
<code>#include "DFRobot_AS7341.h"


DFRobot_AS7341::DFRobot_AS7341(TwoWire *pWire)
{
_pWire = pWire;
_address = 0x39;
}
int DFRobot_AS7341::begin(eMode_t mode)
{
uint8_t buffer;
_pWire-&gt;begin();
_pWire-&gt;beginTransmission(_address);
if(_pWire-&gt;endTransmission() != 0){
    DBG("");
    DBG("bus data access error"); DBG("");
    return ERR_DATA_BUS;
}
enableAS7341(true);
measureMode = mode;
return ERR_OK;
}</code></pre>

<p>显然使用了two wire库函数,那么,就是使用I2C进行驱动访问的意思了,给出了I2C 地址_address = 0x39;</p>

<p>那么,使用其他板子对_address = 0x39,按照指令要求进行读写就可以了,这样就可以用nucleo板子尝试移植使用了。</p>

<p>如果只用arduino,那么评测就结束了。木有的玩了。</p>

<p>&nbsp;</p>

w494143467 发表于 2020-12-24 14:06

<p>可做一些颜色传感器的小Demo,这样就不无聊了~</p>

freebsder 发表于 2020-12-25 18:34

<p>arduino现在还有人玩啊?感觉热度好像没有前几年高了。</p>

okhxyyo 发表于 2020-12-28 10:54

<p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/151" target="_blank">DFRobot AS7341可见光谱传感器测评试用</a></strong></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1152568-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1152568-1-1.html</a></p>
页: [1]
查看完整版本: 【Gravity:AS7341测评】色温感知测量之二 Arduino代码和原理简析