光敏电阻简介
光敏电阻属于无极性器件,利用硫化镉或硒化镉等半导体材料的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器。光照越强,阻值就越低。为了增加灵敏度,光敏电阻常做成梳状。
光敏电阻是器件中用的较广的一种,由于它体积小、灵敏度高、性能稳定、价格低,因此在自动控制、家用电器中得到广泛应用。例如在电视机中作亮度自动调节、照相机中作自动曝光、音乐石英钟中控制晚间不奏鸣报点,另外在路灯航标灯自动控制电路、卷带自停装置及防盗报警装置中起了重要作用。
主要芯片:LM393、光敏电阻。
光敏实验原理
利用光敏电阻的阻值随光照强度变化的特性,在电路中,要串联一个电阻,如上图所示,方能读取变化的数据。串联电阻的阻值根据设计确定。
串联电阻的目的:利用串联分压原理,当光敏电阻阻值变化时,模拟输入引脚数的电压会随之发生变化。
如:光照强度增强时,光敏电阻阻值减小,整个电路的总电阻减小,根据欧姆定律,电路的电流增大,因而串联电阻的分压值增大,模拟引脚输入点的电压值减小,导致程序中模拟输入的返回值减小。
若将光敏电阻和分压电阻互换位置,则结果正好相反,即:随着光照强度的增强,程序中模拟输入的返回值随之增大。
光敏电阻的使用
实验一:光敏电阻数值读取
项目要求:
通过串口监视器查看光敏电阻输入的数值。
注意:光敏电阻为模拟输入器件,对应的端口为:A0~A5。
电路搭建
参考程序
const int ldrPin = A5; //左侧光敏电阻连接引脚A5
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
}
void loop() {
int ldrValue = analogRead(gmdianzu); //读取模拟口A5的值,存入变量中
Serial.print(“ldrValue = “);
Serial.println(ldrValue); //输出gmValue的值到串口监视器
delay(500);
}
实验结果
串口监视器可读取到:0~1024范围内的数值。
实验二:亮度感应灯
项目要求:
随着光照强度变小,LED越亮。
注意:光敏电阻为模拟输入器件,对应的端口为:A0~A5。
电路搭建
参考程序
const int minVal=300; //设定当前环境光的最小值
const int maxVal=1024; //设定当前环境光的最大值
const int ldrPin=A0; //光敏电阻连接引脚A0
const int ledPin=3; //LED模拟输出引脚3
void setup() {
pinMode(ldrPin,INPUT);
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}
void loop() {
int ldrVal = analogRead(ldrPin); //获取光敏电阻的返回值
ldrVal = constrain(ldrVal,minVal,maxVal);
int ledVal =map(ldrVal,minVal,maxVal,0,255);
Serial.print(“Value : “);
Serial.print(ldrVal); //将光敏电阻返回值输出到串口监视器上
Serial.print(“——“);
Serial.println(ledVal); //将映射后的值输出到串口监视器上
analogWrite(ledPin,ledVal); //模拟输出,LED亮度发生变化
}
实验结果
随着光照强度变小,LED越亮。
实验三:亮度感应灯(进阶版)
项目要求:
随着光照强度变小,LED越亮。且自动设置最大值与最小值。
注意:光敏电阻为模拟输入器件,对应的端口为:A0~A5。
电路搭建
参考程序
const int ldrPin = A0; //光敏电阻连接引脚A0
const int ledPin = 3; //LED模拟输出引脚3
int minVal = 1023; //设定当前环境光的最小值
int maxVal = 0; //设定当前环境光的最大值
void setup() {
// put your setup code here, to run once:
pinMode(ldrPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
analogWrite(ledPin, 255); //点亮LED,标示检测开始
for (int i = 0; i < 1000 ; i++) { //循环1000次检测当前的最小值和最大值
int val = analogRead(ldrPin);//获取光敏电阻的返回值
if (val > maxVal) { //若val大于maxVal
maxVal = val; //将maxVal的值更改为val的值
}
if (val < minVal) { //若val小于minVal
minVal = val; //将minVal的值更改为val的值
}
delay(5);
}
analogWrite(ledPin, 0); //LED熄灭,检测结束
Serial.print(“max =”);
Serial.println(maxVal); //输出最大值
Serial.print(“min =”);
Serial.println(minVal); //输出最小值
}
void loop() {
// put your main code here, to run repeatedly:
int val = analogRead(ldrPin); //获取光敏电阻的返回值
val = constrain(val, minVal, maxVal);
val = map(val, minVal, maxVal, 0, 255);
analogWrite(ledPin, val); //模拟输出,LED亮度发生变化
Serial.print(“Value : “);
Serial.println(val); //将映射后的值输出到串口监视器中
}
实验结果
随着光照强度变小,LED越亮。
评论(0)
您还未登录,请登录后发表或查看评论