风筝
发表于: 2019-6-25 16:34:07 | 显示全部楼层

当您将手机放在阳光下或强光照条件下时,它会根据光线条件自动调节亮度。现在大多数显示设备,无论是电视还是手机,都内置环境光传感器来自动调节亮度。今天在本篇文章中,我们将使用一个这样的传感器BH1750光传感器模块,并将其与Arduino开发板连接,然后在1602显示屏上显示流明Lux值。


BH1750数字光传感器模块简介

BH1750是一款数字环境光传感器或光强度传感器,可用于根据室外照明条件自动调节手机、LCD显示器中的显示屏亮度,或者打开/关闭汽车前灯。


该传感器采用I2C串行通信协议,使其更易于与微控制器配合使用。对于I2C通信,它具有SDI和SDA引脚。 BH1750环境光传感器的引脚排列如下:

BH1750-Ambient-Light.jpg

该传感器的输出为LUX(lx),因此不需要进一步计算。 Lux是测量光强度的单位。它根据特定区域的光量来测量强度。1Lux等于每平方米一流明。


传感器的工作电压为2.4V至3.6V(典型值为3.0V),消耗的电流为0.12mA。该传感器具有宽范围和高分辨率(1-65535lx),此外,测量变化也很小(约+/- 20%)。它也可以独立工作,无需任何外部组件。


虽然LDR传感器也可以用于根据照明条件控制设备,但不是那么准确。


Arduino BH1750环境光传感器电路图

将BH1750光传感器与Arduino连接的电路图如下所示。

Circuit-Diagram-for-Interfacing-BH1750-Ambient-Light-Sensor-with-Arduino.png

BH1750的I2C通信引脚SDA和SCL分别连接到Arduino引脚A4和A5,用于I2C通信。我们知道传感器的工作电压为3.3V,因此BH1750的VCC和GND连接到Arduino的3.3V和GND。对于LCD,数据引脚(D4-D7)连接到Arduino的数字引脚D2-D5,RS和EN引脚连接到Arduino的D6和D7。 LCD的V0连接到电位器,10k电位器用于控制LCD的亮度。

Interfacing-BH1750-Ambient-Light-Sensor-with-Arduino.jpg


编程Arduino用于连接BH1750光传感器

将此LUX传感器与Arduino配合使用的编程部分非常简单。虽然有一个可用于此传感器的库,但我们也可以在没有它的情况下使用它。

首先,我们包含了LCD和I2C协议的头文件。

  1. #include<Wire.h>
  2. #include<LiquidCrystal.h>
复制代码

在setup函数中,我们初始化了LCD和传感器,并在LCD上打印了一些信息。

  1. void setup()
  2. {
  3.   Wire.begin();
  4.   lcd.begin(16,2);
  5.   lcd.print("  BH1750 Light  ");
  6.   lcd.setCursor(0,1);
  7.   lcd.print("Intensity Sensor");
  8.   delay(2000);
  9. }
复制代码

这里BH1750_Read和BH1750_Init函数分别用于读取和写入Lux值。 Wire.beginTransmission()函数用于开始传输,Wire.requestFrom(address,2)函数用于读取寄存器,其中2表示寄存器的数量。


Wire.endTransmission()用于结束传输,Wire.write()函数用于通过输入该寄存器的地址来转到所需的寄存器。

  1. int BH1750_Read(int address)
  2. {
  3.   int i=0;
  4.   Wire.beginTransmission(address);
  5.   Wire.requestFrom(address, 2);
  6.   while(Wire.available())
  7.   {
  8.     buff[i] = Wire.read();
  9.     i++;
  10.   }
  11.   Wire.endTransmission();
  12.   return i;
  13. }

  14. void BH1750_Init(int address)
  15. {
  16.   Wire.beginTransmission(address);
  17.   Wire.write(0x10);
  18.   Wire.endTransmission();
  19. }
复制代码

在loop函数中,我们在LCD上打印实时流明值。首先将BH1750_Read函数的返回值与2进行比较,然后如果它等于2则开始打印Lux值。这里将值与2进行比较,因为BH1750_Read函数返回寄存器计数值,我们只读取2个寄存器。因此,当它达到2时,程序开始打印光强度的LUX值。


然后使用公式从两个寄存器中获取值并将它们除以1.2,这是测量精度。

  1. void loop()
  2. {
  3.   int i;
  4.   uint16_t value=0;
  5.   BH1750_Init(BH1750address);
  6.   delay(200);

  7.   if(2==BH1750_Read(BH1750address))
  8.   {
  9.     value=((buff[0]<<8)|buff[1])/1.2;
  10.     lcd.clear();
  11.     lcd.print("Intensity in LUX");
  12.     lcd.setCursor(6,1);
  13.     lcd.print(value);
  14.   }
  15.   delay(150);
  16. }
复制代码

最后启动Arduino并将程序上传到Arduino。程序上传后,LCD开始显示LUX单位的光强度。您还可以通过更改传感器周围的光强来更改值。


代码

本文使用的完整代码如下所示: main.rar (581 Bytes, 下载次数: 224)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-28 17:35 , Processed in 0.117428 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表