何時您將手機放在陽光下或強光下,然后會根據照明條件自動調節亮度。如今,無論是電視還是移動電話,如今大多數顯示設備都內置有環境光傳感器,可以自動調節亮度。今天,在本教程中,我們將使用一個這樣的傳感器 BH1750光傳感器模塊并將其與Arduino 連接,并在16x2 LCD上顯示Lux值。
BH1750數字光傳感器模塊的介紹
BH1750 是數字環境光傳感器或光強度傳感器,可用于根據室外照明條件自動調整手機,LCD顯示屏的亮度,或打開/關閉汽車前燈。
該傳感器使用I 2 C串行通信協議,這使得它更易于與微控制器一起使用。對于I2C通信,它具有SDI和SDA引腳。 BH1750環境光傳感器的引腳排列如下所示:
此傳感器的輸出位于 LUX (lx)中,因此不需要任何進一步的計算。勒克斯是測量光強度的單位。它根據照射到特定區域的光量來測量強度。 1 lux等于每平方米1流明。
傳感器的工作電壓范圍為 2.4V至3.6V (通常為3.0V),消耗的電流為 0.12mA 。該傳感器具有寬范圍和高分辨率(1-65535lx),此外,測量偏差也很小(約+/- 20%)。它也可以獨立工作,而無需任何外部組件。
盡管LDR傳感器也可以用于基于照明條件來控制設備,但其準確性不高。我們已經使用LDR傳感器構建了許多光控應用程序:
使用LDR的Arduino光傳感器電路
簡單的LDR電路使用RGB LED和LDR來檢測光
Arduino混色燈
Arduino BH1750環境光傳感器電路圖
將BH1750光傳感器與Arduino連接的電路圖如下所示。
BH1750的I2C通信引腳SDA和SCL分別連接到Arduino引腳A4和A5,用于I 2 C通信。我們知道傳感器的工作電壓為3.3v,因此BH1750的VCC和GND連接到Arduino的3.3V和GND。對于LCD,數據引腳(D4-D7)連接到Arduino的數字引腳D2-D5,RS和EN引腳連接到Arduino的D6和D7。 LCD的V0連接到電位器,并使用一個10k電位器來控制LCD的亮度。
編程Arduino以連接BH1750光傳感器
使用此 LUX傳感器與Arduino 的編程部分非常簡單。盡管此傳感器有一個庫,但我們也可以不使用它。
首先,我們包含用于LCD和I 2 C協議。
#include
#include
在設置功能中,我們已經初始化了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()函數用于開始傳輸,而 Wire.requestFrom(address,2)函數用于讀取寄存器,其中2表示寄存器數。
進一步的 Wire.endTransmission()用于結束傳輸,并且 Wire.write()函數用于通過輸入以下內容轉到所需的寄存器
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 函數中,我們是通過LCD打印實時照度值。首先將 BH1750_Read 函數的返回值與2進行比較,然后如果等于2,則開始打印Lux值。此處將這些值與2進行比較,因為 BH1750_Read 函數返回寄存器計數的值,我們只讀取2個寄存器。因此,當達到2時,程序開始打印光強度的LUX值。
然后使用公式從兩個寄存器獲取值并將它們除以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單位顯示光強度。您還可以通過更改傳感器周圍的光強度來更改值,如下面的視頻所示。
代碼
#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(“強度(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();
}
責任編輯:wv
-
傳感器
+關注
關注
2550文章
51039瀏覽量
753087 -
Arduino
+關注
關注
188文章
6469瀏覽量
186958
發布評論請先 登錄
相關推薦
評論