如何在 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;
}
}
}
我的问题很简单,但我现在坚持了一段时间。
我需要制作一个脚本,当按下按钮循环 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;
}
}
}