近期一个项目要用到光照传感器测量光照度,第一根项目是测量大棚里面的光照度,用的BH1750量程65535Lx,第二个项目是采集室外的光照度,实际测试发现晴天的时候在早上8点左右传感器就已经满量程,之后传感器的度数一直是0。室外用BH1750不行,在网上买了个BCE的光照传感器,光感芯片是MAX44009。回来发现网上并没有在arduino上使用BCE光照传感器的程序,现在贡献出来,下面是资料和代码。
#include <Wire.h>
#include <math.h>
int BECaddress = 0x4A;
void setup()
{
Serial.begin(9600);
Serial.println("Starting up");
Wire.begin();
delay(50);
}
void loop()
{
float lx;
lx = BEC_Read();
Serial.println(lx);
delay(200);
}
float BEC_Read()
{
int buff_low,buff_high;
char data_bin_high[10];
int data_bin_low[10];
float lx=0;
long int t=0,k=0,j=0;
int i=0;
//读取传感器数值
BEC_Init(0x03,BECaddress);
delay(400);
Wire.beginTransmission(BECaddress);
Wire.requestFrom(BECaddress,1);
while(Wire.available())
{
buff_high = Wire.read(); //高字节
}
Wire.endTransmission();
delay(100);
BEC_Init(0x04,BECaddress);
delay(400);
Wire.beginTransmission(BECaddress);
Wire.requestFrom(BECaddress,1);
while(Wire.available())
{
buff_low = Wire.read(); // 低字节
}
Wire.endTransmission();
//流明算法
#ifdef BCE_TEST
Serial.print("Buff high =");
Serial.println(buff_high);
Serial.print("Buff low =");
Serial.println(buff_low);
#endif
if(buff_high==0)
{
data_bin_high[7]=0;
data_bin_high[6]=0;
data_bin_high[5]=0;
data_bin_high[4]=0;
data_bin_high[3]=0;
data_bin_high[2]=0;
data_bin_high[1]=0;
data_bin_high[0]=0;
i=8;
}
while (i<8)
{
data_bin_high[i]=(int)(buff_high%2);
i=i+1;
buff_high=buff_high/2;
}
#ifdef BCE_TEST
for(i--;i>=0;i--)
Serial.print((int)data_bin_high[i]);
Serial.println(" ");
#endif
i=0;
if(buff_low==0)
{
data_bin_low[3]=0;
data_bin_low[2]=0;
data_bin_low[1]=0;
data_bin_low[0]=0;
i=4;
}
while (i<8)
{
data_bin_low[i]=(int)(buff_low%2);
i=i+1;
buff_low=buff_low/2;
}
#ifdef BCE_TEST
for(i--;i>=0;i--)
Serial.print(data_bin_low[i]);
Serial.println(" ");
#endif
t=(int)data_bin_high[3]*128+(int)data_bin_high[2]*64+(int)data_bin_high[1]*32+(int)data_bin_high[0]*16+(int)data_bin_low[3]*8+(int)data_bin_low[2]*4+(int)data_bin_low[1]*2+(int)data_bin_low[0];
j=(int)data_bin_high[7]*8+(int)data_bin_high[6]*4+(int)data_bin_high[5]*2+(int)data_bin_high[4];
k=pow(2,j);
lx = k*t*0.045;
#ifdef BCE_TEST
Serial.print("The Lx is ");
Serial.println(lx);
#endif
return lx;
}
void BEC_Init(int buf, int address)
{
Wire.beginTransmission(address);
Wire.write(buf);//高字节流明寄存器 0x03,低字节流明寄存器0x04
Wire.endTransmission();
}