前回はポテンショメーターを使用して8LED をグルグル回してみました。
今回はフォトレジスターを使用して暗くなったらLEDを点灯させる制御をしてみましょう。
フォトレジスターとは?
フォトレジスタ(光抵抗素子)は、光の強さに応じて抵抗値が変化する電子受動部品です。受ける光の強さによって抵抗値が減少します。この特性から、光強度を検出するために使用できます。受ける周囲光の強さに対して抵抗値が変化します。 フォトレジスタと回路図記号は以下の通りです。
以下の回路は、光抵抗素子の抵抗値変化を検出するために使用されます。光量の変化に応じて、出力電圧が変化します。
上記の回路では、光量の変化によるフォトレジスターの抵抗値の変化に伴い、フォトレジスターと抵抗器R2の間の電圧も変化します。(分圧の考え方です) そのため、この電圧を測定することで光の強度を知ることができます。
回路図
接続図
コード
/**********************************************************************
Filename : NightLamp
Description : Controlling the brightness of LED by photoresistor.
Auther : www.freenove.com
Modification: 2022/10/21
**********************************************************************/
#define PIN_ANALOG_IN 1
#define PIN_LED 14
#define CHAN 0
#define LIGHT_MIN 372
#define LIGHT_MAX 2048
void setup() {
ledcSetup(CHAN, 1000, 12);
ledcAttachPin(PIN_LED, CHAN);
}
void loop() {
int adcVal = analogRead(PIN_ANALOG_IN); //read adc
int pwmVal = map(constrain(adcVal, LIGHT_MIN, LIGHT_MAX), LIGHT_MIN, LIGHT_MAX, 0, 4095); // adcVal re-map to pwmVal
ledcWrite(CHAN, pwmVal); // set the pulse width.
delay(10);
}
コード解説
今回のコードでは19行目にconstrain()関数という見慣れない関数が出てきました。これは値の上限・下限を設定する処理です。直訳すると、制限する・拘束するという意味ですね。明るすぎた場合や暗すぎた場合に予期せぬ動作を招かないように、事前にLIGHT_MINとLIGHT_MAXの範囲に収まるようにします。そのうえで、mapで12ビットに引き伸ばしています。
ちなみに、深夜0時に実験しているのですが部屋の明るさと手で覆って暗くする程度ではあまり明るさの差が付きませんでした。スマホの懐中電灯を当てるとフォトレジスターがいい感じに反応してくれました。
次回はサーミスタを使用して温度計を作ってみましょう。
コメント