设为首页收藏本站

arduino 单片机机器人爱好者之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5644|回复: 12

Arduino入门教程—基础实验篇六 光控开关

[复制链接]

签到天数: 431 天

[LV.9]以坛为家II

发表于 2013-5-26 08:29:17 | 显示全部楼层 |阅读模式
本帖最后由 AllBlue 于 2013-10-29 19:20 编辑

光控开关
今天我们做一个光控开关实验,我们使用到一种电阻--光敏电阻。
实验元件:

UNO 实验套装(UNO R3控制板、USB数据线、面包板、跳线)

LED灯 一枚

光敏电阻 一个

电阻220Ω 一枚

电阻10KΩ  一枚

光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。实物图如下:

光敏电阻.jpg


光敏电阻的工作原理是基于内光电效应。在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。当有光线照射时,电阻内原本处于稳定状态的电子受到激发,成为自由电子。所以光线越强,产生的自由电子也就越多,电阻就会越小。经过测试,光敏电阻在黑暗中,电阻值大概有1~10M,在光照下,电阻值大概有几百到几千欧姆。



下面我们就用它来做本次实验。
下图是实验电路图(接线时注意尽量不要遮挡住光敏电阻,以免影响实验结果):

光敏电阻.jpg

电路搭建好了,我们要将程序烧写到UNO 中,例程如下:
  1. /*
  2. 光敏电阻控制 LED
  3. 根据传感器的模拟值大小设定LED的亮度
  4. */

  5. #define LED 11      //定义LED引脚为11
  6. int val = 0;        //储存传感器的变量数值

  7. void setup(){
  8.   pinMode(LED, OUTPUT);     //设定LED引脚为输出状态
  9.           //注意:模拟接口自动设为输入
  10. }

  11. void loop(){
  12.   val = analogRead(5);       //读取传感器的模拟值并储存
  13.   analogWrite(LED,val/4);    //设置LED亮度(PWM输出范围0-255)
  14.   delay(10);                 //延时10毫秒
  15. }
复制代码

例程中,val = analogRead(5);这个语句是读取模拟端口A5的值,不是数字端口5,模拟接口默认为输入端口,不用再写语句。analogWrite(LED,val/4); 这个语句是设置LED亮度,val/4是因为val读取出来的值范围是0~1023,而上面介绍过PWM范围是0~255,所以要将val的值除以4!!


该程序,实际效果有遮挡时,LED亮度变亮,无遮挡时,LED亮度变暗,光线强烈时,LED会熄灭(有可能只是肉眼看不到LED的亮度了)!
  1. int photoresistancePin = 5;  //定义变量photoresistance=5,为电压读取端口。
  2. int ledPin = 11;   //设置led数字IO脚
  3. int val = 0;       //定义变量i
  4. void setup() {
  5.   pinMode(ledPin, OUTPUT);  //设置ledPin脚模式,为输出
  6. }
  7. void loop() {
  8.   val = analogRead(photoresistancePin);    //从传感器读取值
  9.   if(val<=512){      
  10.     /*512=2.5V,想让传感器敏感一些的时候,把数值调高,
  11.      想让传感器迟钝的时候把数值调低。*/
  12.     digitalWrite(ledPin, LOW);//当光照强度过强时led灭。
  13.   }
  14.   else{
  15.     digitalWrite(ledPin, HIGH); //当光照强度过低时led亮。
  16.   }
  17. }
复制代码

这个程序效果:用手遮挡光敏电阻,LED点亮,不遮挡,LED熄灭,当然这是在白天的情况下。(其中可以改变判断值来改变光敏电阻的灵敏度)

在此感谢sangluyuan 同学的指出文章中的错误!!

本帖被以下淘专辑推荐:

该用户从未签到

发表于 2013-10-29 09:42:18 | 显示全部楼层
这个不一样

点评

???这个好像对的吧,没看出来哪里错了  发表于 2013-10-29 17:45
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2013-10-29 18:27:42 | 显示全部楼层
程序烧写入UNO控制板后,用手遮挡光敏电阻,LED点亮,不遮挡,LED熄灭,当然这是在白天的情况下~~~~~                              这个实现 不了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2013-10-29 18:28:37 | 显示全部楼层
灯一直亮,

点评

谢谢指正~~~文章已更正,希望没有误导你,呵呵!  发表于 2013-10-29 19:24
灯的亮度应该是改变的,只是肉眼没有察觉,如果想要灯完全熄灭,可以加个判断语句; 我最后那句话写的确实是有些问题的,这个程序是通过返回值来调节LED亮度,有遮挡时,LED变亮,无遮挡时,LED变暗!  发表于 2013-10-29 19:11
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-7-28 20:46:38 | 显示全部楼层
什么是photoresistancePin
回复 支持 反对

使用道具 举报

签到天数: 431 天

[LV.9]以坛为家II

 楼主| 发表于 2015-7-28 21:15:47 | 显示全部楼层
handanqibu 发表于 2015-7-28 20:46
什么是photoresistancePin

这只是个名称,用来指定连接光敏电阻的引脚
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-8-13 21:24:52 | 显示全部楼层
不明白什么意思,能具体点吗

点评

哪里不太明白呢~  发表于 2015-8-14 08:08
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-8-18 15:21:04 | 显示全部楼层
photoresistancePin是个人定义的,还是arduiro中的专门定义 模拟端口不需要在编程中注明吗
回复 支持 反对

使用道具 举报

签到天数: 431 天

[LV.9]以坛为家II

 楼主| 发表于 2015-8-18 20:04:51 | 显示全部楼层
handanqibu 发表于 2015-8-18 15:21
photoresistancePin是个人定义的,还是arduiro中的专门定义 模拟端口不需要在编程中注明吗

自己定义的哦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|联系我们|YFRobot ( 苏ICP备13017135  

GMT+8, 2017-4-27 11:06 , Processed in 0.432757 second(s), 36 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表