【问题标题】:Fuzzy Timer (random within boundaries) (Arduino)模糊计时器(边界内随机)(Arduino)
【发布时间】:2016-01-29 01:08:39
【问题描述】:

我需要一些帮助,试图让计时器变得有点模糊。我想使用这样的固定时间间隔:

____|_______|____|_____|_________|_____|___|_______|

其中管道是事件发生,下划线是数组中的延迟,如下所示:

int myIntervals = { 1000, 2000, 750, 850, 1200, 850, 500, 1000};

但值是任意的。

我想为事件创建一个轻微的随机性,但不允许随机性影响整体时间:

___*|*_____*|*__*|*___*|*_______*|*___*|*_*|*_____*|

其中随机性被描述为星号所包含的时间。

所以事件总是在间隔 +- 随机延迟发生:

intfuzzyPeriod = random(-75, 75);

我已经对此进行了试验,但无济于事......当模糊周期为负时,我发现自己处于递归中,或者像这样我显然遇到了 millis() 溢出问题。

int sequence[] = {1000, 750, 950, 1150, 1200, 1500, 1000, 1900, 2000};
unsigned int index;
unsigned long startMillis = 0;
unsigned int fuzzy = sequence[0];

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if (startMillis < millis())  // will have rollover issues <<<<<<<
  {
    if (millis() - startMillis >= fuzzy)
    {
      digitalWrite(13, !digitalRead(13));
      startMillis += sequence[index];   // advance startMillis by the last interval used
      index++;
      if (index >= sizeof(sequence) / sizeof(sequence[0]))
      {
        index = 0;
        Serial.println("Restarted Sequence");
      }
      fuzzy = sequence[index] + random(-75, 76); // arbitrary offset needs to be positive or negative
      Serial.print("fuzzy = ");
      Serial.println(fuzzy);
    }
  }
}

我希望我在解释方面做得很好......我这辈子都做不到,我知道我已经到了需要一点帮助的地步!

【问题讨论】:

  • 我对arduino一无所知,但它可能有助于存储绝对计时值。例如。而不是您的 {1000,750,950,...} 存储 {1000,1750,2700,...}。然后将它们随机化(可能除了最后一个)并将差异计算为序列[index]-sequence[index-1]。
  • 我考虑过,但是数据量要大一些,MCU的存储能力很小。

标签: c++ random timer arduino


【解决方案1】:

类似这样的:

unsigned int index;
unsigned long nextMillis;
int prevFuzzy = 0;
int fuzzy = 0;

void setup()
{
    //...
    nextMillis = millis();
}

void loop()
{
    if (millis() >= nextMillis)
    {
        fuzzy = random(-75, 76);
        // compensate for previous deviation and add new one
        nextMillis += sequence[index] - prevFuzzy + fuzzy;
        fuzzy = prevFuzzy;

        // or just:
        // fuzzy = random(-75, 76) - fuzzy
        // nextMillis += sequence[index] + fuzzy;

        index++;
        if (index >= sizeof(sequence) / sizeof(sequence[0]))
        {
            index = 0;
        }

        // Do stuff
    }
}

【讨论】:

  • 对不起,不会这样做,时间可能会级联不同步。 nextMillis += sequence[index] + random(-75, 76);
  • @JimfromPrinceton 我就知道你会写这个!查看更新的代码。
【解决方案2】:

首先,您必须使用 unsigned long 毫秒来正确解决溢出问题。

然后我也在不同的地方初始化变量,用不同的值启动Millis

int sequence[] = {1000, 750, 950, 1150, 1200, 1500, 1000, 1900, 2000};
unsigned int index = 0;
unsigned long startMillis;
unsigned int fuzzy = sequence[0] + random(-75, 76);

#include <limits.h>

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  randomSeed(analogRead(0));
  startMillis = millis();
}

void loop()
{
  long MilliDiff;
  if (startMillis <= millis())
    MilliDiff = millis() - startMillis;
  else
    MilliDiff = ULONG_MAX - startMillis + millis();

  if (MilliDiff >= fuzzy)
    {
      digitalWrite(13, !digitalRead(13));
      startMillis += sequence[index];   // advance startMillis by the last interval used

      index++;
      if (index >= sizeof(sequence) / sizeof(sequence[0]))
      {
        index = 0;
        Serial.println("Restarted Sequence");
      }

      fuzzy = sequence[index] + random(-75, 76); // arbitrary offset needs to be positive or negative
      Serial.print("startMillis = ");
      Serial.print(startMillis);
      Serial.print(",  sequence = ");
      Serial.print(sequence[index]);
      Serial.print(",  fuzzy = ");
      Serial.println(fuzzy);
    }
}

这段代码似乎在我的 Uno 上运行

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多