0

我已经跳过了闪烁的 LED,并已使用以下草图成功开始使 LED 褪色。

void setup() {
    pinMode(12, OUTPUT);
}

void loop() {
    for (int i=0;i<255;i++) {
        analogWrite(12,i);
    delay(10);
    }
}

但是,我刚刚意识到没有for(int i=254;i=0;i--)淡出。为什么我不需要那个?函数中有什么东西loop()会自动返回到开始状态吗?

4

2 回答 2

3

为什么我不需要那个?

你为什么不呢?

你当然知道。该程序使 LED 慢慢变亮,然后立即关闭,然后重新开始。那是锯齿形的轮廓,只是跛脚的IMO。

每个人都希望他们的 LED 平滑地变亮然后变暗。这更酷:

void setup() {
    pinMode(13, OUTPUT);
}

boolean fadein = true;
int bright = 0;

void loop() {

  // adjust brightness based on current direction
  if(fadein) {
    bright += 1;
  }
  else {
    bright -= 1;
  }

  // apply current light level
  analogWrite(13,bright);

  // when get to full bright, turn around
  if(255 == bright) {
    fadein = false;
  }
  // when get to full off, turn around
  if(0 == bright) {
    fadein = true;
  }  

  delay(10);
  // The delay is just a placeholder
  // here is where your program could do other useful things
  // in addition to the cool LED fade in fade out
  return;
}
于 2013-08-09T06:26:19.663 回答
1

您的setup()andloop()是一个更大程序的一部分(我们称它为此次讨论的调度程序)。该程序在运行开始时调用setup()一次。然后它执行loop(),如果loop()退出loop()则由调度程序再次调用。

因此,for循环运行一次并返回到调度程序,loop再次被调用,for循环再次运行。for 循环似乎永远在运行,因为与 for 循环中花费的时间长度相比,在调度程序中花费的时间是最少的。

最后,仅供参考,LED 似乎变暗了,因为它analogWrite()会在引脚上以称为脉冲宽度调制 (PWM) 的格式创建方波信号。LED 的亮度取决于 PWM 的占空比,这是 PWM 的第二个参数analogWrite()

尝试一个程序,其中 PWM 占空比的值在一个值范围内递增和递减。找到一个延迟,使 LED 在 5 或 10 秒内从关闭变为完全打开(或任何您想要的时间间隔!)

签名,前研究生助教

于 2013-08-09T05:01:13.073 回答