极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13027|回复: 12

arduino RGB led 代码问题 急急急

[复制链接]
发表于 2013-12-7 11:03:33 | 显示全部楼层 |阅读模式
我用的是RGB led灯 想整一个呼吸灯的效果,代码如下,简单的代码:

  1. // left to right  red blue green
  2. int redpin=11;
  3. int bluepin=10;
  4. int greenpin=9;
  5. void setup()
  6. {
  7.   pinMode(redpin,OUTPUT);
  8.   pinMode(bluepin,OUTPUT);
  9.   pinMode(greenpin,OUTPUT);
  10. }
  11. void loop()
  12. {
  13.   yellow();
  14.   white();
  15.   lightred();
  16.   lightred();

  17. }
  18. void yellow()
  19. {
  20.   for(int a=0;a<=255;a++)
  21.   {
  22.   analogWrite(redpin,a);
  23.   analogWrite(greenpin,a);
  24.   delay(20);
  25. }
  26. }

  27. void white()
  28. {
  29.   for(int a=0;a<=255;a++)
  30. {
  31.   analogWrite(redpin,a);
  32.   analogWrite(bluepin,a);
  33.   analogWrite(greenpin,a);
  34.   delay(20);
  35. }
  36. }

  37. void lightred()
  38. {
  39.   for(int a=0;a<=255;a++)
  40. {
  41.   analogWrite(redpin,a);
  42.   analogWrite(bluepin,a);
  43.   delay(10);
  44. }
  45. }
复制代码


单独分别执行 yellow white lighted 颜色都正确,也跑得对,但放在一起我想让他们无线循环就不行了,颜色就紊乱了,不再是我设置的那三个颜色的循环,求问高手 如何解决。。。
回复

使用道具 举报

发表于 2013-12-7 11:50:48 | 显示全部楼层
建议你用 serial print 看一下debug信息是什么地方错了
回复 支持 反对

使用道具 举报

发表于 2013-12-7 14:01:12 | 显示全部楼层
这是老生常谈得很的问题了。

不要用delay,用millis()。具体请google吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-7 15:20:10 | 显示全部楼层
isilcala 发表于 2013-12-7 14:01
这是老生常谈得很的问题了。

不要用delay,用millis()。具体请google吧。

为什么不能用delay,减小延时就可以了呢?
回复 支持 反对

使用道具 举报

发表于 2013-12-7 15:29:57 | 显示全部楼层
wwtwxlwjh 发表于 2013-12-7 15:20
为什么不能用delay,减小延时就可以了呢?


如果你有去google过,就知道为什么了。网上有系统而完整得多的解释,以及各种示例代码。比在这里问答有帮助得多。
回复 支持 反对

使用道具 举报

发表于 2013-12-7 16:16:30 | 显示全部楼层
http://playground.arduino.cc/Code/AvoidDelay

关于 Delay 的limitation

换成 millis 看看吧
回复 支持 反对

使用道具 举报

发表于 2013-12-7 18:49:26 | 显示全部楼层
定时器中断才是正解。
millis这个函数很有用,但用来实现延时之类的功能,绝对不合适!
回复 支持 反对

使用道具 举报

发表于 2013-12-7 19:38:24 | 显示全部楼层
Estel 发表于 2013-12-7 18:49
定时器中断才是正解。
millis这个函数很有用,但用来实现延时之类的功能,绝对不合适!

为什么说millis 用来做延时不合适?
回复 支持 反对

使用道具 举报

发表于 2013-12-8 11:17:27 | 显示全部楼层
延时比较适合一些对时序要求很高的操作,us级别的。


不管是millis,还是delay,都是在不断的执行一些毫无意义的代码,消耗大量的机器周期来实现。

在一个相对资源丰富的系统里(电源,flash,sram)执行比较简单的程序,比如Blink,奢侈的使用任何库函数任何命令都不为过。
但如果系统复杂一点呢?你要不断的处理外部资源发来的中断消息,比如ad,按键,你要不断的向外部做好几路pwm,同时在一定周期对数码管,点阵之类的设备扫描,外部中断不够你还要在主循环里疯狂的while io口检测。 这样的情况,你就要节省每一点资源。

另外,最重要的一点:不是每一刻都有稳定的5V供电。如果用锂电或者干电池的话,更要节省。
同样的Blink,定时器中断里执行代码,主程序执行进入空闲模式。每个1秒周期来临时,系统会醒来闪烁LED,其他时间会休息来节省电量。

以上完全是经验之谈,吃透后,写起程序更是得心应手。

你这个问题,正解应该是:
单独执行时,正确,而放一起执行时不正确,是因为你在每个单独的调色函数结束后,没有对三个灯进行初始化。
yellow() 是红绿亮,蓝色灭。
lightred() 是红蓝亮,绿色灭。
发现错误了吗? yellow结束后,绿色一直是亮的。lightred() 就变成三个灯都亮了

解决方法,每个单独的函数,比如 yellow(),进去第一句就执行 r g b 三个灯都熄灭!
回复 支持 反对

使用道具 举报

发表于 2013-12-8 12:40:40 | 显示全部楼层
Estel 发表于 2013-12-8 11:17
延时比较适合一些对时序要求很高的操作,us级别的。

受教了,意思是如果有可能,我们尽量使用 delay() 这样能省电?
回复 支持 反对

使用道具 举报

发表于 2013-12-8 13:39:54 | 显示全部楼层
本帖最后由 isilcala 于 2013-12-8 14:00 编辑
Estel 发表于 2013-12-8 11:17
延时比较适合一些对时序要求很高的操作,us级别的。


“延时比较适合一些对时序要求很高的操作,us级别的。”

不知道这句是不是说的millis和delay,这两者返回的值都是毫秒为单位。微妙单位的是micros和delayMicroseconds。另外严格说来,millis和micros并不是“延时”函数。

“不管是millis,还是delay,都是在不断的执行一些毫无意义的代码,消耗大量的机器周期来实现。”

这句描述用来形容delay还算可以。但要放在millis身上则是个谬误。millis和delay本质上是完全不同的东西。

另外不知道对于millis“耗费大量资源”一说是否有实际的数据支撑?


定时器中断是个好东西,但它和millis一类也并非是替代而是共存关系。两者各有优劣之处。只是各自适用的场合不一样罢了。大家做的东西千百万种,以一概全未免有些偏颇。对于楼主这个case,一来连millis都还不知道,就跳跃到定时中断,怕是也不好消化;二来这个case也没有复杂到那个程度。还是先吃透了基础,再一步步深入比较好。
回复 支持 反对

使用道具 举报

发表于 2013-12-8 17:30:42 | 显示全部楼层
isilcala 发表于 2013-12-8 13:39
“延时比较适合一些对时序要求很高的操作,us级别的。”

不知道这句是不是说的millis和delay,这两者 ...

你说的很对,定时器中断因为Arduino本身并不提供核心支持。所以相对来讲,很难。如果直接调用AVR,操作寄存器,哪还不如不使用Arduino。感谢层主提醒,对一些新手灌输定时器中断确实不太合适。

还有一些内容,我写的比较含糊,表达错误了:


delay比较适合一些时序要求很高的地方。us级别。  我个人尽量避免用delay来做100ms以上的延时。除非是非常非常简单的一些实验。


millis本身不消耗资源,用millis来作延时这种不断等待,不断的和millis比较,是很消耗资源的。

在一个loop里如果只有一个blink需要执行,那么无所谓,可往往还有许多任务。那么不管是millis还是delay都很影响效率。

在这里我本人不厌其烦的不断说delay的“坏话”,是给大家提醒,使用delay,一定要慎重!
回复 支持 反对

使用道具 举报

发表于 2013-12-8 18:13:37 | 显示全部楼层
Estel 发表于 2013-12-8 17:30
你说的很对,定时器中断因为Arduino本身并不提供核心支持。所以相对来讲,很难。如果直接调用AVR,操作寄 ...

同意,delay有它的用处,但一般都是用在非常短的延时里需要紧跟后一个操作的。其他大部分情况都应该极力避免使用。

但是新手一定要掌握millis等函数。重要的不是该函数本身,而是由它去理解这个平台的程序执行逻辑究竟是怎样的,随后再去设计程序的结构,才会正确和有效(新手一定要知道的一件事是,BLINK只是一个演示,而绝非设计准则。可惜没有地方强调这一点。)。这也是为什么我不直接给一个millis的调用,而是建议去google的原因。

比如待楼主理解了这一点,自然也就知道自己的程序哪儿有问题,该怎么改了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 10:59 , Processed in 0.037566 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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