极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13314|回复: 8

呼吸灯的小研究

[复制链接]
发表于 2014-2-22 01:34:05 | 显示全部楼层 |阅读模式
本帖最后由 shihaipeng04 于 2014-2-23 13:44 编辑

呼吸灯好像没什么可说的,for++,然后for--,小学生水平哦。不过for出来的呼吸灯有些生硬,看着很机械,和苹果的那种呼吸感觉完全不一样。所以我就研究了一下,哈哈,网上很多文章,原来呼吸的变化幅度是个类似正弦波的曲线。

呼吸的频率从16~20次不等,实际效果感觉慢一些会更平和,快了有点心忙。

  1. void setup()
  2. {
  3.    //我懒pinmode是可以忽略的,这不是个好习惯,正经应用还是加上的好。
  4. }

  5. void loop() {
  6.    double a,i,s;
  7.    s = 0.006;
  8.    for (i=.1;i<3.04;i+=s)  //弧度0~3.14很麻烦,所以用了浮点数,没从0度开始,不同的led不太一样,我这个从0.1才会亮起来,0.1以下忽然就黑了,感觉很不好,还是连贯一些比较舒服
  9.                        //步长.006是 3.14的512分之一,步长太大会有闪动
  10.    {
  11.       if (i > 1.57) s = 0.004;  //当到达半π后,下降区间加大步长,让吐气变的更慢
  12.       a = sin(i)*255; //返回值0~1,所以*255
  13.       analogWrite(3,a);
  14.       delay(9);   //一个小的延时
  15.    }
  16.    delay(170);//适度间隔
  17. }
复制代码


欢迎大家继续研究,有好的成果共享一下。

a值还可以用Serial.print出来,把数值直接粘到数组变量里,就不用计算了。

应楼下的想法不错,搞了个数组,省的算了。
  1. char BL[242]=  //注意这个数组类型,int 和 char 会有不同的效果
  2.             {0,1,3,4,6,8,9,11,13,14,16,18,19,21,23,24,26,28,29,31,33,34,36,
  3.               38,39,41,43,44,46,47,49,51,52,54,56,57,59,60,62,64,65,67,69,70,
  4.               72,73,75,76,78,80,81,83,84,86,88,89,91,92,94,95,97,98,100,101,
  5.               103,104,106,107,109,111,112,113,115,116,118,119,121,122,124,
  6.               125,127,128,130,131,132,134,135,137,138,139,141,142,144,145,
  7.               146,148,149,150,152,153,154,156,157,158,160,161,162,164,165,
  8.               166,167,169,170,171,172,174,175,176,177,178,180,181,182,183,
  9.               184,185,186,188,189,190,191,192,193,194,195,196,197,199,200,
  10.               201,202,203,204,205,206,207,208,209,210,210,211,212,213,214,
  11.               215,216,217,218,219,219,220,221,222,223,224,224,225,226,227,
  12.               227,228,229,230,230,231,232,233,233,234,235,235,236,236,237,
  13.               238,238,239,240,240,241,241,242,242,243,243,244,244,245,245,
  14.               246,246,247,247,247,248,248,249,249,249,250,250,250,251,251,
  15.               251,252,252,252,252,253,253,253,253,254,254,254,254,254,254,
  16.               255,255,255,255,255,255,255,255,255,255,255,255,255};

  17. void setup()
  18. {
  19. }

  20. void loop() {
  21.    int i=0,s=2,t=1;;
  22.    while (1)
  23.    {
  24.       analogWrite(3,BL[i]);
  25.       i+=t;  //i = i + t;
  26.       if (i > 240) t = -1; //到达上限变减
  27.       if (i < 1) t = 1; //到达下限变加
  28.       delay(s);
  29.    }
  30. }
复制代码

哈哈,手贱,把BL的类型从int改成了char,结果意外的发现不是呼吸灯,变成了心跳灯了。

感觉数组有点大,可以适当缩小点。有个100级应该肉眼就看不出啥来了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-22 07:09:28 | 显示全部楼层
不错,学习了!
回复 支持 反对

使用道具 举报

发表于 2014-2-22 11:22:20 | 显示全部楼层
支持楼主,善于发现生活中的细节
回复 支持 反对

使用道具 举报

发表于 2014-2-22 20:24:56 | 显示全部楼层
本帖最后由 Lance 于 2014-2-22 20:26 编辑

灯并联个电容, 不知道效果会怎么样.
不过研究成果挺好. 以后我做呼吸灯也有依据了.
回复 支持 反对

使用道具 举报

发表于 2014-2-22 20:51:40 | 显示全部楼层
这个好,有点专业性
回复 支持 反对

使用道具 举报

发表于 2014-2-22 21:09:13 | 显示全部楼层
传说中的深入研究,刚好要用,留个脚印备查
回复 支持 反对

使用道具 举报

发表于 2014-2-23 05:12:17 | 显示全部楼层
楼主观察很仔细,钻研精神值得学习。算浮动数特别是正弦运算量较大,可以在用这个程序找到好的变化序列后存在数组里直接调用,在插入其它代码时会更省资源。4楼说的并联电容的方法也值得一试。
回复 支持 反对

使用道具 举报

发表于 2014-2-24 14:28:23 | 显示全部楼层
不错不错!支持一下!呼吸灯可以通过模拟电路的方式来实现的。这样就不会消耗宝贵的运算资源了嘛,arduino最为一个信号源控制信号。
回复 支持 反对

使用道具 举报

发表于 2014-2-24 23:58:59 | 显示全部楼层
{:soso_e113:}Arduino做呼吸灯成本太高了,我有两块钱STC单芯片的呼吸灯。外围元件只要一只电阻。
http://www.geek-workshop.com/thread-530-1-1.html
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 09:38 , Processed in 0.040255 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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