极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 155364|回复: 83

Arduino入门教程--第五课--按钮PWM控制LED亮度

  [复制链接]
发表于 2012-5-29 13:37:14 | 显示全部楼层 |阅读模式



昨天,我们学习了怎么玩延时开关,我想大家应该也玩了不少新鲜的玩法,今天我们来介绍一种更好玩的东西。通过PWM的方式来调整LED的光亮度。什么是PWM呢,具体请参考极客工坊WIKI词条:PWM

试验用元器件列表:


ocrobot mango控制板(Arduino兼容)一块
专用面包板跳线一盒
面包板一块
镊子一把
LED发光二极管一个
按钮开关两个
10K欧姆电阻两个
220欧姆电阻一个
USB数据连接线一根














接着我们来看电路连接图

arduino pwm 调光电路连接图

arduino pwm 调光电路连接图


从上图我们可以看到两个开关分别接到了数字接口,做输入检测,LED接到了板子上带有#号标识的数字接口上,注意只有带#号标识的接口才具备PWM输出功能。

好了,我们照设计的电路来在面包板上搭建电路




电路搭建好如上图。这样仔细检查一遍确认没有问题后,我们来下载程序

  1. /*
  2. 作者:极客工坊
  3. 时间:2012年5月29日
  4. IDE版本号:1.0.1
  5. 发布地址:[url=http://www.geek-workshop.com]www.geek-workshop.com[/url]
  6. 作用:通过两个开关来控制led的亮度
  7. */

  8. int n=0;
  9. void setup ()
  10. {
  11.   pinMode(4,INPUT);
  12.   pinMode(6,OUTPUT);      //该端口需要选择有#号标识的数字口
  13.   pinMode(10,INPUT);
  14. }

  15. void loop()
  16. {
  17.   int up =digitalRead(4);          //读取4号口的状态
  18.   int down = digitalRead(10);      //读取10号口的状态   
  19.   if (up==HIGH)                    //判断4号口目前是否是高电平
  20.   {
  21.    n=n+5;                         //每次累加值为5
  22.     if (n>=255) {
  23.       n=255;
  24.     }            //限定最大值为255   
  25. analogWrite(6,n);               //使用PWM控制6号口输出,变量n的取值范围是0-255
  26.     delay (300);
  27.   }
  28.   if (down==HIGH)                    //减少亮度
  29.   {
  30.    n=n-5;
  31.     if (n<=0) {
  32.       n=0;
  33.     }
  34. analogWrite(6,n);
  35.     delay (300);
  36.   }
  37. }

复制代码

下载好程序后就能进行实验了,以下是实验视频




==========分割线 下面为扩展阅读==========

本次实验所用到的语法请点击关键字进入极客工坊WIKI查看,词条内容在WIKI中不定期更新。
void
setup()
loop()
pinMode()
digitalRead()
analogWrite()
delay()
if
int
回复

使用道具 举报

发表于 2012-7-26 13:39:14 | 显示全部楼层
那个变量“l”和“1”长得太像了...建议强哥换成“i”或者“j”之类的以免误导新手
回复 支持 1 反对 1

使用道具 举报

发表于 2012-5-29 21:40:21 | 显示全部楼层
沙发我坐了
回复 支持 反对

使用道具 举报

发表于 2012-6-28 00:29:50 | 显示全部楼层
楼主的教程很细致啊 弱弱的问一下,在读取按钮开关的时候不需要除颤的语句处理吗?我当时被这个按键开关的除颤问题给折磨死了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-28 22:28:26 | 显示全部楼层
我懒,外带按钮质量好,按标准,应该是按下开关后30ms再取值的。。。。
回复 支持 反对

使用道具 举报

发表于 2012-7-19 12:18:12 | 显示全部楼层
谢谢楼主的教程,说实话还是研究了好久原理问题,研究并解决问题的过程很爽啊
回复 支持 反对

使用道具 举报

发表于 2012-7-25 18:35:52 | 显示全部楼层
本帖最后由 乐_乐(顺) 于 2012-7-25 18:46 编辑

强哥,菜鸟又要麻烦你了
这个实验里面我有几个问题
1】对于输入端有2个,1个是4,1个是10#(PWM),是否能把4换成其他端口(比如3#PWM),对整个控制是否有影响。
2】if (up==HIGH)
{
  analogWrite(6,l);
  l=l+10;
  if (l>=250)
  {
  l=250;
}
delay(300);
}

我在if (up==HIGH)后面加了一个“;”,程序变成了if (up==HIGH);按照维基里的意思,我的理解是不是IF语句只执行了一次,而且是L=250最大的一次,是这样理解吗?
3】DELAY在这里意义的什么,不太明白。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-25 20:12:14 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-25 18:35
强哥,菜鸟又要麻烦你了
这个实验里面我有几个问题
1】对于输入端有2个,1个是4,1个是10#(PWM),是否能 ...

1。输入端的数字口无所谓,可以换,只要修改程序对应位置即可
2.这个真不清楚,没这么用过
3.延迟300毫秒主要是为按钮安排一个缓冲时间,让按钮每300毫秒才判断一次是否按下。。不会因为程序过快,让按钮误以为按下一了很多次
回复 支持 反对

使用道具 举报

发表于 2012-7-26 11:10:18 | 显示全部楼层
哈哈,这个也很好玩,谢谢迷你强的出品教程!
回复 支持 反对

使用道具 举报

发表于 2012-7-26 12:55:36 | 显示全部楼层
嗯,我理解了!谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-26 15:36:26 | 显示全部楼层
Uduse 发表于 2012-7-26 13:39
那个变量“l”和“1”长得太像了...建议强哥换成“i”或者“j”之类的以免误导新手

{:2_25:}额。。。。好的。。。
回复 支持 反对

使用道具 举报

发表于 2012-7-26 17:07:36 | 显示全部楼层
问个问题...Uno R3 一样应该可以实现本实验吧, 我试了好几次都不行....
接线也检查了好几次,输出口也确定支持pwm{:soso_e127:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-26 17:08:00 | 显示全部楼层
Uduse 发表于 2012-7-26 17:07
问个问题...Uno R3 一样应该可以实现本实验吧, 我试了好几次都不行....
接线也检查了好几次,输出口也确定 ...

可以啊~!
回复 支持 反对

使用道具 举报

发表于 2012-7-26 17:27:12 | 显示全部楼层
手里只有DS18b20, 想试试能不能替换着用的,各种翻资料没翻到公式...
回来一看评论觉得我可以洗洗碎了..{:soso_e101:}
回复 支持 反对

使用道具 举报

发表于 2012-7-26 17:40:39 | 显示全部楼层
Uduse 发表于 2012-7-26 17:27
手里只有DS18b20, 想试试能不能替换着用的,各种翻资料没翻到公式...
回来一看评论觉得我可以洗洗碎了..{: ...

DS18B20的可以参考这个学习笔记
http://www.geek-workshop.com/thread-207-1-1.html
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号-2 )

GMT+8, 2021-10-28 21:23 , Processed in 0.055962 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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