電子工作 その13(照度センサー:BH1750の使い方)
こんにちは、Ideagearの鈴木陽介です。
今回は、Arduino Unoを用いた照度センサー(BH1750)の使い方についてご説明します。
本記事は、記録として残すことが目的の手抜き記事ですが、日本語の参考資料としてご活用ください。
撮影日:2022年8月27日
はじめに
BH1750については、これまで色彩判別テストやデジペにおける「いないないばー機能」の実現などで活用してきました。ただ、記事には起こしていなかったため、今回改めてテストしました。
で、このセンサーで重要なのは、光を検知する場所です。
「BH1750」というシルク文字と「102」と刻印されたチップ抵抗の間に黒い部品(赤丸の部分)がありますが、これが光量を検知するセンサー、つまり、BH1750です。
ここに光を当てたり遮ったりすることで値が変化します。
こちらは裏面です。GY-302というシルク文字とピン配置が見て取れます。
つまり、ブレッドボードで使うにあたってピンヘッダをはんだづけする際には、BH1750側の面が上になるようご注意ください。逆だと終了しますw
ちなみに、BH1750とGY-302という2つの型番があってややこしいですが、前者がセンサーで、後者がそれを使ったモジュールの型番です。
参考記事
BH1750はこれまで何度となく使っていますが、ロードセルの記事を書いた時と同様、以前にどの記事を参考にして動作させたか不明です。
よって、これもロードセルの記事の時と同様、英語ですが、Random Nerd Tutorialsの記述がきれいにまとまっているので活用させてもらいました。
Arduino with BH1750 Ambient Light Sensor
ピン配置
参考記事から引用。
画像引用元:https://randomnerdtutorials.com/arduino-bh1750-ambient-light-sensor/
ブレッドボード図
同じく参考記事から引用。
画像引用元:https://randomnerdtutorials.com/arduino-bh1750-ambient-light-sensor/
下記は、実際にArduino Unoと配線した時の様子です。
ライブラリー
Arduino IDEを開き、スケッチ -> ライブラリーをインクルード -> ライブラリーを管理 ->ライブラリーマネージャから、下記ライブラリーをインクルードしてください。
BH1750 by Christopher Laws
ソースコード
手元にBH1750単独のソースコードが残っていなかったため、こちらも参考記事のソースコードをそのまま拝借しました。
/*
Example of BH1750 library usage. This example initialises the BH1750 object using the default high resolution continuous mode and then makes a light level reading every second.
*/
#include <Wire.h>
#include <BH1750.h>
BH1750 lightMeter;
void setup(){
Serial.begin(9600);
// Initialize the I2C bus (BH1750 library doesn't do this automatically)
Wire.begin();
// On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);
// For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use Wire.begin(D2, D1);
lightMeter.begin();
Serial.println(F("BH1750 Test begin"));
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
delay(1000);
}
テスト
Arduino IDEのシリアルモニタを開いて値の変化を確認します。
おまけ
過去の実績動画も併せて共有します。
BH1750で読み取った値をOLEDで表示させています。(撮影日:2022年8月27日)
BH1750で読み取った値をBluetooth経由でスマホアプリで表示させています。(撮影日:2023年1月6日)
こちらはテスト段階の動画ですので、発話の内容と機能が合っていませんが、やっていることは、タッチスイッチで発話モードのON/OFFを切り替え、発話モード中は、BH1750上で光を遮っている間はAの音を流し、遮るのをやめるとBの音を流すようにプログラムを組んでいます。(撮影日:2023年2月19日)
まとめ
いかがでしたでしょうか?
BH1750とArduinoの間はI2C接続に対応しており、電源線2つと信号線2つの計4本だけ接続すれば使えるため、扱いが非常にカンタンです。
欠点は、検知した光量によって動作させる内容を変える場合、光というのはその場の環境による変動が激しい(屋内だと照明等、屋外だと天気の影響を受けやすい)ため、閾値(境界となる値)でプログラムを分岐させようとすると非常に不安定になります。
となると、その場に応じたキャリブレーション(調整)が必要になりますが、プログラムにちゃんとしたキャリブレーションを盛り込もうとすると難易度が一気に上がってしまいます。
ということで、それが面倒だと思う場合は、キャリブレーションなしでも使えるような使い方、たとえば、BH1750上を完全に覆って真っ暗にした時(つまり、値が0の時)とそうでない時の2パターンだけで判別するようにプログラミングする等、工夫をして使いましょう。
それではまた!
Discussion