[Arduinoのすすめ][ArduinoConf][ArduinoMonitor][iArduino]

ロームの照度センサIC BH1603FVC を使う

BH1603FVC は、ロームの照度センサICです。0[lx]から100,000[lx]と広範囲の照度を測ることができます。 電源電圧範囲は 2.4[V]〜5.5[V]ですので、3.3[V]動作、5[V]動作のArduinoに 直接つないで使うことが出来ます。

スケッチ

ここでは 5[V]のArduinoにつないでいます。電流出力型のICですので、電流・電圧変換用に 抵抗が必要です。ここでは5.6[kΩ]の抵抗(データシートの3ページのブロック図のR1)を使い、フィルタ用に2.2[uF]のコンデンサ(同C1)をつないでいます。 BH1603FVCは照度のレンジGC1, GC2ピンで選択できますが、スケッチで自動切り替えするようにしています。GC1を2ピン、GC2を3ピンに、出力をA0につないでいます。

// This is example shows how to use BH1603FVC ambient light sensor IC by Rohm
// Licenced under GPL v2 or later
// Copyright (c) N. Mitsunaga 2012

// I recommend you to use the same power supply voltage for 
// BH1603FVC and Arduino. I use 5.0V for this example.
// And I put a 0.22uF capsitor for LPF between AOUT and GND of BH1603FVC.

// Fixed values
const int BH1603FVC_G1pin = 2;     // Connect GC1 to D2 of Arduino
const int BH1603FVC_G2pin = 3;     // Connect GC2 to D3 of Arduino
const int BH1603FVC_AOUTpin = A0;  // Connect AOUT to A0 of Arduino
const float VREF = 5.0;  // Analog reference voltage is 5.0V
const float R1 = 5600.0; // 5.6kOhm is used

// Global variables
int curGain = 0;

// Function declarations
void setGain(int g);
float readLight();

void setup()
{
  digitalWrite(BH1603FVC_G1pin, LOW);
  digitalWrite(BH1603FVC_G2pin, LOW);
  pinMode(BH1603FVC_G1pin, INPUT);
  pinMode(BH1603FVC_G2pin, INPUT);
  setGain(curGain);

  Serial.begin(9600);
  while (!Serial) {} // for Leonard
}

void loop()
{
  float v = readLight();
  Serial.println(v);
  delay(500);
}

// Set gain of BH1603FVC
// g = 0: LOW gain, g = 1: MID gain, g = 2: HIGH gain
void setGain(int g)
{
   switch (g) {
    case 0:
      pinMode(BH1603FVC_G1pin, INPUT);
      pinMode(BH1603FVC_G2pin, INPUT);
      break;
    case 1:
      pinMode(BH1603FVC_G1pin, OUTPUT);
      pinMode(BH1603FVC_G2pin, INPUT);
      break;
    case 2:
    default:
      pinMode(BH1603FVC_G1pin, INPUT);
      pinMode(BH1603FVC_G2pin, OUTPUT);
      break;
   }
}

// Read ambient light value. Return values in [lx].
float readLight()
{
  float v;

  if (curGain == 0) {  // LOW gain
    v = analogRead(BH1603FVC_AOUTpin) * VREF / 1024.0 * 1000000.0/(0.006*R1);

    if (v<9821.0) {
      curGain = 1;
    }
  } else if (curGain == 1) { // MID GAIN
    v = analogRead(BH1603FVC_AOUTpin) * VREF / 1024.0 * 1000000.0/(0.06*R1);
    if (v >= 9821.0)
      curGain = 0;
    else if (v < 982.1)
      curGain = 2;
    setGain(curGain);
  } else { // HIGH GAIN
    v = analogRead(BH1603FVC_AOUTpin) * VREF / 1024.0 * 1000000.0/(0.6*R1);
    if (v >= 982.1)
      curGain = 1;
  }
  setGain(curGain);

  return v;  
}

ダウンロード

上記のスケッチです


Arduinoのすすめ
Copyright (c) 2013, Noriaki Mitsunaga