ESP32でCdSセルを使用して、明るさの計測を行ってみたいと思います。
CdSセルは、明るくなると電気抵抗が下がって、暗くなると電気抵抗が高くなる抵抗器です。この抵抗値を監視して、暗くなったらLEDを点灯、明るくなったら消灯させるようにしてみます。
ESP32とCdSセルを接続
ESP32とCdSセルなどを接続していきます。
準備するもの
今回使用するものは、以下になります。
- ESP32
- ブレッドボード
- ジャンパーワイヤー
- CdSセル
- 抵抗①(100kΩ)
- LED
- 抵抗②(220Ω)
Cdsセル
Cdsセルは、秋月電子通商様から「CdSセル 5mmタイプ」を購入しました。
主な仕様は以下になります。
- 外形寸法:直径5mm
- ピーク波長:540nm(太陽光、人間の目に近く、緑色にピーク波長を持ちます)
- 最大電圧:150VDC
- 最大電力:100mW
- 明抵抗:10k~20kΩ(10Lux時)
- 暗抵抗:1MΩ
- 温度係数:±0.002/℃
接続
部品を以下のように接続していきます。
プログラム作成
CdSセルの値を監視して、暗さに応じてLEDを点灯させていきたいと思います。
プログラム
プログラムの概要は、CdSセルの抵抗値を監視して、LEDの明るさをPWM制御するといった処理になります。
const int CDS = 35; // CdSセル接続ピン
const int LED = 12; // LED接続ピン
const int PWM_CH = 0; // PWMチャンネル
void setup() {
pinMode(CDS, INPUT);
pinMode(LED, OUTPUT);
ledcSetup(PWM_CH, 1000, 12);
ledcAttachPin(LED, 0);
Serial.begin(115200);
}
void loop() {
int value = analogRead(CDS);
Serial.println(value);
unsigned int ledPow = 0x0FFF - value;
if(ledPow < 0x00FF){
ledPow = 0;
}
ledcWrite(PWM_CH, ledPow);
Serial.print("ledPow:");
Serial.println(ledPow);
delay(500);
}
プログラムについて簡単に説明していきます。
6行目で、CdSセルからの入力値を監視するピンの設定を行います。
7~9行目で、LEDをPWM制御する設定を行います。
8行目の「ledcSetup()」の第3引数は、12ビットを指定しています。これは、PWMのデューティ比に指定する値の範囲を0~4095にするためになります。ちなみに8ビットだと0~255になります。
以下は、loop()関数で繰り返し行う制御になります。
まず、15行目でCdSセルからの入力値を「analogRead(ピン番号)」で取得しています。
入力値の範囲は、0~4095までになります。
ちなみに明るい場合に値が大きくなり、暗くなると値が小さくなります。
18行目で、LEDのPWM出力値を計算しています。明るい場合はLEDを点灯させないため、0に近い値を設定する必要があるので、0x0FFF(4095)からCdSセルから取得した値を引いています。
20~21行目では、0~0x00FFの値の範囲はLEDが点灯しないように、0をLEDの出力として再設定をおこなっています。これは、ちょっとセンサーの上に手をかざしただけでもLEDが点灯してしまったため、このような制御をいれました。
24行目では、LEDのPWM制御を行って明るさの調整を行っています。
動作確認
実際に接続して、プログラムを書き込んで動作させてみました。
CdSセルの上に手をかざすなどして影をつくるとLEDが点灯します。ちょっと感動です。
室内の照明でもCdSから取得する値が最大の「4095」になっていました。明るさの値計測はこのセンサーでは、難しそうです。室内の明るさに加えてライト照射とかしてみようと思ったのですが、室内の照明で最大値になってしまいました。
写真だとわかりづらいですが、ちょっとした暗がりとして、机の下の床に置いてみました。大体この状態で、CdSセルから入力される値が「3000」~「3100」ぐらいです。
逆に暗さの方については、結構暗くしても「0」に近づけるのが難しい感じです。
この辺は別途調整が必要な感じです。また、PWM制御で明るさも調整しましたが、建物などについている自動で照明制御を行っているもののように、しきい値を決めて単純にON・OFFだけでも良かったかなと思いました。
まとめ
ESP32でCdSセルを使用して、暗くなったらLEDが点灯するように制御を行ってみました。
制御としては、CdSセルからの入力値を判定してLEDの点灯を行うだけといった、比較的簡単なものになっています。ですが、「暗くなると点灯する」というだけで、個人的にはかなり楽しい感じです。
この組み合わせに人感センサーを組み合わせると、夜に人が近づくと点灯するライトになります。以外にちょっとしたものの組み合わせで 便利なものがつくれるんだな~と、最初に考えた人はすごいな~と思わされます。
ぜひ人感センサーも購入して、これを試してみたいと思います。
【参考図書】