Arduino C随机LED代码无法打开所有LED

时间:2017-10-30 18:13:53

标签: c arduino

我使用Arduino Uno软件进行编码并遇到了问题。我试图以随机顺序打开8个LED,然后立即将它们全部关闭。我的问题是LED会多次打开相同的LED,最终不会全部打开。这使得电路没有达到我正在寻找的效果。我一直在努力解决这个问题大约两个小时,并尝试了许多无法解决的问题。这是我与之合作的代码:

void randomLED()
{
  int i;
  int index;
  int delayTime;
  int tracker;
  int ledPin1 = ledPins[0];
  int ledPin2 = ledPins[1];
  int ledPin3 = ledPins[2];
  int ledPin4 = ledPins[3];
  int ledPin5 = ledPins[4];
  int ledPin6 = ledPins[5];
  int ledPin7 = ledPins[6];
  int ledPin8 = ledPins[7];

  boolean ledPinOne = digitalRead(ledPin1);
  boolean ledPinTwo = digitalRead(ledPin2);
  boolean ledPinThree = digitalRead(ledPin3);
  boolean ledPinFour = digitalRead(ledPin4);
  boolean ledPinFive = digitalRead(ledPin5);
  boolean ledPinSix = digitalRead(ledPin6);
  boolean ledPinSeven = digitalRead(ledPin7);
  boolean ledPinEight = digitalRead(ledPin8);

  for (i = 0; i < 8; i++) {

    bailout:

    index = random(8);  // pick a random number between 0 and 7

    if (ledPinOne != HIGH && index == 0 || ledPinTwo != HIGH && index == 1 || ledPinThree != HIGH && index == 2 || ledPinFour != HIGH && index == 3 || ledPinFive != HIGH && index == 4 || ledPinSix != HIGH && index == 5 || ledPinSeven != HIGH && index == 6 || ledPinEight != HIGH && index == 7){
      digitalWrite(ledPins[index], HIGH);  // turn LED on
    }

    delay(100);  // pause to slow down
  }

  delay(1000);

  for (i = 0; i < 8; i++){
    digitalWrite(ledPins[i], LOW);
  }
}

我有一个很大的if语句,因为我需要为每个LED打开单独的条件。这些条件是必要的,因为随机数发生器会打开相同的LED两次,这是我不想要的。我希望将所有这些条件放入if语句会使LED按我想要的方式运行。我尝试将if语句中的==和!=更改为每个组合,但它仍然无法正常工作。我希望我能在这里找到并回答我的问题,以解决我的问题。

2 个答案:

答案 0 :(得分:1)

您的代码存在多个问题。您正在挑选8个随机数,因为您希望最后点亮所有8个LED,但如果您获得两次相同的数字怎么办?所以你必须以某种方式确保你选择一个与尚未点亮的LED相对应的数字。您的代码的另一个问题是您在循环外只读取每个LED引脚一次。因此,当您检查大型if语句中的每个引脚时,值不是最新的。

以下是解决这两个问题的快速但不好的方法:

int numberOfLEDsLit = 0;
while (numberOfLEDsLit < 8) {
    int index = random(8);
    int ledLit = digitalRead(ledPins[index]);
    if (ledLit == LOW) {
        digitalWrite(ledPinds[index], HIGH);
        numberOfLEDsLit++;
    }
}

基本上你选择一个随机的led,如果没有点亮那么点亮它否则什么都不做。继续,直到所有8个LED点亮。

答案 1 :(得分:0)

查看random()

的参考资料
  

如果random()生成的一系列值对于草图的后续执行很重要,请使用randomSeed()以相当随机的输入初始化随机数生成器,例如analogRead()未连接的引脚。

因此,如果您希望每次运行程序时序列不同,则需要在random()调用之前调用randomSeed(seed)