一、项目简介
本项目设计了一款全光谱智慧光检测仪,是全光谱智慧光系统的环境光检测部分,目的是在本地采集和显示环境光数据,并上传至云平台,为全光谱智慧光系统的控制器提供所必要的控制数据。全光谱智慧光系统在接收到控制数据后,通过既定策略进行智慧分析判断,交由全光谱灯光控制系统控制灯光的亮度,色度,色温等以达到或接近既定参数的全光谱灯光效果。
全光谱智慧光检测仪的组成部分有电池供电电路,type C接口电路,主控制器单元,LCD显示屏,按键阵列,光谱传感器,照度传感器,无线WiFi蓝牙通信模块等。
产品图片如下所示

二、项目功能框图

三、功能说明
1、锂电池选用7V/1.6AH,给整个系统供电,续航能力可达一周以上;

2、充放电及短路保护电路实现充电管理,放电欠压保护,短路保护等功能;

3、主控核心板采用高性能处理器外加存储器实现传感器数据采集,显示屏驱动,按键扫描,无线通信等功能;
4、LCD显示屏作为采集数据的展示窗口,分别显示不同的数据和图表;

5、按键阵列向处理器输入不同的指令;
6、光谱传感器和照度传感器将环境光转换为不同光谱下的色度数据和照度数据,提供给处理器;
7、无线通信模块由WiFi+BLE两种无线通信功能组成,蓝牙通信实现本地参数配置,网络通信实现本地采集数据上传至云平台。
四、物料清单

五、设计效果

3D打印放在后期实现。
六、视频展示与B站视频链接:
全光谱环境光检测仪展示视频_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1TZqmBzEQx/
七、设计花絮
1、功能框图绘制:
使用Scheme It | 免费在线原理图绘制工具 | DigiKey
(https://www.digikey.cn/zh/schemeit/project)
绘制原理框图还是很方便的。

2、线路板设计:

3、传感器焊接:


4、流程图绘制

5、其他资料
1、颜色传感器测试
由于颜色传感器价格昂贵,封装小巧,焊接不易。因此,在使用前期,采用Vishay_SensorXplorer Board对传感器进行测试是必要的。一则,了解传感器的性能,是否达到自己设计的目标需要;二则,熟悉传感器的IIC读写时序和参数配置;再则,对环境光的数据区间范围做初步了解,方便控制系统算法设计。

2、部分代码如下:
/*
*******************************************************************************************
**
*******************************************************************************************
*/
#include <Config.h>
/*
*******************************************************************************************
**
*******************************************************************************************
*/
#define AS_DELAY_TIME 500 //100~1000
//IO定义
#define AS_IIC_SCL_0() DP_SCL=0 //时钟端低电平
#define AS_IIC_SCL_1() DP_SCL=1 //时钟端高电平
#define AS_IIC_SCL_READ() DP_SCL
#define AS_IIC_SDA_0() DP_SDA=0 //数据端低电平
#define AS_IIC_SDA_1() DP_SDA=1 //数据端高电平
#define AS_IIC_SDA_READ() DP_SDA //读数据端电平
// AS7343 光谱传感器的IIC总线地址为0x39
unsigned char AS_Device_Address = 0x39 << 1;
void AS_Init(void);
void AS_IIC_Init(void);
void AS_Write_One_Byte(unsigned char RegAddress,unsigned char RegData);
unsigned char AS_Read_One_Byte(unsigned char RegAddress);
/*
*******************************************************************************************
**
*******************************************************************************************
*/
// 延时3.4us@24MHz
static void IIC_AS_Delay(uint16_t us)
{
unsigned long edata i;
WDT_Feed(); // 看门狗喂狗
while (us--)
{
// 1us
_nop_();
_nop_();
_nop_();
i = 4UL;
while (i) i--;
}
}
/*
*******************************************************************************************
**
*******************************************************************************************
*/
void AS_Init(void)
{
unsigned char info;
unsigned char AUXID,REVID,ID;
AS_IIC_Init();//IIC初始化
//IIC_AS_Delay(1000); //1ms
/* 测试延时时间 *
while (1)
{
AS_IIC_SCL_1();
IIC_AS_Delay(1);
AS_IIC_SCL_0();
IIC_AS_Delay(1);
}
**/
// 配置
info = AS_Read_One_Byte(CONTROL_REGISTER);
printf("info=%bd\r\n",info);
AS_Write_One_Byte(CONTROL_REGISTER, info | RESET);
MainDelayms(500); // 500ms
AS_Write_One_Byte(CFG20_REGISTER, 0x00);
printf("reset done!\r\n"); //
info = AS_Read_One_Byte(ENABLE_REGISTER);
printf("info=%bd\r\n",info);
AS_Write_One_Byte(ENABLE_REGISTER, info | ENABLE_POWER_ON);
printf("powerOn done!\r\n");
info = AS_Read_One_Byte(CFG0_REGISTER);
AS_Write_One_Byte(CFG0_REGISTER, info | ACCESS_REGISTER_BELOW);
printf("setRegBlank done!\r\n");
AUXID = AS_Read_One_Byte(AUXID_REGISTER);
REVID = AS_Read_One_Byte(REVID_REGISTER);
ID = AS_Read_One_Byte(ID_REGISTER);
printf("ID:%bd",ID);
printf(" AUXID:%bd",AUXID);
printf(" REVID:%bd/r/n",REVID);
info = AS_Read_One_Byte(CFG0_REGISTER);
AS_Write_One_Byte(CFG0_REGISTER, info | ACCESS_REGISTER_ABOVE);
printf("setRegBlank done!\r\n");
info = AS_Read_One_Byte(CFG20_REGISTER);
AS_Write_One_Byte(CFG20_REGISTER, info | (0 << 5));
info = AS_Read_One_Byte(CFG20_REGISTER);
printf("%bd\r\n",info);
printf("channelSelect done!\r\n");
AS_Write_One_Byte(CFG1_REGISTER, 10);
printf("setADCGain done!\r\n");
AS_Write_One_Byte(WTIME_REGISTER, 100-1);
printf("setWaitTime done!\r\n");
AS_Write_One_Byte(ATIME_REGISTER, 99);
astep_l = int(99 % 256);
astep_h = int(99 / 256);
AS_Write_One_Byte(ASTEP_H_REGISTER, astep_h);
AS_Write_One_Byte(ASTEP_L_REGISTER, astep_l);
printf("Integration Time: %bd\r\n", ((99 + 1) * (99 + 1) * 2.78));
printf("setIntegtrationTime done!\r\n");
AS_Write_One_Byte(LED_REGISTER, LED_OFF);
printf("LEDControl done!\r\n");
info = AS_Read_One_Byte(FIFO_MAP_REGISTER);
AS_Write_One_Byte(FIFO_MAP_REGISTER, info | SP_FIFO_MAP_SET);
info = AS_Read_One_Byte(ENABLE_REGISTER);
printf(bin(info | ENABLE_SpectralMeasurement));
AS_Write_One_Byte(ENABLE_REGISTER, info | ENABLE_SpectralMeasurement);
printf("enableSpectralMeasurement done!\r\n");
printf("init_as7343 done!\r\n");
}
