何時(shí)您將手機(jī)放在陽(yáng)光下或強(qiáng)光下,然后會(huì)根據(jù)照明條件自動(dòng)調(diào)節(jié)亮度。如今,無(wú)論是電視還是移動(dòng)電話,如今大多數(shù)顯示設(shè)備都內(nèi)置有環(huán)境光傳感器,可以自動(dòng)調(diào)節(jié)亮度。今天,在本教程中,我們將使用一個(gè)這樣的傳感器 BH1750光傳感器模塊并將其與Arduino 連接,并在16x2 LCD上顯示Lux值。
BH1750數(shù)字光傳感器模塊的介紹
BH1750 是數(shù)字環(huán)境光傳感器或光強(qiáng)度傳感器,可用于根據(jù)室外照明條件自動(dòng)調(diào)整手機(jī),LCD顯示屏的亮度,或打開/關(guān)閉汽車前燈。
該傳感器使用I 2 C串行通信協(xié)議,這使得它更易于與微控制器一起使用。對(duì)于I2C通信,它具有SDI和SDA引腳。 BH1750環(huán)境光傳感器的引腳排列如下所示:
此傳感器的輸出位于 LUX (lx)中,因此不需要任何進(jìn)一步的計(jì)算。勒克斯是測(cè)量光強(qiáng)度的單位。它根據(jù)照射到特定區(qū)域的光量來(lái)測(cè)量強(qiáng)度。 1 lux等于每平方米1流明。
傳感器的工作電壓范圍為 2.4V至3.6V (通常為3.0V),消耗的電流為 0.12mA 。該傳感器具有寬范圍和高分辨率(1-65535lx),此外,測(cè)量偏差也很小(約+/- 20%)。它也可以獨(dú)立工作,而無(wú)需任何外部組件。
盡管LDR傳感器也可以用于基于照明條件來(lái)控制設(shè)備,但其準(zhǔn)確性不高。我們已經(jīng)使用LDR傳感器構(gòu)建了許多光控應(yīng)用程序:
使用LDR的Arduino光傳感器電路
簡(jiǎn)單的LDR電路使用RGB LED和LDR來(lái)檢測(cè)光
Arduino混色燈
Arduino BH1750環(huán)境光傳感器電路圖
將BH1750光傳感器與Arduino連接的電路圖如下所示。
BH1750的I2C通信引腳SDA和SCL分別連接到Arduino引腳A4和A5,用于I 2 C通信。我們知道傳感器的工作電壓為3.3v,因此BH1750的VCC和GND連接到Arduino的3.3V和GND。對(duì)于LCD,數(shù)據(jù)引腳(D4-D7)連接到Arduino的數(shù)字引腳D2-D5,RS和EN引腳連接到Arduino的D6和D7。 LCD的V0連接到電位器,并使用一個(gè)10k電位器來(lái)控制LCD的亮度。
編程Arduino以連接BH1750光傳感器
使用此 LUX傳感器與Arduino 的編程部分非常簡(jiǎn)單。盡管此傳感器有一個(gè)庫(kù),但我們也可以不使用它。
首先,我們包含用于LCD和I 2 C協(xié)議。
#include
#include
在設(shè)置功能中,我們已經(jīng)初始化了LCD和傳感器,并在屏幕上打印了打開消息LCD。
void setup()
{
Wire.begin();
lcd.begin(16,2);
lcd.print(“ BH1750 Light ”);
lcd.setCursor(0,1);
lcd.print(“Intensity Sensor”);
delay(2000);
}
此處 BH1750_Read 和 BH1750_Init 功能用于分別讀取和寫入Lux值。 Wire.beginTransmission()函數(shù)用于開始傳輸,而 Wire.requestFrom(address,2)函數(shù)用于讀取寄存器,其中2表示寄存器數(shù)。
進(jìn)一步的 Wire.endTransmission()用于結(jié)束傳輸,并且 Wire.write()函數(shù)用于通過(guò)輸入以下內(nèi)容轉(zhuǎn)到所需的寄存器
int BH1750_Read(int address)
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available())
{
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}
在 loop 函數(shù)中,我們是通過(guò)LCD打印實(shí)時(shí)照度值。首先將 BH1750_Read 函數(shù)的返回值與2進(jìn)行比較,然后如果等于2,則開始打印Lux值。此處將這些值與2進(jìn)行比較,因?yàn)?BH1750_Read 函數(shù)返回寄存器計(jì)數(shù)的值,我們只讀取2個(gè)寄存器。因此,當(dāng)達(dá)到2時(shí),程序開始打印光強(qiáng)度的LUX值。
然后使用公式從兩個(gè)寄存器獲取值并將它們除以1.2
void loop()
{
int i;
uint16_t value=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
value=((buff[0]《《8)|buff[1])/1.2;
lcd.clear();
lcd.print(“Intensity in LUX”);
lcd.setCursor(6,1);
lcd.print(value);
}
delay(150);
}
最后打開Arduino的電源,然后將程序上傳到Arduino。程序一旦上傳,LCD便開始以LUX單位顯示光強(qiáng)度。您還可以通過(guò)更改傳感器周圍的光強(qiáng)度來(lái)更改值,如下面的視頻所示。
代碼
#include
#include
int BH1750address = 0x23;
byte buff [2];
LiquidCrystal LCD(7,6,5,4,3,2);//RS,E,D4,D5,D6,D7
void setup()
{
Wire.begin();
//Serial.begin(9600);
lcd.begin(16,2);
lcd.print(“ BH1750 Light”);
lcd.setCursor(0,1);
lcd.print(“ Intensity Sensor”);
delay(2000);
}
void loop()
{
int i;
uint16_t value = 0;
BH1750_Init(BH1750address);
delay(200);
if(2 == BH1750_Read(BH1750address))
{
value =((buff [0] 《《8)| buff [1])/1.2;
lcd.clear();
lcd.print(“強(qiáng)度(LUX)”);
lcd.setCursor(6,1);
lcd.print(value);
//Serial.print(val);
//Serial.println(“[lux]“);
}
delay(150);
}
int BH1750_Read(int address)
{
int i = 0;
Wire.beginTransmission(地址);
Wire.requestFrom(地址,2);
while(Wire.available())
{
buff [i] = Wire.read();
i ++;
}
Wire.endTransmission();
返回i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(地址);
Wire.write(0x10);
Wire.endTransmission();
}
責(zé)任編輯:wv
-
傳感器
+關(guān)注
關(guān)注
2545文章
50445瀏覽量
751067 -
Arduino
+關(guān)注
關(guān)注
187文章
6457瀏覽量
186502
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論