c - 使用毫();按下按钮后延迟

标签 c arduino

我正在 Arduino 上进行 C 语言编程,而且我还是一个初学者。我这个程序的目标是在 LED 上显示二进制数,然后让玩家猜测该二进制数。然后,玩家按下等于显示器二进制数的十进制值的按钮。当玩家开始按下按钮时,每次按下按钮都会有两秒钟的时间。如果他们在那两秒内没有再次点击,他们就会输,或者他们猜对了数字并获胜。

我的困惑程序唯一没有做的就是每次按下按钮时都会给出两秒的时间。即使在广泛阅读之后,我对 milli(); 也感到困惑。除了糟糕的编码之外,我是否可以更改程序中的某些内容,以便在按下按钮时为玩家提供两秒的窗口?我确信我忽略了一个微小的细节。感谢您抽出时间。

const int buttonPin = 2;     
const int ledPinValue1 =  3;     
const int ledPinValue2 =  4;      
const int ledPinValue4 =  5;     
const int ledPinValue8 =  6;  

int teller = 0;
int buttonStatus = 0;
int lastButtonStatus;

unsigned long interval=5000;    // the time we need to wait
unsigned long previousMillis = 0; // millis() returns an unsigned long.
unsigned long currentMillis = 0;
unsigned long elapsed;
unsigned long midElapsed;

unsigned long minus=5000;

int secondLoop = 0;

boolean allowTimer = false;
boolean allowMilliAfterFirstRound; //without this, when the second loop commences milli = milli - milli


void setup() {
    Serial.begin(9600);

    pinMode(ledPinValue1, OUTPUT);
    pinMode(ledPinValue2, OUTPUT);
    pinMode(ledPinValue4, OUTPUT);
    pinMode(ledPinValue8, OUTPUT);
    pinMode(buttonPin, INPUT);
}

void loop() {
    boolean initiateLoss = true; // ++++
    int randomNumber = 5; //Replace with randomcode
    currentMillis = millis();

    knopStatus = digitalRead(buttonPin);

    if (randomNumber == 1 || randomNumber == 3 || randomNumber == 5 || randomNumber == 7 || randomNumber == 9 || randomNumber == 11 || randomNumber == 13 || randomNumber == 15){
        digitalWrite(ledPinValue1, HIGH);
    }
    else {
        digitalWrite(ledPinValue1, LOW);
    }
    if (randomNumber == 2 || randomNumber == 3 || randomNumber == 6 || randomNumber == 7 || randomNumber == 10 || randomNumber == 11 || randomNumber == 14 || randomNumber == 15){
        digitalWrite(ledPinValue2, HIGH);
    }
    else {
        digitalWrite(ledPinValue2, LOW);
    } 
    if (randomNumber == 4 || randomNumber == 5 || randomNumber == 6 || randomNumber == 7 || randomNumber == 12 || randomNumber == 13 || randomNumber == 14 || randomNumber == 15){
        digitalWrite(ledPinValue4, HIGH);
    }
    else {  
        digitalWrite(ledPinValue4, LOW);
    } 
    if (randomNumber == 8 || randomNumber == 9 || randomNumber == 10 || randomNumber == 11 || randomNumber == 12 || randomNumber == 13 || randomNumber == 14 || randomNumber == 15){
        digitalWrite(ledPinValue8, HIGH);
    }
    else {
        digitalWrite(ledPinValue8, LOW);
    }

    //------------------------------------------------------------------------------------

    if (knopStatus != lastButtonStatus) {

        if (knopStatus == HIGH) {
            teller++;
            Serial.print("number of button pushes:  ");
            Serial.println(teller, DEC);
            allowTimer = true;


        }    
        delay(50);
    }

    //------------------

    if (allowTimer == true){        


        if (allowMilliAfterFirstRound == true) {
            currentMillis = currentMillis - currentMillis;
            allowMilliAfterFirstRound = false;
        }

        if (teller == randomNumber){ // WIN
            Serial.print("You won!");
            Serial.println();
            initiateLoss = false;
            randomNumber = 3; // remove when randomnumber is added
            teller = 0;
            previousMillis = millis();
        }  

        if ((unsigned long)(currentMillis - previousMillis) > interval && initiateLoss == true) {  // LOST!
            elapsed = currentMillis - previousMillis; 
            Serial.print("Time elapsed at time of failure: ");                             
            Serial.print(elapsed);
            Serial.println();
            Serial.print("currentMillis is now: ");
            Serial.print(currentMillis); // 5000, 10000, 15000, 20000 etc
            Serial.println();
            Serial.print("previousMillis is now: ");
            Serial.print(previousMillis); // 5000, 10000, 15000, 20000 etc
            Serial.println();
            previousMillis = millis();

            Serial.println();
            Serial.print("You lost!");
            Serial.println();
            Serial.print("Begin!");
            Serial.println();
            teller = 0;

        }
    }
    lastButtonStatus = knopStatus;  // save the current state as the last state, for next time through the loop 
}

最佳答案

我会做这样的事情:

void loop() {

if (not yet displayed) {
[all the code to display the number on leds]
}

if (button pressed) { 
allowTimer = true;  // Start!
}

if (allowTimer) /* If timer started */ {
   while (millis() - previousMillis <= 2000) /* The famous 2 sec */ {

      if (button pressed) {
      previousMillis = millis(); /* Update timing */
      teller++;
      }
   }
   if(teller == randomNumber) {
   [Hooray, you won or whatever message and stuff you like]
   }
   else {
   [Sorry, you lost]
   }

}

当然,你应该用你的代码替换我的著作。

提示:对于任何语句中的单个指令,您不需要括号:

if (condition) {
onlyOneInstruction;
}

相同
if (condition) onlyOneInstruction;

编辑:此外,您尝试将 knopStatus (未声明,也许您的意思是 buttonStatus)与 lastButtonStatus 进行比较,后者未初始化。这会给你一个错误。

关于c - 使用毫();按下按钮后延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579873/

相关文章:

javascript - onmousedown 是什么意思?

c - 在 C 中的 while 循环中发布增量

C - 将结构地址作为函数参数传递

opencv - 如何使用相机在 3D 空间中定位对象

arduino - 如何从串行监视器读取字符数组并相应地命令arduino?

python - 如何在 C 和 Python 中从字节中提取 LSB?

c - 如何调用 lstat(2) 而不是 lstat(3)?

c - 从不同地方调用相同功能时的行为不一致

c - 关于在 C 中使用数组作为指针的问题

CRC16生成和校验