本帖最后由 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[242]= //注意这个数组类型,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]);
- i+=t; //i = i + t;
- if (i > 240) t = -1; //到达上限变减
- if (i < 1) t = 1; //到达下限变加
- delay(s);
- }
- }
复制代码
哈哈,手贱,把BL的类型从int改成了char,结果意外的发现不是呼吸灯,变成了心跳灯了。
感觉数组有点大,可以适当缩小点。有个100级应该肉眼就看不出啥来了。 |