亚搏电子
项目

使用Scilab GUI进行RGB和LUX测量

2016年1月28日,经过罗伯特·凯

通过USB从BH1745NUC光学传感器采集数据,然后显示颜色特性和照度值。

通过USB从BH1745NUC光学传感器采集数据,然后显示颜色特性和照度值。

支持信息

一个方便的光学分析系统

该项目的目标是将我们的efm8 -plus bh1745nuc电路变成一个基于usb的系统,用于监测和分析照亮传感器的任何光线的颜色特性和照度。您可以使用这个系统来确定由任何光源产生的RGB内容,但其预期目的是对环境照明进行一般评估。该系统提供了环境照明两个最重要的方面的信息:照明,这可以被描述为“有效亮度”(更多细节在这里)和光谱组成,它影响一个人对光照条件的生理和心理反应(光谱组成的更多细节在这里,标题为“白色的颜色”)。

gui

这是我们将在这个项目中使用的图形用户界面:

GUI在Scilab中运行,并在GUI Builder工具箱的帮助下设计,你可以通过Scilab的ATOMS模块管理器下载:

您可以使用以下链接下载GUI脚本(它只是一个文本文件)。

rgb_sensor_and_lux_meter_scilab_gui.zip.

首先,您使用“打开VCP端口”按钮建立一个到EFM8微控制器的虚拟COM端口连接。接下来,选择所需的数据请求间隔;最少5秒。在你点击“开始RGBC数据收集”之后,GUI会反复请求数据,直到你点击“停止RGBC数据收集”。垂直滑块和小的彩色矩形表示最近测量的RGB数据,图中显示了当前数据采集周期开始以来的所有lux值;要清除plot并开始一个新的lux记录,点击“Stop RGBC Data Collection”,然后点击“begin RGBC Data Collection”。

绘图功能对于跟踪照度的变化非常有用 - 例如,您可以记录窗口在一天中由窗口提供多少照度,此信息可以帮助您确定人工照明的适当时间表。(上面所示的曲线的变化反映了由“部分多云”天气条件引起的室内照度的变化。)滑块和矩形是显示颜色信息的两种不同方式:滑块允许您准确地评估红色,绿色的比例和入射辐射中的蓝光,而矩形将红色,绿色和蓝色比例组合成单个颜色,这些颜色表示哪些波长是主导的。

传达颜色

让我们看一些GUI如何为不同光源报告RGB信息的例子。以下光谱组成图(可用在这里)来自国家标准和技术研究所提醒我们,我们应该从阳光下,白炽灯泡和白色LED中的期望;我们的R,G和B检测器的峰灵敏度波长分别为约625nm,535nm和455nm。

这里是阳光间接透过窗户照射的结果。注意,蓝色和绿色占主导地位,红色明显减少,形成了一个带蓝绿色的矩形。这与上图所示的总体谱趋势是一致的。

接下来是白炽灯的结果。请注意矩形是如何立即传达较长的波长(即黄色/橙色/红色)的优势。滑块也恰当地表示白炽光谱的强度如何随波长增加。

最后,我们有来自白光led手电筒的数据。白色led以其较高的蓝色波长而闻名,这正是我们在彩色矩形和滑块中所看到的。

笔记:这些滑块是在绝对尺度上运行的。每个滑块的默认最大值是5000。这对于室内测量很有效,但是在室外或其他高亮度的情况下,强度很容易超过这个值。下面的代码摘录显示了如何调整最大值:

寻找光亮

要进行精确的照度测量并不容易,如果你读过我以前的三篇关于这个主题的文章(了解照明:勒克斯是什么?并测量和计算勒克斯价值,第1部分第2部分)。为该项目开发的GUI遵循所讨论的计算程序测量和计算勒克斯值,第2部分.下面是我的scilab脚本实现这个过程:

下面是我用来创建彩色矩形的代码。文中讨论了标度技术设计具有通过RGB LED模块显示的测量的彩色传感器,第2部分;为了方便大家,我把要点重复一遍:

我们这里的目标是“测量”颜色,而不考虑照亮光电探测器的光线的整体强度。因此,我们需要以标准化的方式缩放RGB值绝对测量值的同时保存相对的值 - 换句话说,我们最大化整体强度同时保持这一点比例在入射光中的红色,绿色和蓝色。为了实现这一点,我们将三种测量中的最高测量值乘以最大值的任何因素,然后我们将其他两个测量值乘以相同的因素。

重要提示:BH1745NUC datasheet(数据表)11 page - BH1745NUC表示“电气特性”表中给出的灵敏度规格是基于传感器内部增益设置为的情况下进行的测量16 x.我相信这是一个错误;假设增益是计算的敏感性1x..考虑到数据表的总体质量,这种错误并不令人惊讶;实际上,该表中的另一个规范似乎也包含类似的错误。此外,我的大多数lux测量表明,基于1x的灵敏度是正确的。我做了两个实验,一个用白炽灯泡,一个用蜡烛,在这两个实验中,我的勒克斯值都符合理论预测——当然没有差16倍。然而,我的勒克斯值在全日户外条件下似乎太低了,尽管将这些值增加16倍会使它们太高。室外低勒克斯值可能与在非常高的光照强度下发生的某种饱和或脱敏有关——数据表显示,传感器的动态范围仅扩展到40000勒克斯,而直接阳光可以超过100,000勒克斯。总之,需要更多的实验来确定如何优化一个基于bh1745nu的照度计。

固件

以下是下载固件的链接。

RGB_Sensor_with_LED_Feedback_and_USB.zip

请参考设计一个颜色传感器与测量通过RGB LED模块显示,第1部分第2部分,有关本项目中使用的固件的信息。与Scilab通信所需的大多数USB功能都在“USBInterface.c”源文件中:

uint16_t xdata usbbytesrcvd = 0;//持有收到的数据包大小UINT16_T XDATA USBBYTSTRANSMitted = 0;//持有字节数实际传输uint8_t xdata usbrxpacket [usb_packet_size];//从主机位request_rgbc_data = false收到的包;bit请求_temp_data= false;/ ****************************************************************************** * vcpxpress回调*此函数由vcpxpress调用。***************************************************************************** / vcpxpress_api_callback(myapicallback){uint32_t api_interruptcode;//获取指示中断API_INTERRUPTCODE = GET_CALLBACK_SOURCE()的代码; //if the USB connection was just opened if (API_InterruptCode & DEVICE_OPEN) { //start the first USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); /*we will process the received bytes when we get a callback with an RX_COMPLETE interrupt code*/ } if (API_InterruptCode & RX_COMPLETE) //USB read complete { //confirm that the received packet is the proper length if(USBBytesRcvd == USB_CMD_LEN) { //'R' indicates that the host is Requesting data if(USBRxPacket[0] == 'R') { //is the host requesting data from the RGBC sensor? if(USBRxPacket[2] == 'R' && USBRxPacket[3] == 'G' && USBRxPacket[4] == 'B' && USBRxPacket[5] == 'C') { REQUEST_RGBC_DATA = TRUE; } //is the host requesting data from the thermocouple IC? else if(USBRxPacket[2] == 'T' && USBRxPacket[3] == 'E' && USBRxPacket[4] == 'M' && USBRxPacket[5] == 'P') { REQUEST_TEMP_DATA = TRUE; } } } //continue with the next USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); } } void TransmitUSB_TempData() { Block_Write(TempDataTx, TEMP_DATA_LEN, &USBBytesTransmitted); } void TransmitUSB_RGBCData() { Block_Write(I2C_RcvData, RGBC_DATA_LEN, &USBBytesTransmitted); }

你会注意到USB代码除了RGBC数据请求外,还包括对温度数据的请求。这为您提供了一个如何将附加命令合并到USB接口的示例(温度测量功能将在未来的项目中使用)。