🌏

電子工作 その13(照度センサー:BH1750の使い方)

2023/08/23に公開

こんにちは、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/

ブレッドボード図

同じく参考記事から引用。


画像引用元: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のシリアルモニタを開いて値の変化を確認します。
https://twitter.com/Ideaport_Suzuky/status/1694285343108059263

おまけ

過去の実績動画も併せて共有します。

https://twitter.com/Ideaport_Suzuky/status/1563487479570653184
BH1750で読み取った値をOLEDで表示させています。(撮影日:2022年8月27日)

https://twitter.com/Ideaport_Suzuky/status/1611080094382174209
BH1750で読み取った値をBluetooth経由でスマホアプリで表示させています。(撮影日:2023年1月6日)

https://twitter.com/Ideaport_Suzuky/status/1627320019096072192
こちらはテスト段階の動画ですので、発話の内容と機能が合っていませんが、やっていることは、タッチスイッチで発話モードのON/OFFを切り替え、発話モード中は、BH1750上で光を遮っている間はAの音を流し、遮るのをやめるとBの音を流すようにプログラムを組んでいます。(撮影日:2023年2月19日)

まとめ

いかがでしたでしょうか?

BH1750とArduinoの間はI2C接続に対応しており、電源線2つと信号線2つの計4本だけ接続すれば使えるため、扱いが非常にカンタンです。

欠点は、検知した光量によって動作させる内容を変える場合、光というのはその場の環境による変動が激しい(屋内だと照明等、屋外だと天気の影響を受けやすい)ため、閾値(境界となる値)でプログラムを分岐させようとすると非常に不安定になります。

となると、その場に応じたキャリブレーション(調整)が必要になりますが、プログラムにちゃんとしたキャリブレーションを盛り込もうとすると難易度が一気に上がってしまいます。

ということで、それが面倒だと思う場合は、キャリブレーションなしでも使えるような使い方、たとえば、BH1750上を完全に覆って真っ暗にした時(つまり、値が0の時)とそうでない時の2パターンだけで判別するようにプログラミングする等、工夫をして使いましょう。

それではまた!

Discussion