#include "VEML6030.h"
#include "PUBLIC.h"
#include "delay.h"
unsigned char GG_LSB=0;
unsigned char GG_MSB=0;
unsigned char VMEL6030_First=0;
unsigned char VMEL6030_Broke_Flag=0;
unsigned char VMEL6030_StopInterrupt_Flag=0;
unsigned char VEML6030_FalseTrigger_Flag=0;
uint16_t VEML6030_SUM=0;
double ALS_Alarm_lux[3];
double Communication_ALS_Alarm_lux=0;
unsigned char Communication_ALS_Read_lux=0;
uint8_t Int_TH_Low_Flag;
uint8_t INT_TH_High_Flag;
uint8_t ALS_Light_Flag;
uint8_t ALS_Dark_Flag;
uint8_t ALS_Light_Count=0;
uint8_t ALS_Dark_Count=0;
ALS_State Current_ALS_State;
uint8_t Last_ALS_Light_State=0;
uint16_t cmd[4]={VEML6030_ALS_CONF_DEFAULT |
VEML6030_ALS_CONF_PERS_4 |
VEML6030_ALS_CONF_IT_200MS | VEML6030_ALS_CONF_SM_x2, 315, 285, 0};
double lux;
double luxlasttime;
const float calibration_factor = 0.0144;
void WRITE_VEML6030(u8 command,u8 LSB,u8 MSB)
{
I2C_Start();
I2C_Send_Byte(0x90);//
I2C_Wait_Ack();
I2C_Send_Byte(command);//
I2C_Wait_Ack();
I2C_Send_Byte(LSB);//
I2C_Wait_Ack();
I2C_Send_Byte(MSB);//
I2C_Wait_Ack();
I2C_Stop();
delay_ms(110);
}
void READ_VEML6030_OUTPUT(u8 command)
{
I2C_Start();
I2C_Send_Byte(0x90);//
I2C_Wait_Ack();
I2C_Send_Byte(command);//
I2C_Wait_Ack();
I2C_Start();
I2C_Send_Byte(0x91);//
I2C_Wait_Ack();
GG_LSB=I2C_Read_Byte(1);
GG_MSB=I2C_Read_Byte(0);
I2C_Stop();
}
void Initialize_VEML6030(void)
{
Disable_Sensor();//失能器件
IWDG_Feed();
SET_Interrupt_Threshold(ALS_Alarm_Low_Threshold,ALS_Alarm_High_Threshold);//设置低阈值,高阈值
IWDG_Feed();
Enable_Interrupt();//使能中断
IWDG_Feed();
Set_PSM_Modle();//设置CMD03为连续采集模式
IWDG_Feed();
Enable_Sensor();//配置ALS GainX2,积分时间200ms,ALS_PERS 4次采集,ALS_INT_EN使能,ALS_SD打开器件
delay_ms(250);
IWDG_Feed();
}
void Set_PSM_Modle(void)
{
uint8_t data[2];
cmd[ALS_PSM] |= VEML6030_ALS_PSM_MODLE;
data[0] = (uint8_t)(cmd[ALS_PSM]&0xFF); //获取16位数据的低8位
data[1] = (uint8_t)((cmd[ALS_PSM]&0xFF00)>>8); //获取16位数据的低8位
WRITE_VEML6030(ALS_PSM,data[0],data[1]);
}
void Clear_Interrupt(void)
{
READ_VEML6030_OUTPUT(ALS_STATUS); //读取0x06,以清除中断
INT_TH_High_Flag = GG_MSB & 0x40; //判断是否是高阈值置位
Int_TH_Low_Flag = GG_MSB & 0x80; //判断是否是低阈值置位
}
void Enable_Sensor(void)
{
uint8_t data[2]; //data[0]存放命令的低8位,data[1]存放命令的高8位
cmd[ALS_CONF] &= ~VEML6030_ALS_CONF_SD;
data[0] = (uint8_t)(cmd[ALS_CONF]&0xFF); //获取16位数据的低8位
data[1] = (uint8_t)((cmd[ALS_CONF]&0xFF00)>>8); //获取16位数据的低8位
WRITE_VEML6030(ALS_CONF,data[0],data[1]);
}
void Disable_Sensor(void)
{
uint8_t data[2]; //data[0]存放命令的低8位,data[1]存放命令的高8位
cmd[ALS_CONF] |= VEML6030_ALS_CONF_SD;
data[0] = (uint8_t)(cmd[ALS_CONF]&0xFF); //获取16位数据的低8位
data[1] = (uint8_t)((cmd[ALS_CONF]&0xFF00)>>8); //获取16位数据的低8位
WRITE_VEML6030(ALS_CONF,data[0],data[1]);
}
void Enable_Interrupt(void)
{
uint8_t data[2]; //data[0]存放命令的低8位,data[1]存放命令的高8位
cmd[ALS_CONF] |= VEML6030_ALS_CONF_INT_EN;
data[0] = (uint8_t)(cmd[ALS_CONF]&0xFF); //获取16位数据的低8位
data[1] = (uint8_t)((cmd[ALS_CONF]&0xFF00)>>8); //获取16位数据的低8位
WRITE_VEML6030(ALS_CONF,data[0],data[1]);
}
void Disable_Interrupt(void)
{
uint8_t data[2]; //data[0]存放命令的低8位,data[1]存放命令的高8位
cmd[ALS_CONF] &= ~VEML6030_ALS_CONF_INT_EN;
data[0] = (uint8_t)(cmd[ALS_CONF]&0xFF); //获取16位数据的低8位
data[1] = (uint8_t)((cmd[ALS_CONF]&0xFF00)>>8); //获取16位数据的低8位
WRITE_VEML6030(ALS_CONF,data[0],data[1]);
}
void SET_Interrupt_Threshold(uint16_t min,uint16_t max)
{
uint8_t Hdata[2]; //data[0]存放命令的低8位,data[1]存放命令的高8位
uint8_t Ldata[2];
uint16_t HighThreshold;
uint16_t LowThreshold;
// Set ALS high threshold
HighThreshold = max;
if(HighThreshold > 65535)
HighThreshold = 65535;
Hdata[0] = (uint8_t)(HighThreshold & 0xFF); //获取16位数据的低8位
Hdata[1] = (uint8_t)((HighThreshold & 0xFF00)>>8); //获取16位数据的高8位
WRITE_VEML6030(ALS_THDH,Hdata[0],Hdata[1]);
// Set ALS low threshold
LowThreshold = min;
if(LowThreshold <= 0)
LowThreshold = 0;
Ldata[0] = (uint8_t)(LowThreshold & 0xFF); //获取16位数据的低8位
Ldata[1] = (uint8_t)((LowThreshold & 0xFF00)>>8); //获取16位数据的高8位
WRITE_VEML6030(ALS_THDL,Ldata[0],Ldata[1]);
}
void Read_als_data(void)
{
READ_VEML6030_OUTPUT(ALS_DATA); //读取0x04,获取ALS OUTPUT的值,此值需要计算才对应Lux;
}
/**************************************************************************************
* 计算lux,将读到的低8位数据和高8位数据组合成16位数据,并将16位数据转换成十进制数据
* 并根据初始值设置计算出lux
*
*
**************************************************************************************/
double calculateLux(void)
{
uint16_t total_num;
uint8_t lowsb = GG_LSB;
uint8_t highsb = GG_MSB;
uint8_t num3,num2,num1,num0;
uint16_t sum;
total_num = (highsb<<8 | lowsb);
num0 = total_num&0xF;
num1 = (total_num>>4)&0xF;
num2 = (total_num>>8)&0xF;
num3 = (total_num>>12)&0xF;
sum = num0*1+num1*16+num2*16*16+num3*16*16*16;
VEML6030_SUM=sum;
lux = sum*calibration_factor;
return lux;
}