隨著科技的發(fā)展,測光表不再那么神秘,從一些家居裝飾店到網(wǎng)絡(luò)平臺上基本都可以買到。本文將介紹一個開源測光表的制作。如果覺得購買成品價格不能接受,那我們?yōu)槭裁床蛔约簢L試造一個呢?下面具體介紹基于Arduino的測光表,它可以在數(shù)字環(huán)境光傳感器的幫助下測量光的強(qiáng)度,核心是來自ROHM的BH1750FVI。
光傳感器模塊
在網(wǎng)上有很多不同類型的BH1750FVI模塊,它們最核心部分是都是一樣的。本文采用的是來自taobao的GY-30光強(qiáng)度模塊,它也是基于BH1750FVI數(shù)字環(huán)境光傳感器的,模塊內(nèi)置了16位ADC,因此它不需要復(fù)雜的數(shù)學(xué)運算就可以直接輸出數(shù)字信號,模塊采用I2C接口,直接輸出lux數(shù)據(jù)(光強(qiáng)度的單位是流明lx)。除了光傳感器之外,模塊上還集成了低電壓調(diào)節(jié)器和邏輯轉(zhuǎn)換器組件。模塊支持3.3v~5V的直流供電。
如上圖所示,GY-30光強(qiáng)度傳感器模塊是一個5針模塊,其中兩個用于電源VCC和GND,兩個用于I2C接口SCL和SDA,ADD用于設(shè)置傳感器的I2C地址。當(dāng)ADD懸空或?qū)⑵溥B接到GND,此時I2C地址是0x23(默認(rèn)值),如果將ADD連接到VCC,地址將是0x5C。
控制器和顯示器
其它的硬件包含Arduino Nano 和0.96英寸的OLED顯示器,它的分辨率為128 x 64。這些東西在網(wǎng)上都很常見,而且價格也比較便宜。
Arduino Nano不占用空間,同時擁有足夠的輸入輸出,并且它還包含了一個用于簡單編程的USB接口!
0.96英寸的I2C接口OLED顯示器,黃藍(lán)色字符,分辨率128 x 64.
電路連接圖
Arduino光強(qiáng)度測試代碼
按圖完成硬件連接后,我們將進(jìn)入軟件部分,光強(qiáng)度測試代碼比較簡單,這里會用到著名的“u8glib library”來驅(qū)動OLED顯示器。需要注意的是,我手頭的OLED顯示器只能使用默認(rèn)的I2C地址,不能另外設(shè)置,默認(rèn)I2C地址是0x3C。下面是測試代碼:
/*
Arduino測光表測試代碼:
1、BH1750 環(huán)境光傳感器
2、Arduino Nano/Uno+
3、0.96″, 128×64, OLED (SSD1306) 顯示器
*Lux (lx) 是國際光亮度標(biāo)準(zhǔn)單位,它定義是每平方米的流明度(lm/m2)
*/
#include // 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;
}
-
Rohm
+關(guān)注
關(guān)注
8文章
370瀏覽量
66029 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186952 -
BH1750FVI
+關(guān)注
關(guān)注
1文章
2瀏覽量
3163
發(fā)布評論請先 登錄
相關(guān)推薦
評論