【雕爷学编程】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管脚。

测量程序步骤

指令集合结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 
【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);
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 
【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)

 

posted @   行者花雕  阅读(1741)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示