【雕爷学编程】Arduino动手做(122)---BH1750光照传感器
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十二:GY-302 数字量光强度检测 光照传感器 BH1750FVI 光线检测模块
BH1750光照传感器模块描述
1. ROHM原装BH1750FVI芯片
2.电源:3-5v
3.光强范围:0-65535 lx
4.传感器内置16bitAD转换器
5.直接数字输出,省略复杂计算,省略校准
6.不区分环境光,接近光谱特性的视觉灵敏度
7.可以在很宽的亮度范围内进行1 lux的高精度测量
8.标准NXP IIC通信协议
9.模块包含通信级转换,5v微控制器直接连接
模块参考电原理图
知识点:光亮度
光亮度(luminance)又称发光率,是指一个表面的明亮程度,以L表示, 即从一个表面反射出来的光通量。或者说是指在某方向上单位投影面积的面光源沿该方向的发光强度。不同物体对光有不同的反射系数或吸收系数。光亮度是表示发光面明亮程度的,指发光表面在指定方向的发光强度与垂直于指定方向的发光面的面积之比,单位是坎德拉/平方米。对于一个漫散射面,尽管各个方向的光强和光通量不同,但各个方向的亮度都是相等的。电视机的荧光屏就是近似于这样的漫散射面,所以从各个方向上观看图像,都有相同的亮度感。亮度和照度的关系,最常用的照度单位是呎烛光(footcandle)。1呎烛光是在距离标准烛光一英尺远的一平方英尺平面上接受的光通量。如果按公制单位,则以米为标准,照度就用米烛光(metrecandle)来表示,即1米烛光是距离标准烛光一米远的一平方米面积上的照度。
1米烛光等于0.0929呎烛光。
我们不难理解亮度和照度之间的关系,其关系为:
L=R×E
式中L为亮度,R为反射系数,E为照度。
因此,当我们知道一个物体表面的反射系数及其表面的照度时,便可推算出它的亮度。
BH1750FVI是日本罗姆(ROHM)半导体生产的数字式环境光传感IC。其主要特性有:
- I2C数字接口,支持速率最大400Kbps
- 输出量为光照度(Illuminance)
- 测量范围1~65535 lux,分辨率最小到1lux
- 低功耗(Power down)功能
- 屏蔽50/60Hz市电频率引起的光照变化干扰
- 支持两个I2C地址,通过ADDR引脚选择
- 较小的测量误差(精度误差最大值+/-20%)
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百二十二:GY-302 数字量光强度检测 光照传感器 BH1750FVI 光线检测模块 项目:测试环境光亮度 Module UNO 5 VCC —— 5V 6 GND —— GND 7 SCL —— A5 8 SDA —— A4 9 ADD —— NC */ #include <Wire.h> #define ADDRESS_BH1750FVI 0x23 //ADDR="L" for this module #define ONE_TIME_H_RESOLUTION_MODE 0x20 //One Time H-Resolution Mode: //Resolution = 1 lux //Measurement time (max.) = 180ms //Power down after each measurement byte highByte = 0; byte lowByte = 0; unsigned int sensorOut = 0; unsigned int illuminance = 0; void setup(){ Wire.begin(); Serial.begin(115200); } void loop(){ Wire.beginTransmission(ADDRESS_BH1750FVI); //"notify" the matching device Wire.write(ONE_TIME_H_RESOLUTION_MODE); //set operation mode Wire.endTransmission(); delay(180); Wire.requestFrom(ADDRESS_BH1750FVI, 2); //ask Arduino to read back 2 bytes from the sensor highByte = Wire.read(); // get the high byte lowByte = Wire.read(); // get the low byte sensorOut = (highByte<<8)|lowByte; illuminance = sensorOut/1.2; Serial.print(illuminance); Serial.println(" lux"); delay(1000); }
光亮度数据参考
晚上: 0.001-0.02;
月夜: 0.02-0.3;
多云室内: 5-50;
多云室外: 50-500;
晴天室内: 100-1000;
夏天中午光照下: 大约10*6能量;
阅读书籍时的照明度:50-60;
家庭录像标准照明度:1400
实验串口返回情况
打开台灯后的光亮度波形,提高了400多倍
Arduino实验场景图
Arduino实验开源代码之二
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百二十二:GY-302 数字量光强度检测 光照传感器 BH1750FVI 光线检测模块 项目:依据光亮度控制LED Module UNO 5 VCC —— 5V 6 GND —— GND 7 SCL —— A5 8 SDA —— A4 9 ADD —— NC */ #include <Wire.h> //IIC库 #include <math.h> int BH1750address = 0x23;//芯片地址为16位23 byte buff[2]; void setup(){ pinMode(13,OUTPUT); Wire.begin(); Serial.begin(9600); } void loop(){ int i; uint16_t val=0; BH1750_Init(BH1750address); delay(100); if(2==BH1750_Read(BH1750address)) { val=((buff[0]<<8)|buff[1])/1.2; Serial.print(val,DEC); Serial.println("[lx]"); } delay(150); if (val<100) { digitalWrite(13,HIGH); } else { digitalWrite(13,LOW); } } int BH1750_Read(int address) // { int i=0; Wire.beginTransmission(address); Wire.requestFrom(address, 2); while(Wire.available()) // { buff = Wire.read(); // read one byte i++; } Wire.endTransmission(); return i; } void BH1750_Init(int address) { Wire.beginTransmission(address); Wire.write(0x10);//1lx reolution 120ms Wire.endTransmission(); }
实验开源仿真编程(Linkboy V4.62)