如何在 C++ Arduino Uno 中暂停空白

How to pause a void in C++ Arduino Uno

我的问题很简单,但我现在坚持了一段时间。

我需要制作一个脚本,当按下按钮循环 a() 时暂停。当你再次按下它时,它应该从它结束的地方开始。但是我想不出办法。

希望有人能帮帮我。

这是我的代码:

int Aan = 1;
int Uit = 0;

int analogPin = A3;

int LED1 = 13;
int LED2 = 12;
int LED3 = 11;
int LED4 = 10;

int val;
bool r = false;

void setup() {
  pinMode(analogPin, INPUT_PULLUP);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite(LED1, Aan);
  digitalWrite(LED2, Aan);
  digitalWrite(LED3, Aan);
  digitalWrite(LED4, Aan);
}

void loop() {
  val = digitalRead(analogPin);
  if (val == LOW)
  {
    if (r == true)
    {
      r = false;
    }
    if (r == false)
    {
      r = true;
    }
  }
  if (r == true)
  {
    a();
  }
}
void a() {
  for (int i = 10; i <= 13; i++)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, Uit);
    delay(100);
    digitalWrite(i, Aan);
  }
  for (int i = 13; i >= 10; i--)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, Uit);
    delay(100);
    digitalWrite(i, Aan);
  }
}

只是为了解释发生了什么.. Void a() 使 4 个不同的 LED 点亮并熄灭。使用的图案是骑士骑士(如果你不知道电视节目只是 google 他的车)

在您的 a() 函数中放置另一个 while 循环,当按钮弹起时该循环变为 false。

喜欢:

while(digitalRead(analogPin) == LOW)
{
}

只要按下按钮,循环就会继续。当您释放按钮时,程序将退出循环并继续执行您的代码。

我假设您希望 "Knight Rider" 模式持续 运行。

我做了一些更改。首先,我以一种方式向 运行 led 序列添加了一个函数。其次,我添加了一个 while 循环,它将始终 运行 一次,并且在按下按钮时将继续 运行。

bool paused = false;
int buttonState = HIGH;

void loop() {
    a();
}

// This only works if leds ports are consecutive
void runSequence(int ledStart, int ledEnd)
{
    int direction = ledStart < ledEnd ? 1 : -1;
    for (int i = ledStart; i != ledEnd + direction; i += direction) {
        digitalWrite(i, Uit);
        do {
            delay(100);
        } while (LOW == digitalRead(analogPin));  // Check button state
        digitalWrite(i, Aan);
    }
}

void a() {
  runSequence(LED4, LED1);
  runSequence(LED1, LED4);
}

编辑 根据评论进行更改

bool paused = false;
int buttonState = HIGH;

int currentLED = LED1;
int currentDirection = -1;

void loop() {
    checkButton();
    if (!paused) {
        // Flash the led
        digitalWrite(currentLED, Uit);
        delay(100);
        digitalWrite(currentLED, Aan);
        // Change direction?
        if (LED1 == currentLED || LED4 == currentLED) {
            currentDirection *= -1;
        }
        // Setup for next iteration
        currentLED += currentDirection;
    }
}

void checkButton() {
    int state = digitalRead(analogPin);
    // Check if button state has changed
    if (state != buttonState) {
        buttonState = state;
        // Change paused state when button is released
        if (state == HIGH) {
            paused = !paused;
        }
    }
}