本帖最后由 AllBlue 于 2013-10-29 19:20 编辑
光控开关
今天我们做一个光控开关实验,我们使用到一种电阻--光敏电阻。
实验元件:UNO 实验套装(UNO R3控制板、USB数据线、面包板、跳线) LED灯 一枚 光敏电阻 一个 电阻220Ω 一枚 电阻10KΩ 一枚
光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。实物图如下:
光敏电阻的工作原理是基于内光电效应。在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。当有光线照射时,电阻内原本处于稳定状态的电子受到激发,成为自由电子。所以光线越强,产生的自由电子也就越多,电阻就会越小。经过测试,光敏电阻在黑暗中,电阻值大概有1~10M,在光照下,电阻值大概有几百到几千欧姆。
下面我们就用它来做本次实验。
下图是实验电路图(接线时注意尽量不要遮挡住光敏电阻,以免影响实验结果): 电路搭建好了,我们要将程序烧写到UNO 中,例程如下:- /*
- 光敏电阻控制 LED
- 根据传感器的模拟值大小设定LED的亮度
- */
- #define LED 11 //定义LED引脚为11
- int val = 0; //储存传感器的变量数值
- void setup(){
- pinMode(LED, OUTPUT); //设定LED引脚为输出状态
- //注意:模拟接口自动设为输入
- }
- void loop(){
- val = analogRead(5); //读取传感器的模拟值并储存
- analogWrite(LED,val/4); //设置LED亮度(PWM输出范围0-255)
- delay(10); //延时10毫秒
- }
复制代码例程中,val = analogRead(5);这个语句是读取模拟端口A5的值,不是数字端口5,模拟接口默认为输入端口,不用再写语句。analogWrite(LED,val/4); 这个语句是设置LED亮度,val/4是因为val读取出来的值范围是0~1023,而上面介绍过PWM范围是0~255,所以要将val的值除以4!!
该程序,实际效果:有遮挡时,LED亮度变亮,无遮挡时,LED亮度变暗,光线强烈时,LED会熄灭(有可能只是肉眼看不到LED的亮度了)!- int photoresistancePin = 5; //定义变量photoresistance=5,为电压读取端口。
- int ledPin = 11; //设置led数字IO脚
- int val = 0; //定义变量i
- void setup() {
- pinMode(ledPin, OUTPUT); //设置ledPin脚模式,为输出
- }
- void loop() {
- val = analogRead(photoresistancePin); //从传感器读取值
- if(val<=512){
- /*512=2.5V,想让传感器敏感一些的时候,把数值调高,
- 想让传感器迟钝的时候把数值调低。*/
- digitalWrite(ledPin, LOW);//当光照强度过强时led灭。
- }
- else{
- digitalWrite(ledPin, HIGH); //当光照强度过低时led亮。
- }
- }
复制代码这个程序效果:用手遮挡光敏电阻,LED点亮,不遮挡,LED熄灭,当然这是在白天的情况下。(其中可以改变判断值来改变光敏电阻的灵敏度) 在此感谢sangluyuan 同学的指出文章中的错误!! |