【问题标题】:Wait for Input before continuing - Arduino Uno在继续之前等待输入 - Arduino Uno
【发布时间】:2014-03-23 21:55:32
【问题描述】:

我正在使用 Arduino Uno 制作一个基本的体育比赛得分手(壁球/球拍)。

目标是 2 个按钮,每个玩家都有一个按钮,他们可以用它来增加分数。
这很简单,但是如果两个玩家碰巧同时达到 10[score],他们需要选择是达到 13 还是 15。

我的问题是它在调用 scoreDecide() 函数之前监听最后按下的按钮。

例如,player1 在 9(左键)上,player2 在 10(右键)上。

player1 按下他们的左键将他们最多提升到 10,scoreDecide() 被自动调用为循环识别它是 10/10[score]。

player2 决定按右键,选择 15 作为分数,但实际上它已经选择了左键值,因为这是在调用 scoreDecide() 函数之前按下的最后一个值,这意味着 13 实际上被设置为 target,并且按右键实际上是在增加 player2 的分数。

我的代码如下,到目前为止我已经花了 8 个小时,但我完全是 Arduino 新手,没有运气。

        // Squash Scorer, by @MrWigster
        // Squash scoring is fairly easy for the most part, however at 10-10 the first player to have reached 10 must decide whether to play until 13 or 15, as the winner must always have a 2 point lead.
        // For this reason we need to include logic to let the players choose what score to play until.
        #include <LiquidCrystal.h>
        LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
        //Setting up Switches, 1 for each player to press.
        const int switchPlayer1 = 7;
        const int switchPlayer2 = 6;
        //Setting up LEDs, 1 representing each player.
        const int led1 = 9;
        const int led2 = 10;
        //Players names
        String player1 = "Bob";
        String player2 = "Alex";
        //Sets up initial values for switches
        int switchStatePlayer1 = 0;
        int switchStatePlayer2 = 0;
        int prevSwitchState1 = 0;
        int prevSwitchState2 = 0;

        int p1score = 0;
        int p2score = 0;
        int winner;
        // Initial Target score to get to
        int target = 10;

        void setup() {
            lcd.begin(16,2);
            pinMode(switchPlayer1,INPUT);
            pinMode(switchPlayer2,INPUT);
            pinMode(led1,OUTPUT);
            pinMode(led2,OUTPUT);
            lcd.print(player1);
            lcd.print(" Vs ");
            lcd.print(player2);
            lcd.setCursor(0,1);
            lcd.print("SquashScorer 0.1");
        }

        void loop() {
            // If LED is still on, turn it off.
            if((digitalRead(led1) == HIGH) || (digitalRead(led2) == HIGH)){
                delay(200);
            digitalWrite(led1, LOW);
            digitalWrite(led2, LOW);
            }
            // If players scores are the same, and it's at the target score to change
            if ((p1score == p2score) && (p1score == target)){
                // Where we call the new target deciding function
                delay(50); // Trying to give time for button to reset???
                target = scoreDecide(); // Main code that isn't working
            }
            if ((target == 15) || (target == 13) || (target == 10)) {
                switchStatePlayer1 = digitalRead(switchPlayer1);
                if (switchStatePlayer1 != prevSwitchState1){
                    if(switchStatePlayer1 == HIGH){
                        digitalWrite(led1, HIGH);
                        p1score = p1score++;
                        //Deciding if this was winning point
                        if (
                                (p1score == target +1) || (p2score == target +1)
                                && (p1score != p2score)
                            ) {
                            winner = whoWins(player1);
                        }
                        // Writes the new score on the board
                        newScore();
                    }
                }
                prevSwitchState1 = switchStatePlayer1;

                switchStatePlayer2 = digitalRead(switchPlayer2);
                if (switchStatePlayer2 != prevSwitchState2){
                    if(switchStatePlayer2 == HIGH){
                        digitalWrite(led2, HIGH);
                        p2score = p2score++;
                        //Deciding if this was winning point
                        if (
                                (p1score == target +1) || (p2score == target +1)
                                && (p1score != p2score)
                            ) {
                            winner = whoWins(player2);
                        }
                        // Writes the new score on the board
                        newScore();
                    }
                }
                prevSwitchState2 = switchStatePlayer2;
            }
        }

        // Let the player(s) decide which score to go up to, either 13 or 15.
        int scoreDecide() { // This function doesn't seem to work, its already getting a value before the player gets to choose, based on whatever player last reached TARGET.
            lcd.clear();
            lcd.setCursor(0,0);
            // Give the players the info about which score they can choose
            lcd.print(target + 3);
            lcd.print("    OR    ");
            lcd.print(target + 5);
            switchStatePlayer1 = digitalRead(switchPlayer1);
            if (switchStatePlayer1 != prevSwitchState1){
                if(switchStatePlayer1 == LOW){
                    target = target + 3;
                    delay(1000);
                    return target;
                }
            }
            prevSwitchState1 = switchStatePlayer1;

            switchStatePlayer2 = digitalRead(switchPlayer2);
            if (switchStatePlayer2 != prevSwitchState2){
                if(switchStatePlayer2 == LOW){
                    target = target + 5;
                    delay(1000);
                    return target;
                }
            }
            prevSwitchState2 = switchStatePlayer2;

        }
        void newScore(){
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("Bob      Alex");
            lcd.setCursor(0,1);
            lcd.print(p1score);
            lcd.print(" Target:");
            lcd.print(target);
            lcd.print("  ");
            lcd.print(p2score);
        }
        void ledflash(){
            for (int i=0;i<5;i++){
                digitalWrite(led1, LOW);
                digitalWrite(led2, HIGH);
                delay(500);
                digitalWrite(led1, HIGH);
                digitalWrite(led2, LOW);
                delay(500);
            }
            digitalWrite(led1, LOW);
            digitalWrite(led2, LOW);
        }
        int whoWins(String player){
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print(player);
            lcd.setCursor(0,1);
            lcd.print("is the Winner!");
            ledflash();ledflash();
            delay(10000);
            p1score = 0;
            p2score = 0;
            target = 10;
        }

【问题讨论】:

    标签: c open-source arduino arduino-uno


    【解决方案1】:

    好吧,我设法解决了这个问题,方法是将逻辑划分为准备答案,然后等待答案的输入,如果有人感兴趣的话:

    // Squash Scorer, by @MrWigster
                // Squash scoring is fairly easy for the most part, however at 10-10 the first player to have reached 10 must decide whether to play until 13 or 15, as the winner must always have a 2 point lead.
                // For this reason we need to include logic to let the players choose what score to play until, always in either incremenets of 2 || 4. EG: 13 || 15, 17 || 19 etc.
    
                //To Do :
                // * Set/Games Counter
                // Function for score incrementing to help respect DRY coding
                #include <LiquidCrystal.h>
                LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
                //Setting up Switches, 1 for each player to press.
                const int player1switch = 7;
                const int player2switch = 6;
                //Setting up LEDs, 1 representing each player.
                const int led1 = 9;
                const int led2 = 10;
                //Players names
                String player1 = "Hraday";
                String player2 = "Alex";
                int switchStatePlayer1 = 0;
                int switchStatePlayer2 = 0;
                int targetChosen = 1;
                int decideTarget = 1;
                int p1score = 0;
                int p2score = 0;
                int winner;
                // Initial Target score to get to
                int target = 11;
    
                void setup() {
                    Serial.begin(9600);
                    lcd.begin(16,2);
                    pinMode(player1switch,INPUT);
                    pinMode(player2switch,INPUT);
                    pinMode(led1,OUTPUT);
                    pinMode(led2,OUTPUT);
                    lcd.print(player1);
                    lcd.print(" Vs ");
                    lcd.print(player2);
                    lcd.setCursor(0,1);
                    lcd.print("SquashScorer 0.1");
                }
    
                void loop() {
    
    
    
                    // If LED is still on, turn it off.
                    if((digitalRead(led1) == HIGH) || (digitalRead(led2) == HIGH)){
                        delay(200);
                    digitalWrite(led1, LOW);
                    digitalWrite(led2, LOW);
                    }
    
    
    
    
                    // If players scores are the same, and it's at the target score to change
                    if (targetChosen == 0){
                        lcd.clear();
                        lcd.setCursor(0,0);
                        // Give the players the info about which score they can choose
                        lcd.print(target + 2);
                        lcd.print("    OR    ");
                        lcd.print(target + 4);
                        targetChosen = 1;
                        decideTarget = 0;
                    }
                    // While new target score hasn't been decided, keep checking.
                    while(decideTarget == 0) {
                            newTarget();
                    }
                    if((targetChosen == 1) && (decideTarget == 1)) {
                        switchStatePlayer1 = digitalRead(player1switch);
                        if(switchStatePlayer1 == HIGH){
                            digitalWrite(led1, HIGH);
                            p1score = p1score++;
                            if ((p1score == target - 1) && (p2score == target - 1)) { targetChosen = 0; }
                            //Deciding if this was winning point
                            if ((p1score == target) || (p2score == target) && (p1score != p2score)) {
                                winner = whoWins(player1);
                            }
                            Serial.println("New Score__________");
                            Serial.println(p1score);
                            newScore();
                        }
                        switchStatePlayer2 = digitalRead(player2switch);
                        if(switchStatePlayer2 == HIGH){
                            digitalWrite(led2, HIGH);
                            p2score = p2score++;
                            if ((p1score == target - 1) && (p2score == target - 1)) { targetChosen = 0; }
                            //Deciding if this was winning point
                            if ((p1score == target) || (p2score == target) && (p1score != p2score)) {
                                winner = whoWins(player2);
                            }
                            Serial.println("New Score__________");
                            Serial.println(p2score);
                            newScore();
                        }
                    }
                }
                int newTarget(){
                    Serial.println(decideTarget);
                    Serial.println("Waiting for input...");
                    if(digitalRead(player1switch) == HIGH){
                        target = target + 2;
                        newScore();
                        decideTarget = 1;
                        delay(250);
                    }
                    if(digitalRead(player2switch) == HIGH){
                        target = target + 4;
                        newScore();
                        decideTarget = 1;
                        delay(250);
                    }
                }
                void newScore(){
                    lcd.clear();
                    lcd.setCursor(0,0);
                    lcd.print(player1);
                    lcd.print("      ");
                    lcd.print(player2);
                    lcd.setCursor(0,1);
                    lcd.print(p1score);
                    lcd.print(" Target:");
                    lcd.print(target);
                    lcd.print("  ");
                    lcd.print(p2score);
                    Serial.println("NewScore() Called");
                }
                void ledflash(){
                    for (int i=0;i<4;i++){
                        digitalWrite(led1, LOW);
                        digitalWrite(led2, HIGH);
                        delay(500);
                        digitalWrite(led1, HIGH);
                        digitalWrite(led2, LOW);
                        delay(500);
                    }
                    digitalWrite(led1, LOW);
                    digitalWrite(led2, LOW);
                }
                int whoWins(String player){
                    lcd.clear();
                    lcd.setCursor(0,0);
                    lcd.print(player);
                    lcd.setCursor(0,1);
                    lcd.print("is the Winner!");
                    ledflash();
                    delay(3000);
                    p1score = 0;
                    p2score = 0;
                    target = 10;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多