shihaipeng04 发表于 2014-2-22 01:34:05

呼吸灯的小研究

本帖最后由 shihaipeng04 于 2014-2-23 13:44 编辑

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

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

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

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

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

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

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

void setup()
{
}

void loop() {
   int i=0,s=2,t=1;;
   while (1)
   {
      analogWrite(3,BL);
      i+=t;//i = i + t;
      if (i > 240) t = -1; //到达上限变减
      if (i < 1) t = 1; //到达下限变加
      delay(s);
   }
}
哈哈,手贱,把BL的类型从int改成了char,结果意外的发现不是呼吸灯,变成了心跳灯了。

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

bacon6581 发表于 2014-2-22 07:09:28

不错,学习了!

软件-蹄飞 发表于 2014-2-22 11:22:20

支持楼主,善于发现生活中的细节

Lance 发表于 2014-2-22 20:24:56

本帖最后由 Lance 于 2014-2-22 20:26 编辑

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

万马奔腾 发表于 2014-2-22 20:51:40

这个好,有点专业性

迷你强 发表于 2014-2-22 21:09:13

:funk:传说中的深入研究,刚好要用,留个脚印备查

春泥蛋炒饭 发表于 2014-2-23 05:12:17

楼主观察很仔细,钻研精神值得学习。算浮动数特别是正弦运算量较大,可以在用这个程序找到好的变化序列后存在数组里直接调用,在插入其它代码时会更省资源。4楼说的并联电容的方法也值得一试。

sakunamary 发表于 2014-2-24 14:28:23

不错不错!支持一下!呼吸灯可以通过模拟电路的方式来实现的。这样就不会消耗宝贵的运算资源了嘛,arduino最为一个信号源控制信号。

Ansifa 发表于 2014-2-24 23:58:59

{:soso_e113:}Arduino做呼吸灯成本太高了,我有两块钱STC单芯片的呼吸灯。外围元件只要一只电阻。
http://www.geek-workshop.com/thread-530-1-1.html
页: [1]
查看完整版本: 呼吸灯的小研究