2016-01-03 4 views
0

Я программирую C на Arduino, и я очень начинаю. Моя цель с этой программой - отобразить двоичный номер на светодиодах, а затем позволить игроку угадать двоичный номер. Затем игрок нажимает кнопку, равную десятичному значению двоичного номера дисплея. Когда игроки начинают нажимать кнопку, они получают две секунды для каждого нажатия. Если они не нажимают снова за эти две секунды, они проигрывают, или они угадывают правильную сумму и выигрывают.Использование milli(); для задержки после нажатия кнопки

Единственное, что моя грязная программа не делает, это дать два вторых периода, нажатие каждой кнопки. Даже после обширного чтения я смущен на 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 
} 

ответ

0

Я хотел бы сделать что-то вроде этого:

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; 

EDIT: Кроме того, вы пытаетесь сравнить knopStatus (необъявленная, возможно, вы имели в виду buttonStatus) с lastButtonStatus, который не инициализирован. Это дает вам ошибку.

0

Там же ошибки, например:

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

И allowMilliAfterFirstRound не инициализирована, она не назначена elswhere ...

В целом, код показывает, что вы понимаете millis правильно. Что отсутствует, так это управление 2-состояниями, программа может быть:

  1. номер дисплея, а затем ждет ответа игрока: время счета до тайм-аута
  2. Отображение выигрыша/потерянное сообщение, просто ждет кнопки нажмите, чтобы начать другую догадку (?)

previousMillis должен быть инициализирован при переходе из состояния 2 в 1.

Смежные вопросы