GY-30 照度センサー

BH1750FVIを使った明るさセンサーモジュールで、なんと値がルクスで出力されます。
0〜54612 lx の明るさまで測定出来て、I2cにより通信します。
フォトレジスタの抵抗値と違い値がズバリ取れるのはすばらしいですね。
センサーからの取得できる最大の値は、 0xFFFF 65535 で、/1.2 をすると、54612.5 になりコレが最大の感度のようです。
昼間の直射日光下では値が飽和しますので NDフィルター (減光フィルター)を取り付けて調整する必要があるようです。
GY-30 デジタル光強度照度センサ BH1750FVI モジュール

GY-30モジュールとArduinoを次のように接続しました。
GY-30 GND ---- GND Arduino
      ADD ---- GND
      SDA ---- A4
      SCL ---- A5
      VCC ---- 5V


BH1750FVIのデータシートを見ると、Continuously H-resolution mode ( ADDR = 'L' )と記載があり
ADDをGNDにつなぐ事により、高分解能モードになりI2cアドレスは0x23になります。
逆に5Vにつなぐと精度が低いモードに切り替わりI2cアドレスも変わるようです。

次に通信の方法を調べます。
BH1750FVIのデータシートにこのように載っていました。



これを見ると、まず最初に、00010000 を送信してH-resolution mode に設定して、180ms以上待ってから、
値を読み出すと二つの値が読み出せて、その値を連結して1.2で割るとルクスになるようです。

上記に従い、 ArduinoでI2C通信 マスター側のプログラムの作成 で作成したプログラムを改造しました。

#include <Wire.h>
//接続先のアドレス
#define ADDRESS 0b00100011

int i;
void setup() {
  Serial.begin(9800);
  Wire.begin();
  Wire.beginTransmission(ADDRESS);
  Wire.write(0b00010000);
  Wire.endTransmission();
}

void loop() {
  unsigned char H, L;
  Wire.requestFrom(ADDRESS, 2); //接続し2byte取得する
  if (Wire.available()) {
    H = (unsigned char)Wire.read();
    if (Wire.available()) {
      L = (unsigned char)Wire.read();
      unsigned short pos;
      pos = H << 8;
      pos = pos + L;
      pos = pos / 1.2;
      Serial.println(pos);
    }
    delay(1000);
  }
}
このプログラムをArduinoに書き込んでシリアルモニタを開くとルクスの値が表示されます。
モジュールのセンサ部分に光を当てたりカゲにしたりすると値が変化します。



▼ プログラムの修正
2つの値をデータシートに従いベタにそのまま読みだしていましたが、見た目が悪いので複数の値でも読み出せるように修正しました。
これで、他のモジュールでも使いまわしができるかもしれません。
#include <Wire.h>
//接続先のアドレス
#define ADDRESS 0b00100011
unsigned char buff[10];

int i;
void setup() {
  Serial.begin(9800);
  Wire.begin();
  Wire.beginTransmission(ADDRESS);
  Wire.write(0b00010000);
  Wire.endTransmission();
}

void loop() {
  unsigned char*buf_pt;
  buf_pt = buff;
  Wire.requestFrom(ADDRESS, 2); //接続し2byte取得する
  while (Wire.available()) {
    *buf_pt++ = (unsigned char)Wire.read();
  }
  if ((buf_pt - buff) >= 2) {
    unsigned short pos;
    pos = buff[0] << 8;
    pos = pos + buff[1];
    pos = pos / 1.2;
    Serial.println(pos);
  }
  delay(1000);
}


▲トップページ > マイコンなど