基于Arduino制作测光表

随着科技的发展,测光表不再那么神秘,从一些家居装饰店到网络平台上基本都可以买到。本文将介绍一个开源测光表的制作。如果觉得购买成品价格不能接受,那我们为什么不自己尝试造一个呢?下面具体介绍基于Arduino的测光表,它可以在数字环境光传感器的帮助下测量光的强度,核心是来自ROHM的BH1750FVI。

光传感器模块

在网上有很多不同类型的BH1750FVI模块,它们最核心部分是都是一样的。本文采用的是来自taobao的GY-30光强度模块,它也是基于BH1750FVI数字环境光传感器的,模块内置了16位ADC,因此它不需要复杂的数学运算就可以直接输出数字信号,模块采用I2C接口,直接输出lux数据(光强度的单位是流明lx)。除了光传感器之外,模块上还集成了低电压调节器和逻辑转换器组件。模块支持3.3v~5V的直流供电。

BH1750 GY30光强度传感器

如上图所示,GY-30光强度传感器模块是一个5针模块,其中两个用于电源VCC和GND,两个用于I2C接口SCL和SDA,ADD用于设置传感器的I2C地址。当ADD悬空或将其连接到GND,此时I2C地址是0x23(默认值),如果将ADD连接到VCC,地址将是0x5C。

控制器和显示器

其它的硬件包含Arduino Nano 和0.96英寸的OLED显示器,它的分辨率为128 x 64。这些东西在网上都很常见,而且价格也比较便宜。

Arduino_Nano

Arduino Nano不占用空间,同时拥有足够的输入输出,并且它还包含了一个用于简单编程的USB接口!

0.96英寸I2C接口OLED显示器

0.96英寸的I2C接口OLED显示器,黄蓝色字符,分辨率128 x 64.

电路连接图

基于GY-30的Arduino光强度测试电路

Arduino光强度测试代码

按图完成硬件连接后,我们将进入软件部分,光强度测试代码比较简单,这里会用到著名的“u8glib library”来驱动OLED显示器。需要注意的是,我手头的OLED显示器只能使用默认的I2C地址,不能另外设置,默认I2C地址是0x3C。下面是测试代码:

/*
Arduino测光表测试代码:
1、BH1750 环境光传感器
2、Arduino Nano/Uno+
3、0.96″, 128×64, OLED (SSD1306) 显示器
*Lux (lx) 是国际光亮度标准单位,它定义是每平方米的流明度(lm/m2)
*/

#include <Wire.h>  // I2C Library
#include “U8glib.h”

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
int BH17_add = 0x23; // I2C address of BH1750
byte buff[2];

void setup() {
Wire.begin();
BH750_Init(BH17_add);
delay(200);
}

void light() {
float valf = 0;
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 50);
if (BH1750_Read(BH17_add) == 2) {
valf = ((buff[0] << 8) | buff[1]) / 1.2;
if (valf < 0)u8g.print(“> 65535”);
else
u8g.setPrintPos(0, 20);
u8g.print(“www.Basemu.com”);
u8g.setPrintPos(0, 30);
u8g.print(“————–“);
u8g.setPrintPos(0, 40);
u8g.print(“Light Meter”);
u8g.setPrintPos(0, 60);
u8g.print((int)valf, DEC);
u8g.print(” LX/SI”);
}
delay(100);
}

void loop() {
u8g.firstPage();
do {
light();
} while (u8g.nextPage());
}

void BH750_Init(int address) {
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}

byte BH1750_Read(int address) {
byte i = 0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);

while (Wire.available()) {
buff[i] = Wire.read();
i++;
}

Wire.endTransmission();
return i;
}