【雕爺學程式設計】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管腳。
測量程式步驟
指令集合結構
/* 【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); }
/* 【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)