【问题标题】:How to break infinite while in Arduino如何在 Arduino 中打破无限
【发布时间】:2016-02-11 23:09:27
【问题描述】:

A-R-D-U-I-N-O 电路,包括焊盘编号和带有此代码的 LED

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

void setup() {
    pinMode(13,OUTPUT);
    Serial.begin(9600);
}

void loop() {
    char key = keypad.getKey();

    if (key) {
        Serial.println(key);
        switch(key) {
            case 'A': 
            while(1)
            {
                digitalWrite(13,HIGH);
                delay(1000);
                digitalWrite(13,LOW);
                delay(1000);
            }
        break;
    }
}

我怎样才能制作另一个案例,例如(case 'D') 来停止这个无限循环?

【问题讨论】:

  • 这是什么语言
  • 你将无法做出这样的事情。以这种方式使用无限循环不应该是一个好主意。尝试另一种控制方式,例如用millis()测量时间。

标签: while-loop arduino break infinite


【解决方案1】:

您无法退出 while 循环,因此您将继续运行代码

digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);

为了能够运行案例“D”之类的案例,您将永远不会离开此循环。您需要在 while 循环中放置一个 if 语句,以检查您想要的任何内容。如果是真的那么你应该break;

if (statement) break;

【讨论】:

    【解决方案2】:

    好吧,实际上您不能从外部中断该 while,因为程序只会在 while 循环内运行这些指令。也许你应该使用另一种策略。一种是使用另一个变量来保存选项。 比如:

    void loop(){
    
    int option = 0;
    
    char key = keypad.getKey();
    
    if (key)
    {
       Serial.println(key);
       switch(key){
         case 'A': option = 1; break;
         case 'B': option = 2; break;
       }
    }
    
    if(option == 1)
    {
      digitalWrite(13,HIGH);
      delay(1000);
      digitalWrite(13,LOW);
      delay(1000);
    }
    else if(option == 2)
    {...}
    }
    

    【讨论】:

      【解决方案3】:

      看起来您的“switch”案例格式有点错误,我认为他们总是必须有一个默认案例。您的代码似乎也缺少键盘包含/定义。

      至于问题可能总是有一个标志,即两个按钮打开/关闭,然后根据该标志闪烁 LED。

      #include <Keypad.h>
      const byte ROWS = 4;
      const byte COLS = 4;
      
      byte rowPins[ROWS] = {5, 6, 7, 8}; //connect to the row pinouts of the keypad
      byte colPins[COLS] = {A3, A2, A1, A0}; //connect to the column pinouts of the keypad
      
      Keypad keypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);
      //yes i know that looks horrible 
      //would always have a different name for the keypad myself
      
      char keys[ROWS][COLS] = {
        {'1','2','3','A'},
        {'4','5','6','B'},
        {'7','8','9','C'},
        {'*','0','#','D'}
      };
      int flag=0;
      
      void setup() {
      pinMode(13,OUTPUT);
      Serial.begin(9600);
      }
      
      void loop() {
        char key = keypad.getKey();
      
        if (key) {
          Serial.println(key);
          switch(key) {
              case 'A': 
                flag=1;
                break;
      
              case 'D':
                flag=0;
                break;
      
              default:
                break
            }
          }
        if(flag){
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(13,LOW);
        delay(1000);
        }
      }
      

      唯一的问题是,在闪烁之间延迟时,它不会测试按键,因此要关闭标志,您必须按住“D”超过两秒钟,甚至可以点击它。我已经有一段时间没有使用这些键盘了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-05
        • 2014-07-21
        • 1970-01-01
        • 2012-03-04
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多