Arduinoで自然光の明るさを計測する
このブログはこんな人にオススメです
  • アルディーノ最近始めました!って人
  • 自然光の光を計測したい!って人
  • 回路図とプログラムを見たい!って人

こんにちは.けんゆー(@kenyu0501_)です.
今日はフォトレジスタを使って自然光の明るさを計測します.

フォトレジスタは,光の強度が増加すると電気抵抗値が下がる電子部品になります.

今回はCdSセル(硫化カドミウム)という,かなりポピュラーなフォトレジスタを使います.

以下のようなものです.

 

CdSセルは映像の一番後ろ側にあります.
周囲の明るさを計測して,暗ければLEDの照度をあげるような回路です.

周囲の明るさを計測したあとは,LCDによりデジタル的に表示するものと,LEDによりアナログ的に表示するものの2つに分けてます.

回路図

回路図はこのような感じです!
興味がある人は真似して見て下さい!

なお,LCDに関してはI2C通信をしています.
接続は4本のワイヤのみですが,混乱している方は以下を参考にしてみてください.
(参考:Arduino,I2C通信により4本のケーブルでLCDを動かす!)

プログラム

プログラムはこちらです!

Prototyping Labを参考にしていますが,I2C通信にてLCDを表示してます.

#include <LiquidCrystal_I2C.h>

// CdSセルに接続したピンの番号
const int sensorPin = 0;

// LEDに接続したピンの番号
const int ledPin = 9;

// LCDオブジェクト
LiquidCrystal_I2C lcd(0x3f,16,2);

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Hello, CdS cell!");
}

void loop() {
  // 明るさを読み取る
  int brightness = analogRead(sensorPin);

  // LCDの表示をクリアしてから読み取った明るさを表示
  lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("CdS: ");
  lcd.print(brightness);

  // センサの値(0~1023)をLEDの輝度(255~0)に変換
  int intensity = map(brightness, 0, 1023, 255, 0);

  // LEDの輝度を表示
  lcd.setCursor(0, 1);
  lcd.print("LED: ");
  lcd.print(intensity);

  // LEDに接続したピンに輝度の値をセット
  analogWrite(ledPin, intensity);

  // 次回の処理まで100ms待つ
  delay(100);
}

周りの環境が明るければLEDは暗くなり,周りの環境が暗ければLEDは明るくなります.

CdSセルの代替!?

このCdSセルは,光の強度を電圧に変換することのできる優れものであり,セルの感度が人間の視覚的なものに非常に近いです.
また,セルの価格もかなり安いです.

しかしながら,近年では,セルの中に有害物質が問題となっており,年々入手が困難になってきているそうです.
そのため代替センサとして,パナソニック電工の照度センサNaPiCa(AMS302)が同じような接続方法で使用できるようです.
(参考:Prototyping Lab)

 

かなり多くのセンシングが可能!

光計測の他にも,Arduinoはいろんなセンシングが実装できます.
例えば

  • 距離(赤外線センサや超音波センサ)
  • 振動(ピエゾ素子)
  • タッチ判定,直線上の位置(SoftPot)
  • 圧力(感圧センサ)
  • 曲がり具合(曲げセンサ)
  • 温度(温度センサ)
  • 傾き(チルトセンサ,水銀)
  • 動き(加速度センサ)
  • 方位角(デジタルコンパス)
  • 人体感知(焦電センサ)

などなど,かなりの数があります.
このブログでも余裕があれば全て取り上げて行きます!