在 for 循环 Arduino 中用毫秒替换 delay()

Replace delay() with millis inside a for loop Arduino

在我的代码中,我想用毫秒或任何其他允许在代码仍在运行时使用按钮输入的方法替换 delay() 的效果。我正在制作一款障碍类游戏,玩家必须躲避传入的 LED。

int LEDrows[4][4] = {{9, 8, 7, 6}, {5, 4, 3, 2}};
int Button = 1;
int ButtonCheck = 0;
int playerPosition = 0;

void setup()
{
  pinMode(Button, INPUT);
  for(int p=0; p>=1; p++){
    for(int b=0; b>=3; b++){
      pinMode(LEDrows[p][b], OUTPUT);
    }
  }
}

void loop()
{
  ButtonCheck = digitalRead(Button);
  if(ButtonCheck != 0){
    playerPosition += 1;
    
    if (playerPosition == 1){
      digitalWrite(LEDrows[0][3], HIGH);
      digitalWrite(LEDrows[1][3], LOW);
    }
    if (playerPosition > 1){
      playerPosition = 0;
      digitalWrite(LEDrows[1][3], HIGH);
      digitalWrite(LEDrows[0][3], LOW);
    }
  }
  
  int i = random(0, 2);
  for (int j = 0; j <= 3; j++) {
    digitalWrite(LEDrows[i][j], HIGH);
    delay(250);
    digitalWrite(LEDrows[i][j], LOW);
    delay(250);
  }
  delay(500);
}

我有两行 4 个 LED,存储在我正在迭代的嵌套列表中。 LED 将随机点亮一行。我想让 LED 亮起,等待 250ms,然后再次让它消失,等待 250ms。如果不使用延迟函数也能实现类似 delay() 的效果,那么我很乐意学习如何做到这一点。

void toggle(uint8_t row,uint8_t col){
 static long time[4][4];

 long curr_time = millis(); //current system time
 long last_time = time[row][col];

 if(curr_time >= (last_time + toogle_delay)){
    digitalWrite((LEDrows[row][col]),!digitalread((LEDrows[row][col])));
    time[row][col] = curr_time;
 }
 else{}
}

使用静态变量来保留您希望周期性发生的事件的状态和时间戳。例如,以下将在第 0 行的随机列中设置一个 LED,每 250 毫秒将其移动到下一行,直到到达第 3 行后,它将在新的随机列重新启动。

  static int j = 0 ;
  static int i = 0 ;
  
  // When j == 0, set initial LED
  if( j == 0 )
  {
      i = random(0, 2);
      digitalWrite(LEDrows[i][j], HIGH ) ;
  }
  
     
  // Get current millisecond tick
  unsigned long now = millis() ;

  // Every 250ms move the LED     
  static unsigned long led_timestamp = millis() ;
  if( now - led_timestamp > 250 )
  {
      led_timestamp = now ;

      digitalWrite(LEDrows[i][j], LOW ) ;
      j++ ;
      if( j > 3 )
      {
          j = 0 ;
      }
      else
      {
          digitalWrite(LEDrows[i][j], HIGH ) ;
      }
  }

一般模式是:

static unsigned long timestamp = millis() ;
unsigned long now = millis() ;

if( now - timestamp > PERIOD_MS )
{
    timestamp = now ;

    // do something every PERIOD_MS here
    ...
}

使用多个 timestamp 变量,您可以在不同的独立时间间隔执行任务。