首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino -通过按钮停止循环

Arduino -通过按钮停止循环
EN

Stack Overflow用户
提问于 2020-04-23 13:51:39
回答 2查看 1.6K关注 0票数 2

所以我一直在用TinkerCad做实验,等待我的arduino的到来。目前,我有一个分类明灯循环,我想开始和停止循环按下一个按钮。

目前,我可以通过按钮启动我的循环,但不能用相同的按钮停止循环。这跟退欧有关吗?

代码语言:javascript
复制
const int button = 10;
const int led1 = 8;
const int led2 = 4;
const int led3 = 3;
const int timedelay = 250;

boolean buttonstate = false;  

void setup()
  {

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(button, INPUT);
}

void loop() {

if(digitalRead(button)==HIGH)  // check if button is pushed
   buttonstate = !buttonstate;    //reverse buttonstate value

   if(buttonstate==true)
  {  
    digitalWrite(led1, HIGH);
    delay(timedelay); 
    digitalWrite(led1, LOW);
    delay(timedelay); 
    digitalWrite(led2, HIGH);
    delay(timedelay);
    digitalWrite(led2, LOW);
    delay(timedelay);
    digitalWrite(led3, HIGH);
    delay(timedelay);
    digitalWrite(led2, HIGH);
    delay(timedelay);
    digitalWrite(led1, HIGH); 
    delay(timedelay);
    digitalWrite(led3, LOW);
    delay(timedelay);
    digitalWrite(led2, LOW);
    delay(timedelay);
    digitalWrite(led1, LOW); 
    delay(timedelay);
    digitalWrite(led1, HIGH); }
   else {
        digitalWrite(led1, HIGH);
  }     
}

我的电路设置:

编辑:

我已经调整了我的代码,用millis替换了延迟,并寻找按钮状态的更改。仍在寻找一种方法,以调整interval_led1在循环结束,以产生病态的分类明灯序列。

代码语言:javascript
复制
const int led1 = 13;
const int led2 = 8;
const int led3 = 5;
const int button = 10;
int ledState_led1 = LOW;             // ledState used to set the LED
int ledState_led2 = LOW;
int ledState_led3 = LOW;


// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis_led1 = 0;        // will store last time LED was updated
unsigned long previousMillis_led2 = 0;
unsigned long previousMillis_led3 = 0;

long interval_led1 = 500;           // interval at which to blink (milliseconds)
long interval_led2 = 600;
long interval_led3 = 700;

boolean buttonstate = false;


void setup() {

pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(button, INPUT);

}





void loop() {
   // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis_led1 = millis();
  unsigned long currentMillis_led2 = millis();
  unsigned long currentMillis_led3 = millis();

  bool current_state = digitalRead(button);
  bool prev_buttonstate= false;

if(current_state==HIGH && current_state != prev_buttonstate)
{  
   buttonstate = !buttonstate;    //reverse buttonstate value
}
prev_buttonstate = current_state;



if(buttonstate==true)
    if (currentMillis_led1 - previousMillis_led1 >= interval_led1) {
    previousMillis_led1 = currentMillis_led1;
    if (ledState_led1 == LOW) {
      ledState_led1 = HIGH;
    } else {
      ledState_led1 = LOW;
    }
    digitalWrite(led1, ledState_led1);
    }

if(buttonstate==true)    
    if (currentMillis_led2 - previousMillis_led2 >= interval_led2) {
    previousMillis_led2 = currentMillis_led2;
    if (ledState_led2 == LOW) {
      ledState_led2 = HIGH;
    } else {
      ledState_led2 = LOW;
    }
    digitalWrite(led2, ledState_led2);
    }

if(buttonstate==true)
    if (currentMillis_led3 - previousMillis_led3 >= interval_led3) {
    previousMillis_led3 = currentMillis_led3;
    if (ledState_led3 == LOW) {
      ledState_led3 = HIGH;
    } else {
      ledState_led3 = LOW;
    }
    digitalWrite(led3, ledState_led3);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-23 16:01:37

在这里,您的两种情况在延迟方面是非常不同的:if(buttonstate==true)非常长,因为其中包含多个delay指令,而else非常快,因为其中没有delay

buttonstate==True和您按下按钮时(正如Delta_G所说,delay()大多数情况下都会防止测试发生,例如,您应该使用millis()来完成计时,但假设您很幸运并且通过了第一个if语句),所以buttonstate将切换到false

由于您的else指令没有延迟,董事会将很快返回到您的初始if,不幸的是,它仍然是true,因为您还没有足够快地按下这个按钮几微秒。因此,buttonstate将再次翻转,您的代码将落在您的if(buttonstate==true)中,这是非常长的,允许您在重新评估if(digitalRead(button)==HIGH)之前及时释放按钮。

解决方案(除了@Delta_G提出的定时问题和@TomServo提出的硬件问题之外)是寻求按钮状态的更改。因此,您必须将其与以前的值进行比较。您可以声明另一个布尔boolean prev_buttonstate = false;,并执行如下操作:

代码语言:javascript
复制
bool current_state = digitalRead(button);
if(current_state==HIGH && current_state != prev_buttonstate)
{  
   buttonstate = !buttonstate;    //reverse buttonstate value
}
prev_buttonstate = current_state;

希望能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2020-04-23 17:06:47

你的电路正确。如果你再继续按下按钮,情况就会继续保持良好,并且状态会再次错误地重置。

若要模拟切换效果,请使用bool变量,如下所示:当信号变低时,重新设置变量。

代码语言:javascript
复制
  void loop() {
       static bool ready = true;
       if(digitalRead(button)==HIGH && ready)
       {
           ready = false;
            buttonstate = !buttonstate; //reverse buttonstate value
            if(buttonstate){
                  digitalWrite(led1, HIGH);
                  delay(timedelay); 
                  digitalWrite(led1, LOW);
                  delay(timedelay); 
                  /* Etc*/ }
             else {
                  digitalWrite(led1, HIGH);
            }
     }
     else 
     if(digitalRead(button)==LOW && !ready)
     {
         ready = true;
     }     
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61388898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档