日差しの当たる場所や明るい場所で携帯電話を使用すると、照明条件に応じて明るさが自動的に調整されます。テレビであろうと携帯電話であろうと、今日のほとんどのディスプレイデバイスには、明るさを自動的に調整するための環境光センサーが内蔵されています。今日、このチュートリアルでは、そのようなセンサーBH1750光センサーモジュールの1つを使用して、Arduinoとインターフェイスし、 16x2LCDでルクス値を表示します。
BH1750デジタル光センサーモジュールの概要
BH1750は、デジタル環境光センサーまたは光強度センサーであり、携帯電話やLCDディスプレイのディスプレイの明るさを自動調整したり、屋外の照明条件に基づいて車のヘッドライトをオン/オフしたりするために使用できます。
センサは、I使用する2マイクロコントローラで使用することが容易になりCシリアル通信プロトコル。I2C通信の場合、SDIピンとSDAピンがあります。BH1750環境光センサーのピン配置を以下に示します。
このセンサーの出力はLUX(lx)であるため、それ以上の計算は必要ありません。ルクスは、光の強度を測定するための単位です。特定の領域に当たる光の量に応じて強度を測定します。1ルクスは1平方メートルあたり1ルーメンに相当します。
センサーは2.4Vから3.6V(通常3.0V)の電圧で動作し、0.12mAの電流を消費します。このセンサーは、広範囲で高分解能(1-65535lx)であり、さらに、測定変動も小さい(約+/- 20%)。また、外部コンポーネントなしで独立して動作することもできます。
LDRセンサーを使用して、照明条件に基づいてデバイスを制御することもできますが、それほど正確ではありません。LDRセンサーを使用して、多くの光制御アプリケーションを構築しました。
- LDRを使用したArduino光センサー回路
- LDRと555タイマーICを使用したダークディテクタ
- 光を検出するためのシンプルなLDR回路
- RGBLEDとLDRを使用したArduinoカラーミキシングランプ
Arduino
BH1750光センサーとArduinoを接続するための回路図を以下に示します。
I2C通信はBH1750のSDAとSCLは、iについて、それぞれのArduinoピンA4及びA5に接続されているピン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の明るさを制御するために使用されます。
BH1750光センサーとインターフェースするためのArduinoのプログラミング
このLUXセンサーをArduinoで使用するためのプログラミング部分は非常に簡単です。このセンサーに使用できるライブラリはありますが、それがなくても使用できます。
第一に、我々はしましたヘッダファイルに含まLCDと私のための2 Cプロトコルを。
#include
では 、セットアップ 機能、私たちは、LCDやセンサーの両方を初期化し、LCDにオープニングメッセージを印刷しました。
void setup() { Wire.begin(); lcd.begin(16,2); lcd.print( "BH1750ライト"); lcd.setCursor(0,1); lcd.print( "強度センサー"); delay(2000); }
ここで BH1750_Read と BH1750_Init の機能は、それぞれルクス値を読み書きするために使用されています。 Wire.beginTransmission() 関数は、送信を開始するために使用され、 Wire.requestFrom(アドレス、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 = Wire.read(); i ++; } Wire.endTransmission(); iを返します。 } void BH1750_Init(int address) { Wire.beginTransmission(address); Wire.write(0x10); Wire.endTransmission(); }
では ループ 機能、我々はされているLCDの上にリアルタイムルクス値を印刷します。最初に BH1750_Read 関数からの戻り値を2と比較し、次に2に等しい場合はルクス値の出力を開始します 。BH1750_Read 関数はレジスタカウントの値を返し、2つのレジスタのみを読み取っているため、ここでは値が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 << 8)-buff)/1.2; lcd.clear(); lcd.print( "Intensity in LUX"); lcd.setCursor(6,1); lcd.print(value); } delay(150); }
最後に、Arduinoの電源を入れ、プログラムをArduinoにアップロードします。プログラムがアップロードされるとすぐに、LCDはLUX単位で光強度を表示し始めます。以下のビデオに示すように、センサー周辺の光の強度を変更して値を変更することもできます。