何时您将手机放在阳光下或强光下,然后会根据照明条件自动调节亮度。如今,无论是电视还是移动电话,如今大多数显示设备都内置有环境光传感器,可以自动调节亮度。今天,在本教程中,我们将使用一个这样的传感器 BH1750光传感器模块并将其与Arduino 连接,并在16x2 LCD上显示Lux值。
BH1750数字光传感器模块的介绍
BH1750 是数字环境光传感器或光强度传感器,可用于根据室外照明条件自动调整手机,LCD显示屏的亮度,或打开/关闭汽车前灯。
该传感器使用I 2 C串行通信协议,这使得它更易于与微控制器一起使用。对于I2C通信,它具有SDI和SDA引脚。 BH1750环境光传感器的引脚排列如下所示:
此传感器的输出位于 LUX (lx)中,因此不需要任何进一步的计算。勒克斯是测量光强度的单位。它根据照射到特定区域的光量来测量强度。 1 lux等于每平方米1流明。
传感器的工作电压范围为 2.4V至3.6V (通常为3.0V),消耗的电流为 0.12mA 。该传感器具有宽范围和高分辨率(1-65535lx),此外,测量偏差也很小(约+/- 20%)。它也可以独立工作,而无需任何外部组件。
尽管LDR传感器也可以用于基于照明条件来控制设备,但其准确性不高。我们已经使用LDR传感器构建了许多光控应用程序:
使用LDR的Arduino光传感器电路
简单的LDR电路使用RGB LED和LDR来检测光
Arduino混色灯
Arduino BH1750环境光传感器电路图
将BH1750光传感器与Arduino连接的电路图如下所示。
BH1750的I2C通信引脚SDA和SCL分别连接到Arduino引脚A4和A5,用于I 2 C通信。我们知道传感器的工作电压为3.3v,因此BH1750的VCC和GND连接到Arduino的3.3V和GND。对于LCD,数据引脚(D4-D7)连接到Arduino的数字引脚D2-D5,RS和EN引脚连接到Arduino的D6和D7。 LCD的V0连接到电位器,并使用一个10k电位器来控制LCD的亮度。
编程Arduino以连接BH1750光传感器
使用此 LUX传感器与Arduino 的编程部分非常简单。尽管此传感器有一个库,但我们也可以不使用它。
首先,我们包含用于LCD和I 2 C协议。
#include
#include
在设置功能中,我们已经初始化了LCD和传感器,并在屏幕上打印了打开消息LCD。
void setup()
{
Wire.begin();
lcd.begin(16,2);
lcd.print(“ BH1750 Light ”);
lcd.setCursor(0,1);
lcd.print(“Intensity Sensor”);
delay(2000);
}
此处 BH1750_Read 和 BH1750_Init 功能用于分别读取和写入Lux值。 Wire.beginTransmission()函数用于开始传输,而 Wire.requestFrom(address,2)函数用于读取寄存器,其中2表示寄存器数。
进一步的 Wire.endTransmission()用于结束传输,并且 Wire.write()函数用于通过输入以下内容转到所需的寄存器
int BH1750_Read(int address)
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available())
{
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}
在 loop 函数中,我们是通过LCD打印实时照度值。首先将 BH1750_Read 函数的返回值与2进行比较,然后如果等于2,则开始打印Lux值。此处将这些值与2进行比较,因为 BH1750_Read 函数返回寄存器计数的值,我们只读取2个寄存器。因此,当达到2时,程序开始打印光强度的LUX值。
然后使用公式从两个寄存器获取值并将它们除以1.2
void loop()
{
int i;
uint16_t value=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
value=((buff[0]《《8)|buff[1])/1.2;
lcd.clear();
lcd.print(“Intensity in LUX”);
lcd.setCursor(6,1);
lcd.print(value);
}
delay(150);
}
最后打开Arduino的电源,然后将程序上传到Arduino。程序一旦上传,LCD便开始以LUX单位显示光强度。您还可以通过更改传感器周围的光强度来更改值,如下面的视频所示。
代码
#include
#include
int BH1750address = 0x23;
byte buff [2];
LiquidCrystal LCD(7,6,5,4,3,2);//RS,E,D4,D5,D6,D7
void setup()
{
Wire.begin();
//Serial.begin(9600);
lcd.begin(16,2);
lcd.print(“ BH1750 Light”);
lcd.setCursor(0,1);
lcd.print(“ Intensity Sensor”);
delay(2000);
}
void loop()
{
int i;
uint16_t value = 0;
BH1750_Init(BH1750address);
delay(200);
if(2 == BH1750_Read(BH1750address))
{
value =((buff [0] 《《8)| buff [1])/1.2;
lcd.clear();
lcd.print(“强度(LUX)”);
lcd.setCursor(6,1);
lcd.print(value);
//Serial.print(val);
//Serial.println(“[lux]“);
}
delay(150);
}
int BH1750_Read(int address)
{
int i = 0;
Wire.beginTransmission(地址);
Wire.requestFrom(地址,2);
while(Wire.available())
{
buff [i] = Wire.read();
i ++;
}
Wire.endTransmission();
返回i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(地址);
Wire.write(0x10);
Wire.endTransmission();
}
责任编辑:wv
-
传感器
+关注
关注
2548文章
50642浏览量
751712 -
Arduino
+关注
关注
187文章
6462浏览量
186613
发布评论请先 登录
相关推荐
评论