GY30感光模块.docx
《GY30感光模块.docx》由会员分享,可在线阅读,更多相关《GY30感光模块.docx(13页珍藏版)》请在冰豆网上搜索。
GY30感光模块
数字光强度检测模块:
GY-30采用ROHM原装BH1750FVI芯片供电电源:
3-5v光照度范围:
0-65535lx传感器内置16bitAD转换器直接数字输出,省略复杂的计算,省略标定不区分环境光源接近于视觉灵敏度的分光特性可对广泛的亮度进行1勒克斯的高精度测定标准NXPIIC通信协议模块内部包含通信电平转换,与5v单片机io直接连接送STC51C语言测试代码送AVRM16C语言测试代码有关知识背景
1967年法国第十三届国际计量大会规定了以坎德拉、坎德拉/平方米、流明、勒克斯分别作为发光强度、光亮度、光通量和光照度等的单位,为统一工程技术中使用的光学度量单位有重要意义。
为使您了解和使用便利,以下将有关知识做一简单介绍:
1.candela的定义
1.
烛光、国际烛光、坎德拉(candela)的定义在每平方米101325牛顿的标准大气压下,面积等于1/60平方厘米的绝对“黑体”(即能够吸收全部外来光线而毫无反射的理想物体),在纯铂(Pt)凝固温度(约2042K获1769℃)时,沿垂直方向的发光强度为1坎德拉。
并且,烛光、国际烛光、坎德拉三个概念是有区别的,不宜等同。
从数量上看,60坎德拉等于58.8国际烛光,亥夫纳灯的1烛光等于0.885国际烛光或0.919坎德拉。
2.
发光强度与光亮度 发光强度简称光强,国际单位是candela(坎德拉)简写cd。
Lcd是指光源在指定方向的单位立体角内发出的光通量。
光源辐射是均匀时,则光强为I=F/Ω,Ω为立体角,单位为球面度(sr),F为光通量,单位是流明,对于点光源由I=F/4。
光亮度是表示发光面明亮程度的,指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比,单位是坎德拉/平方米。
对于一个漫散射面,尽管各个方向的光强和光通量不同,但各个方向的亮度都是相等的。
电视机的荧光屏就是近似于这样的漫散射面,所以从各个方向上观看图像,都有相同的亮度感。
以下是部分光源的亮度值:
单位cd/m² 太阳:
1.5*10;日光灯:
(5—10)*10³;月光(满月):
2.5*10³;黑白电视机荧光屏:
120左右;彩色电视机荧光屏:
80左右。
3.
光通量与流明光源所发出的光能是向所有方向辐射的,对于在单位时间里通过某一面积的光能,称为通过这一面积的辐射能通量。
各色光的频率不同,眼睛对各色光的敏感度也有所不同,即使各色光的辐射能通量相等,在视觉上并不能产生相同的明亮程度,在各色光中,黄、绿色光能激起最大的明亮感觉。
如果用绿色光作水准,令它的光通量等于辐射能通量,则对其它色光来说,激起明亮感觉的本领比绿色光为小,光通量也小于辐射能通量。
光通量的单位是流明,是英文lumen的音译,简写为lm。
绝对黑体在铂的凝固温度下,从5.305*10³cm²面积上辐射出来的光通量为1lm。
为表明光强和光通量的关系,发光强度为1坎德拉的点光源在单位立体角(1球面度)内发出的光通量为1流明。
一只40W的日光灯输出的光通量大约是2100流明。
4.
光照度与勒克斯 光照度可用照度计直接测量。
光照度的单位是勒克斯,是英文lux的音译,也可写为lx。
被光均匀照射的物体,在1平方米面积上得到的光通量是1流明时,它的照度是1勒克斯。
有时为了充分利用光源,常在光源上附加一个反射装置,使得某些方向能够得到比较多的光通量,以增加这一被照面上的照度。
例如汽车前灯、手电筒、摄影灯等。
以下是各种环境照度值:
单位lux 黑夜:
0.001—0.02;月夜:
0.02—0.3;阴天室内:
5—50;阴天室外:
50—500;晴天室内:
100—1000;夏季中午太阳光下的照度:
约为10*6次方;阅读书刊时所需的照度:
50—60;家用摄像机标准照度:
1400
相关知识:
背景
1967年法国第十三届国际计量大会规定了以坎德拉、坎德拉/平方米、流明、勒克斯分别作为发光强度、光亮度、光通量和光照度等的单位,为统一工程技术中使用的光学度量单位有重要意义。
为使您了解和使用便利,以下将有关知识做一简单介绍:
1.candela的定义
1.烛光、国际烛光、坎德拉(candela)的定义
在每平方米101325牛顿的标准大气压下,面积等于1/60平方厘米的绝对“黑体”(即能够吸收全部外来光线而毫无反射的理想物体),在纯铂(Pt)凝固温度(约2042K获1769℃)时,沿垂直方向的发光强度为1坎德拉。
并且,烛光、国际烛光、坎德拉三个概念是有区别的,不宜等同。
从数量上看,60坎德拉等于58.8国际烛光,亥夫纳灯的1烛光等于0.885国际烛光或0.919坎德拉。
2.发光强度与光亮度
发光强度简称光强,国际单位是candela(坎德拉)简写cd。
Lcd是指光源在指定方向的单位立体角内发出的光通量。
光源辐射是均匀时,则光强为I=F/Ω,Ω为立体角,单位为球面度(sr),F为光通量,单位是流明,对于点光源由I=F/4。
光亮度是表示发光面明亮程度的,指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比,单位是坎德拉/平方米。
对于一个漫散射面,尽管各个方向的光强和光通量不同,但各个方向的亮度都是相等的。
电视机的荧光屏就是近似于这样的漫散射面,所以从各个方向上观看图像,都有相同的亮度感。
以下是部分光源的亮度值:
单位cd/m²
太阳:
1.5*10;日光灯:
(5—10)*10³;月光(满月):
2.5*10³;黑白电视机荧光屏:
120左右;彩色电视机荧光屏:
80左右。
3.光通量与流明
光源所发出的光能是向所有方向辐射的,对于在单位时间里通过某一面积的光能,称为通过这一面积的辐射能通量。
各色光的频率不同,眼睛对各色光的敏感度也有所不同,即使各色光的辐射能通量相等,在视觉上并不能产生相同的明亮程度,在各色光中,黄、绿色光能激起最大的明亮感觉。
如果用绿色光作水准,令它的光通量等于辐射能通量,则对其它色光来说,激起明亮感觉的本领比绿色光为小,光通量也小于辐射能通量。
光通量的单位是流明,是英文lumen的音译,简写为lm。
绝对黑体在铂的凝固温度下,从5.305*10³cm²面积上辐射出来的光通量为1lm。
为表明光强和光通量的关系,发光强度为1坎德拉的点光源在单位立体角(1球面度)内发出的光通量为1流明。
一只40W的日光灯输出的光通量大约是2100流明。
4.光照度与勒克斯
光照度可用照度计直接测量。
光照度的单位是勒克斯,是英文lux的音译,也可写为lx。
被光均匀照射的物体,在1平方米面积上得到的光通量是1流明时,它的照度是1勒克斯。
有时为了充分利用光源,常在光源上附加一个反射装置,使得某些方向能够得到比较多的光通量,以增加这一被照面上的照度。
例如汽车前灯、手电筒、摄影灯等。
以下是各种环境照度值:
单位lux
黑夜:
0.001—0.02;月夜:
0.02—0.3;阴天室内:
5—50;阴天室外:
50—500;晴天室内:
100—1000;夏季中午太阳光下的照度:
约为10*6次方;阅读书刊时所需的照度:
50—60;家用摄像机标准照度:
1400
分类:
C/C++
//***************************************
//BH1750FVIIIC测试程序
//使用单片机STC89C52
//晶振:
11.0592M,这里采用12M
//显示:
串口打印,4800
//编译环境KeiluVision2
//参考宏晶网站24c04通信程序
//时间:
2012年11月27日
//修改:
MrLee
//****************************************
#include
#include//Keillibrary
#include//Keillibrary
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSlaveAddress0x46//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
//ALTADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
sbitSCL=P1^0;//IIC时钟引脚定义
sbitSDA=P1^1;//IIC数据引脚定义
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
BYTEBUF[8];//接收数据缓存区
ucharge,shi,bai,qian,wan;//显示变量
intdis_data;//变量
voiddelay_nms(unsignedintk);
voidInit_BH1750(void);
voidconversion(uinttemp_data);
voidSingle_Write_BH1750(ucharREG_Address);//单个写入数据
ucharSingle_Read_BH1750(ucharREG_Address);//单个读取内部寄存器数据
voidMultiple_Read_BH1750();//连续的读取内部寄存器数据
//------------------------------------
voidDelay5us();
voidDelay5ms();
voidBH1750_Start();//起始信号
voidBH1750_Stop();//停止信号
voidBH1750_SendACK(bitack);//应答ACK
bitBH1750_RecvACK();//读ack
voidBH1750_SendByte(BYTEdat);//IIC单个字节写
BYTEBH1750_RecvByte();//IIC单个字节读
//-----------------------------------
//*********************************************************
voidconversion(uinttemp_data)//数据转换出个,十,百,千,万
{
wan=temp_data/10000+0x30;
temp_data=temp_data%10000;//取余运算
qian=temp_data/1000+0x30;
temp_data=temp_data%1000;//取余运算
bai=temp_data/100+0x30;
temp_data=temp_data%100;//取余运算
shi=temp_data/10+0x30;
temp_data=temp_data%10;//取余运算
ge=temp_data+0x30;
}
//毫秒延时**************************
voiddelay_nms(unsignedintk)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++)
{;}}
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
voidDelay5ms()
{
WORDn=560;
while(n--);
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
voidDelay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
起始信号
**************************************/
voidBH1750_Start()
{
SDA=1;//拉高数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=0;//产生下降沿
Delay5us();//延时
SCL=0;//拉低时钟线
}
/**************************************
停止信号
**************************************/
voidBH1750_Stop()
{
SDA=0;//拉低数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=1;//产生上升沿
Delay5us();//延时
}
/**************************************
发送应答信号
入口参数:
ack(0:
ACK1:
NAK)
**************************************/
voidBH1750_SendACK(bitack)
{
SDA=ack;//写应答信号
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
/**************************************
接收应答信号
**************************************/
bitBH1750_RecvACK()
{
SCL=1;//拉高时钟线
Delay5us();//延时
CY=SDA;//读应答信号
SCL=0;//拉低时钟线
Delay5us();//延时
returnCY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
voidBH1750_SendByte(BYTEdat)
{
BYTEi;
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;//移出数据的最高位
SDA=CY;//送数据口
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
BH1750_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTEBH1750_RecvByte()
{
BYTEi;
BYTEdat=0;
SDA=1;//使能内部上拉,准备读取数据,
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;
SCL=1;//拉高时钟线
Delay5us();//延时
dat|=SDA;//读数据
SCL=0;//拉低时钟线
Delay5us();//延时
}
returndat;
}
//*********************************
voidSingle_Write_BH1750(ucharREG_Address)
{
BH1750_Start();//起始信号
BH1750_SendByte(SlaveAddress);//发送设备地址+写信号
BH1750_SendByte(REG_Address);//内部寄存器地址,
//BH1750_SendByte(REG_data);//内部寄存器数据,
BH1750_Stop();//发送停止信号
}
//********单字节读取*****************************************
/*
ucharSingle_Read_BH1750(ucharREG_Address)
{ucharREG_data;
BH1750_Start();//起始信号
BH1750_SendByte(SlaveAddress);//发送设备地址+写信号
BH1750_SendByte(REG_Address);//发送存储单元地址,从0开始
BH1750_Start();//起始信号
BH1750_SendByte(SlaveAddress+1);//发送设备地址+读信号
REG_data=BH1750_RecvByte();//读出寄存器数据
BH1750_SendACK
(1);
BH1750_Stop();//停止信号
returnREG_data;
}
*/
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
voidMultiple_read_BH1750(void)
{uchari;
BH1750_Start();//起始信号
BH1750_SendByte(SlaveAddress+1);//发送设备地址+读信号
for(i=0;i<3;i++)//连续读取2个地址数据,存储中BUF
{
BUF[i]=BH1750_RecvByte();//BUF[0]存储0x32地址中的数据
if(i==3)
{
BH1750_SendACK
(1);//最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0);//回应ACK
}
}
BH1750_Stop();//停止信号
Delay5ms();
}
//初始化BH1750,根据需要请参考pdf进行修改****
voidInit_BH1750()
{
Single_Write_BH1750(0x01);
}
voiduart_init()
{
TMOD=0x20;//TMOD=0
TH1=0xf3;//12MHZ,BPS:
4800,N,8,1,0xf3=243
TL1=0xf3;
PCON=0x80;//方式一,8位数据位,一位起始位和一位结束位
TR1=1;//
SCON=0x40;//串口通信控制寄存器模式一
}
voiduart_putchar(unsignedchardat)
{
SBUF=dat;//把数据送给sbuf缓存器中
while(TI!
=1);//发送标志位TI如果发送了为1,没发送为0,没发送等待,到了退出循环
TI=0;//到了,TI清为0
}
voiduart_printf(unsignedchar*buff)
{
while(*buff)
uart_putchar(*buff++);
}
//*********************************************************
//主程序********
//*********************************************************
voidmain()
{
floattemp;
unsignedcharstr[5];
//delay_nms(100);//延时100ms
uart_init();
Init_BH1750();//初始化BH1750
while
(1)//循环
{
Single_Write_BH1750(0x01);//poweron
Single_Write_BH1750(0x10);//H-resolutionmode
delay_nms(180);//延时180ms
Multiple_Read_BH1750();//连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
temp=(float)dis_data/1.2;
conversion(temp);//计算数据和显示
str[0]=wan;
str[1]=qian;
str[2]=bai;
str[3]=shi;
str[4]=ge;
uart_printf("light:
");
uart_printf(str);
uart_printf("lx\r\n");
}
}
广电电器网云中华
(资料素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)