【Gravity:AS7341测评】色温感知测量之二 Arduino代码和原理简析
[复制链接]
1、拿到模块就开始测试。从官网下载的是一个arduino的开发包。因为最近没有测试arduino开发板,连软件就KAO掉了,这次下载最新版后发现,新增加开发板进入龟速阶段,搞了5天都没有把bsp给搞定,因为选择的arduino 101放到了github的raw data库中,所以,文件小的还ok,大文件就总这样。虽然,很不爽。
不过,看看伊朗码农的github账号直接给封禁,以及哈工大的matlab账户直接被封就知道,包括微微入主以后的github,开放精神是有前提条件的,不用就不用了。总之是github给了gitee发展机会。
2. 但是代码还是要分析一下的,
加载getflick.ino程序,
#include "DFRobot_AS7341.h"
/*!
* [url=home.php?mod=space&uid=159083]@brief[/url] 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");
}
}
从上面可以看出arduino封装以后的代码是非常简单直观,可以直接读出LED的频闪频率。
用于测试,还提供了一个50Hz和60Hz频闪的发生工具。
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);
}
3、代码分析
那么在没有资料的情况下,如何不依赖arduino板子搞呢,就需要看一下驱动程序。
可用的外部程序如下;
/
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();
其中的C代码初始化程序如下:
#include "DFRobot_AS7341.h"
DFRobot_AS7341::DFRobot_AS7341(TwoWire *pWire)
{
_pWire = pWire;
_address = 0x39;
}
int DFRobot_AS7341::begin(eMode_t mode)
{
uint8_t buffer[2];
_pWire->begin();
_pWire->beginTransmission(_address);
if(_pWire->endTransmission() != 0){
DBG("");
DBG("bus data access error"); DBG("");
return ERR_DATA_BUS;
}
enableAS7341(true);
measureMode = mode;
return ERR_OK;
}
显然使用了two wire库函数,那么,就是使用I2C进行驱动访问的意思了,给出了I2C 地址_address = 0x39;
那么,使用其他板子对_address = 0x39,按照指令要求进行读写就可以了,这样就可以用nucleo板子尝试移植使用了。
如果只用arduino,那么评测就结束了。木有的玩了。
|