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)