【问题标题】:Simultaneous blinking LEDs, with separate and inconsistent patternsLED 同时闪烁,具有不同且不一致的模式
【发布时间】:2016-04-30 23:26:46
【问题描述】:

我正在尝试同时运行两个“闪烁”式功能。

我在其他地方找到了一些代码,可以让我这样做并对其进行修改!太好了。

但是,我想做的是像往常一样每 1000 毫秒打开和关闭一个 LED,但让另一个 LED 以奇怪的模式闪烁,例如开启 3000 毫秒,关闭 100 毫秒,开启 100 毫秒,关闭200ms 然后循环回来。

为了实现这一点,我尝试在找到的代码中添加一个随机函数,但我不喜欢它的外观。它看起来像一个闪烁的 LED,带有干扰或其他东西,例如在无线电发射器或其他东西上。我正在尝试复制一个旧的闪烁灯泡,这意味着它必须始终开启比关闭时间更长的时间,本质上它需要在“更长”的时间内开启/高亮,然后被几次短暂的 ON 闪烁打断和关闭

因此,我正在寻求有关如何协调第二个 LED 以更​​具体的闪烁系列打开和关闭的帮助。

这是我目前使用的代码:

/* Blink Multiple LEDs without Delay
*
* Turns on and off several light emitting diode(LED) connected to a digital
* pin, without using the delay() function.  This means that other code
* can run at the same time without being interrupted by the LED code.
*/
int led1 = 13;                // LED connected to digital pin 13
int led2 = 12;
int value1 = LOW;                // previous value of the LED
int value2 = HIGH;                // previous value of the LED
long time1 = millis();
long time2 = millis();

long interval1 = 1000;           // interval at which to blink (milliseconds)

void setup()
{
 Serial.begin(9600);
 randomSeed(analogRead(0));
 pinMode(led1, OUTPUT);      // sets the digital pin as output
 pinMode(led2, OUTPUT);
}

void loop()
{
 unsigned long m = millis();

 if (m - time1 > interval1){
   time1 = m;

   if (value1 == LOW)
     value1 = HIGH;
   else
     value1 = LOW;

   digitalWrite(led1, value1);
 }

long interval2 = random(100,1500);

 if (m - time2 > interval2){
   time2 = m;

   if (value2 == LOW)
     value2 = HIGH;
   else
     value2 = LOW;

   digitalWrite(led2, value2);
 }

   Serial.println(interval2);
}

【问题讨论】:

  • 当你第一次发布它时,我开始写一个解决方案,但我没有 arduino IDE 也没有真正的 arduino,所以我开始用纯 C 编写它。最终睡着了:D 无论如何,让一个名为 flicker() 或类似的函数,它在 for 循环中打开和关闭 LED,其间有非常短的随机延迟。然后每隔 15-60 秒左右随机调用这个函数。我认为这会给人一种濒临死亡的灯泡的印象
  • 感谢您的想法,我会玩,但不会延迟暂停所有内容吗?因此会暂停需要每 1000 毫秒持续开/关的第二个 LED?
  • 是的,我认为 delay 会阻止执行,但您可以使用时间比较而不是 delays,就像您在 if (m - time1 > interval1){ ... 中所做的那样

标签: c random arduino delay led


【解决方案1】:

这将始终花费不到一秒的时间运行,因此您可以返回主循环并确保您不会错过其他 LED 的 1 秒开/关:

void flicker(){
    boolean state = false;
    int r = random(20, 175);
    for(int i = 0; i < 5; i++){
        digitalWrite(led2, state);
        state = !state;
        delay(r);
        r = random(20, 175);
    }
    digitalWrite(led2, HIGH);
}

顺便说一句。我正在替换此切换代码:

if (value2 == LOW)
  value2 = HIGH;
else
  value2 = LOW;

digitalWrite(led2, value2);

用这个:

state = !state;
digitalWrite(led2, state);

现在,随机拨打flicker();也许每 15-45 秒或任何你认为合适/现实的。

【讨论】:

  • 对不起,我不想让人讨厌,但你能完整地发布代码吗?我正在尝试实现您在此处所拥有的功能,但会收到大量不同的错误消息。我不能在这里从根本上理解....
  • @ConnorCrawford 我只是在没有访问 arduino 的情况下写这个“徒手”,所以错误可能是我的错。但是答案中未包含的内容只是您已经拥有的设置和主要功能,然后是主循环中的时间比较,它以大约 15-45 秒的随机间隔调用flicker()。您遇到了哪些错误?
  • 再次感谢。当我尝试调用 flicker(); 时,我得到“不应忽略的无效值”。现在发挥作用。我还得到了“未在此范围内声明的状态”,我不确定在修复第一个错误后它是否会重新出现。也许我不知道如何正确调用该函数,更不用说每 15-45 秒一次。 if (m - time2 &gt; interval2){ time2 = m; int onoff; onoff = flicker(); state = !state; digitalWrite(led2, state); }
  • 删除所有int onoff; onoff = flicker(); state = !state; digitalWrite(led2, state); 并用flicker(); 替换它,仅此而已。您只需要调用名为flicker() 的函数,而不是将其返回值分配给变量(这将不起作用,因为它没有;这就是void 的意思)
【解决方案2】:

试试这样的:

void setup()
{
 Serial.begin(9600);
 randomSeed(analogRead(0));
 pinMode(led1, OUTPUT);      // sets the digital pin as output
 pinMode(led2, OUTPUT);
}

long interval2 = random(100,1500);

void loop()
{
 unsigned long m = millis();

 if (m - time1 > interval1){
   time1 = m;

   if (value1 == LOW)
     value1 = HIGH;
   else
     value1 = LOW;

   digitalWrite(led1, value1);
 }

 if (m - time2 > interval2){
   time2 = m;

   if (value2 == LOW) {
     value2 = HIGH;
     interval2 = random(100, 1500);
   } else {
     value2 = LOW;
     interval2 = random(100, 200);
   }

   digitalWrite(led2, value2);
 }

【讨论】:

  • 我看到你在开什么车了,而且比以前更近了,谢谢。然而,在我看来,它仍然只是一个闪烁的灯,相当二进制的开/关。我想知道是否有一种方法可以让它在 LOW 之后回到 HIGH,但是一个具有较小随机范围的“新的单独 HIGH”......
  • 我不确定我是否理解您所说的“新单独 HIGH”是什么意思,您能否更详细地解释一下您想要什么(不是用编程术语,只是您想要什么结果)?
  • 是的,抱歉 - 您对代码的编辑允许 LED 在 100 到 1500 之间的随机时间内保持 ON/HIGH。然后在 100 和 200 之间保持 OFF/LOW。我希望 LED ON/HIGH 在 1000 和 1500 之间的时间段内,然后在 100 和 200 之间的时间段内的 OFF/LOW 状态,然后再次 ON/HIGH 但仅在 100 和 200 之间的时间段内,然后再次在 100 和 200 之间的时间段内 OFF/LOW . 在这一点上,它可以循环回来并重复,但更多的控制/额外的高和低将是理想的。本质上,它需要“长时间”开启,然后被几次短暂的 ON 和 OFF 闪烁打断
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多