【雕爷学编程】Arduino动手做(69)---GY-30环境光
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验六十九: GY-30 数字光强度模块光照传感器(BH1750FVI芯片)
BH1750FVI
是日本罗姆(ROHM)半导体生产的数字式环境光传感IC,内置16位的模数转换器,它能够直接输出一个数字信号,不需要再做复杂的计算。这是一种更精良的和容易使用简易电阻器的版本,通过计算电压,来获得有效的数据。这款环境光传感器能够直接通过光度计来测量。光强度的单位是流明"lx"。当物体在均匀的光照下它能够在每平方米获得1lx的光通量,它们的光强度是1lx。有时为了充分利用光源,你可以增加一个光源的反射装置。那样在某些方向就能获得更多的光通量,以增加被照表面的亮度。
光亮度
光亮度(luminance)又称光照强度,发光率,是指一个表面的明亮程度,以L表示, 即从一个表面反射出来的光通量。或者说是指在某方向上单位投影面积的面光源沿该方向的发光强度。表示发光面明亮程度的,指发光表面在指定方向的发光强度与垂直于指定方向的发光面的面积之比,单位是坎德拉/平方米。对于一个漫散射面,尽管各个方向的光强和光通量不同,但各个方向的亮度都是相等的。电视机的荧光屏就是近似于这样的漫散射面,所以从各个方向上观看图像,都有相同的亮度感。不同物体对光有不同的反射系数或吸收系数。
BH1750FVI主要特性
I2C数字接口,支持速率最大400Kbps
输出量为光照度(Illuminance)
测量范围1~65535 lux,分辨率最小到1lux
低功耗(Power down)功能
屏蔽50/60Hz市电频率引起的光照变化干扰
支持两个I2C地址,通过ADDR引脚选择
较小的测量误差(精度误差最大值+/-20%)
BH1750FVI内部结构图
BH1750FVI特点与功能
支持I2CBUS接口
接近视觉灵敏度的光谱灵敏度特性
输出对应亮度的数字值
对应广泛的输入光范围(相当于1-65535lx)
通过降低功率功能,实现低电流化
通过50Hz/60Hz除光噪音功能实现稳定的测定
支持1.8v逻辑输入接口
无需其他外部件
光源依赖性弱
有两种可选的I2Cslave地址
可调的测量结果影响较大的因素为光入口大小
使用这种功能计算1.1lx到100000lx马克斯/分钟的范围
最小误差变动在±20%
受红外线影响很小
GY-30 数字光强度模块光照传感器(BH1750FVI芯片)
采用ROHM原装BH1750FVI芯片
供电电源 :3-5v
光照度范围:0-65535 lx
传感器内置16bitAD转换器
直接数字输出,省略复杂的计算,省略标定
不区分环境光源
接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定
GY-30 数字光强度模块电原理图
电路连接
由于模块本身已经带有了3.3V稳压芯片和I2C电平转换电路,因此可将模块直接与UNO板的I2C接口相连。对于UNO板,I2C总线的SDA信号线对应A4管脚,SCL时钟线对应A5管脚。
测量程序步骤
指令集合结构
/*
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验六十九:GY-30 数字光强度模块光照传感器(BH1750FVI芯片)
Module UNO
5 VCC <-----> 5V
6 GND <-----> GND
7 SCL <-----> A5
8 SDA <-----> A4
9 ADD <-----> NC
*/
#include <Wire.h>
#include <math.h>
int BH1750address = 0x23;
byte buff[2];
void setup()
{
Wire.begin();
Serial.begin(57600);
}
void loop()
{
int i;
uint16_t val=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
val=((buff[0]<<8)|buff[1])/1.2;
Serial.print(val,DEC);
Serial.println("[lx]");
}
delay(150);
}
int BH1750_Read(int address)
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available())
{
buff = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
delay(500);
}
/*
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验六十九:GY-30 数字光强度模块光照传感器(BH1750FVI芯片)
Module UNO
VCC <-----> 5V
GND <-----> GND
SCL <-----> A5
SDA <-----> A4
ADD <-----> NC
程序之二,串口打印光照度的波形
*/
#include <Wire.h>
#include <math.h>
int BH1750address = 0x23;
byte buff[2];
void setup()
{
Wire.begin();
Serial.begin(57600);
}
void loop()
{
int i;
uint16_t val=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
val=((buff[0]<<8)|buff[1])/1.2;
Serial.println(val,DEC);
}
delay(150);
}
int BH1750_Read(int address)
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available())
{
buff = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
delay(500);
}
上图是傍晚自然光的变化曲线,下图是用手电筒照射模块的波形
实验开源图形编程(Mind+、编玩边学)
实验开源仿真编程(linkboy3.7)